説明
ハードコードされた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()を提供する必要があります。