テック技報最新号へ →
セキュリティ

整形・難読化解除した JavaScript を「元のコードと同じ」と信じない(divergence)

JavaScript を整形・圧縮・難読化解除するツールの不具合を突き、変換後に元とは別の処理になるコードを作る手口「divergence」が公表された。不審なスクリプトを解析するときは、変換後のコードだけで判断せず、元のコードの実行時の挙動と照らし合わせる。

@MalwareBibleJP · 2026-10-24
#javascript#malware-analysis#deobfuscation#devtools#ai-agent#web

何が問題か

  • Chromium・Firefox の開発者ツールを含む 37 種類以上のツールで、186 通りの手法が示された。変換後のコードもエラーなく動くので、変わったことに気づきにくい。
  • 例:Chromium の開発者ツールの整形で + +m が ++m になり、値を増やす処理に変わる。空白の扱いだけで結果が変わる。
  • 影響は値や分岐の変更から、処理の一部や関数全体の削除まで 6 種類。難読化解除ツールが分岐を誤って消す例や、Terser が例外を出す処理を不要と判断して消す例がある。
  • astring、swc、esbuild などのライブラリーの不具合は、それを使うツールにも波及する。同じツールでもモードや設定で成立条件が変わる。
  • デモでは、テトリスのコードが整形後にスネークゲームになる。人だけでなく、整形済みコードを読む AI エージェントも誤った解析をする。

解析するときの対策

  1. 変換前の元コードを証拠として残し、判断の根拠にする。 整形後のコードは読むための補助と割り切る。
  2. 実行時の挙動で確かめる。 隔離した環境(使い捨てのブラウザープロファイル、外部通信を止めたサンドボックス)で元のコードを動かし、通信先・DOM 変更・ストレージ操作を記録して、整形後のコードから読んだ内容と一致するか確認する。
  3. 複数のツールで変換して差分を見る。 異なるツールで整形・難読化解除した結果が食い違う箇所は、意図的な仕込みを疑う。
  4. AI エージェントに解析させるときも同じ。 整形済みコードだけを渡さず、元コードと動的解析の記録を渡し、「コードで確認できたこと」と「推測」を分けて報告させる。
  5. ビルドに使う圧縮・変換ツール(Terser、esbuild、swc など)は更新しておく。自社コードでも、変換で例外処理が消えるなど挙動が変わり得る。

出典

X の元の投稿を開く