整形・難読化解除した JavaScript を「元のコードと同じ」と信じない(divergence)
JavaScript を整形・圧縮・難読化解除するツールの不具合を突き、変換後に元とは別の処理になるコードを作る手口「divergence」が公表された。不審なスクリプトを解析するときは、変換後のコードだけで判断せず、元のコードの実行時の挙動と照らし合わせる。
何が問題か
- Chromium・Firefox の開発者ツールを含む 37 種類以上のツールで、186 通りの手法が示された。変換後のコードもエラーなく動くので、変わったことに気づきにくい。
- 例:Chromium の開発者ツールの整形で
+ +mが++mになり、値を増やす処理に変わる。空白の扱いだけで結果が変わる。 - 影響は値や分岐の変更から、処理の一部や関数全体の削除まで 6 種類。難読化解除ツールが分岐を誤って消す例や、Terser が例外を出す処理を不要と判断して消す例がある。
- astring、swc、esbuild などのライブラリーの不具合は、それを使うツールにも波及する。同じツールでもモードや設定で成立条件が変わる。
- デモでは、テトリスのコードが整形後にスネークゲームになる。人だけでなく、整形済みコードを読む AI エージェントも誤った解析をする。
解析するときの対策
- 変換前の元コードを証拠として残し、判断の根拠にする。 整形後のコードは読むための補助と割り切る。
- 実行時の挙動で確かめる。 隔離した環境(使い捨てのブラウザープロファイル、外部通信を止めたサンドボックス)で元のコードを動かし、通信先・DOM 変更・ストレージ操作を記録して、整形後のコードから読んだ内容と一致するか確認する。
- 複数のツールで変換して差分を見る。 異なるツールで整形・難読化解除した結果が食い違う箇所は、意図的な仕込みを疑う。
- AI エージェントに解析させるときも同じ。 整形済みコードだけを渡さず、元コードと動的解析の記録を渡し、「コードで確認できたこと」と「推測」を分けて報告させる。
- ビルドに使う圧縮・変換ツール(Terser、esbuild、swc など)は更新しておく。自社コードでも、変換で例外処理が消えるなど挙動が変わり得る。
出典
- @MalwareBibleJP · 2026-10-22
- TrustSig「JavaScript divergence」: trustsig.eu