ハードコードされたエンコード済みデータの実行

ハードコードされたエンコード済みデータの実行

説明

ハードコードされたhexやbase64の文字列をデコードし、その結果を require、eval、Function に渡すと、悪意のあるモジュールの読み込みやコード実行を隠す手段になり得ます。難読化された定数は実際の動作を確認しにくくします。ただし、エンコードされているだけで悪意があるとは判断できないため、デコード後の内容と実行目的を確認する必要があります。

想定される影響

  • 悪意のあるモジュールの隠れた読み込みや任意のコード実行
  • 実行コードやモジュールパスを把握しにくいことによる、悪意のある変更の配布
  • 隠された処理による権限の悪用、情報漏えい、追加ペイロードのダウンロード

対処方法

  • 動的にデコードした文字列をコードやモジュールパスとして解釈しないでください。
  • 必要なモジュールパスは読める形で記述し、静的な import または require を使用してください。
  • 難読化に正当な理由がある場合は、コードの所有者、生成手順、完全性の検証方法を文書化してください。

例

変更前

javascript
const hiddenPath = Buffer.from("2e2f706c7567696e", "hex").toString();
const plugin = require(hiddenPath);

eval(atob("Y29uc29sZS5sb2coJ3J1bicp"));

変更後

javascript
const plugin = require("./plugin");

function runTask() {
  return plugin.run();
}

解説:

  • 変更前: エンコードされた定数を実行時にデコードしてモジュールパスやコードとして使うため、実際の動作を隠せます。
  • 変更後: モジュールパスと実行の流れを明示し、確認できるようにしています。実装を省略した ./plugin は信頼できるモジュールであり、run() を提供する必要があります。

参考資料