Formjackingの解説:チェックアウトページでカードデータが盗まれる仕組み
Formjackingにサーバー侵害は不要だ——侵害されたサードパーティスクリプトが一つあれば十分。完全な解剖と、実際に攻撃を止める方法を解説する。
Formjackingとは、注入されたJavaScriptによってHTMLフォームの送信をインターセプトし、その値を攻撃者のサーバーに転送する行為だ。従来の侵害と異なり、元のサーバーは多くの場合まったく手つかずのまま——コードは訪問者のブラウザ内で、入力されたデータに対して完全に実行される。
攻撃の連鎖はほぼ常に同じだ。攻撃者はサードパーティの依存関係——タグマネージャー、A/Bテストウィジェット、チャットスクリプト、npmパッケージ——を侵害し、チェックアウトまたはログインフォームのsubmitイベントにリスナーを追加する。送信時にスクリプトはフィールド(カード番号、CVV、メール、パスワード)を読み取り、正規の送信の前または同時に、新規登録ドメインへバックグラウンドでPOSTする。ユーザーは何も気づかない。
WAFが検出できない理由:リバースプロキシはあなたのoriginへのリクエストしか見ない。流出のPOSTは攻撃者のドメインへ向かうのであって、あなたへではない——つまりWAFを一切通過しない。ファイルのシグネチャスキャナーも見逃す。悪意のあるコードはあなたのファイル内にはなく、実行時に別のホストから読み込まれるスクリプト内にあるからだ。
ExploitShieldの検出方法:headlessブラウザが実行するすべてのフォーム送信は、MITM proxyを通じてネットワークレベルで捕捉される。宛先ホストはWHOIS年齢、RDAPデータ、IPレピュテーション、500以上のブロックリストで情報を付与される。数日しか経っていないドメインの新しい流出エンドポイントは、その最初の数時間のうちに、スクリプト・ファイル・行番号のイニシエーター情報とともにフラグが立てられる。
eコマースチームへの実践的教訓:チェックアウトページとログインページのすべてのサードパーティスクリプトをインベントリ化し、可能な限りSubresource Integrityを適用し、実ブラウザ実行時の送信先をモニタリングすること。顧客がカードデータを失う前にformjackingが可視化される唯一の場所はそこだ。