
2025/12/05 9:03
Trick users and bypass warnings – Modern SVG Clickjacking attacks
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
本論文は、すべてのSVG
<fe*> フィルタプリミティブをチェーン化することでチューリング完全なツールセットを構築できることを示し、高度なクリックジャッキングやクロスオリジンデータ外部流出攻撃を可能にします。
- 著者はまず、
とfeColorMatrix
を用いて CSS/SVG で Apple の Liquid Glass 効果を再現し、クロスオリジン iframe 上でも動作することを証明しました。feDisplacementMap - プリミティブ(切り取り・タイル化・算術合成・カラー行列変換・ガウシアンぼかし)を組み合わせて、外国オリジンから画像データを読み取るピクセル読取回路を構築しました。
とfeBlend
を用いて NOT, AND, OR, XOR, NAND, NOR, XNOR の論理ゲートを実装し、SVG フィルタ内で任意のブール演算が可能になりました。feComposite- これらのゲートを利用して、ダイアログ表示状態・読み込み状態・チェックボックス状態・赤文字検出に応じて画像を条件付きで表示するマルチステップクリックジャッキングシナリオ(「Securify」)を構築しました。
- この手法は Google Docs に適用され、攻撃者が「Generate Document」→ CAPTCHA 入力 → 提案選択 → ボタン押下 → 読み込み画面という一連の操作を SVG フィルタ内で自動化します。
- SVG フィルタ内(
と Reed–Solomon エラー訂正表を使用)に QR コードジェネレータを構築し、生成されたコードは外部流出データをエンコードしており、ユーザーにスキャンさせて攻撃者のサーバへ送信されます。feDisplacementMap
クリックハイジャックや SVG フィルタタイミング攻撃に関する既存研究では、マルチステップロジックとクロスオリジンデータ読取を組み合わせたものはなく、本論文は新規かつ自動化された攻撃ベクターを提示しています。
調査結果は、攻撃者が他のウェブサービスに対して同様のシーケンスを自動化し、マルウェアやフィッシングキャンペーンに埋め込む可能性があることを示唆しています。ユーザーは意図しないクリックとデータ漏洩のリスクにさらされ、サードパーティ iframe を組み込む企業は侵害リスクが高まります。本研究は、ウェブエコシステム全体で SVG フィルタ使用時のオリジン境界保護を強化する必要性を訴えています。
本文
クリックジャッキングは、別サイトの iframe を覆い隠してユーザーに意図せず操作させる古典的な攻撃手法です。
単純なアクション(例:ボタンを押す)にはうまく機能しますが、より複雑なインタラクションになると現実離れします。
そこで私は「SVG クリックジャッキング」という新しい技術に出会いました。この手法は従来のクリックジャッキングを逆転させ、複雑で対話的な攻撃や複数形態のデータ外部化を可能にします。
Liquid SVG
Apple が新しい Liquid Glass デザインを発表したとき、Web ではその効果について多数の記事が流れました。
私は Canvas やシェーダーを使わずに同じエフェクトを Web 上で再現できないか試してみました。1 時間で CSS/SVG だけの再現版を作り、十分に正確に見えるようになりました。
デモでは右下の円形コントロール(Chrome/Firefox デスクトップと Chrome モバイル)でエフェクトをドラッグできます。Safari では動きません。
このデモは注目され、あるニュース記事にも「サムスンや他社は彼女に追いつけない」という驚くべき引用付きで掲載されました。
そこで私は SVG エフェクトが iframe 上に適用できるか尋ねてみました。意外と可能でした。
Liquid Glass 効果は
feColorMatrix と feDisplacementMap を使っており、クロスオリジンのドキュメントでも動作します。
これをきっかけに、iframe 上で機能する他のフィルタも探求し、多彩な可能性を発見しました。
基本構成要素
各
<fe*> 要素は 1 つまたは複数の入力画像を受け取り操作を行い、新しい画像を出力します。単一 SVG フィルタ内でチェーンさせ、前段階の出力を次のステップに参照できます。
便利な基本要素は以下です:
– 外部画像ファイルを読み込む<feImage>
– 単色矩形を描画<feFlood>
– ピクセルをシフト<feOffset>
– マップに従ってピクセルを移動<feDisplacementMap>
– ぼかし<feGaussianBlur>
– タイルまたはクロップ<feTile>
– 消失/膨張<feMorphology>
– モードで二入力をブレンド<feBlend>
– 合成、算術演算<feComposite>
– 色行列(チャンネル操作、アルファ/ルミナンス変換)<feColorMatrix>
これらは多くのグラフィックタスクの基礎ブロックであり、強力なプリミティブへ組み合わせることができます。
攻撃例
1. フェイク CAPTCHA
feDisplacementMap を使うとテキストを歪めて CAPTCHA のように見せ、ユーザーに機密情報を再入力させることが可能です。
<iframe src="..." style="filter:url(#captchaFilter)"></iframe> <svg width="768" height="768" viewBox="0 0 768 768"> <filter id="captchaFilter"> <feTurbulence type="turbulence" baseFrequency="0.03" numOctaves="4" result="turbulence"/> <feDisplacementMap in="SourceGraphic" in2="turbulence" scale="6" xChannelSelector="R" yChannelSelector="G"/> </filter> </svg>
2. グレー文字の隠蔽
ユーザーが入力を確認できるようにしつつ、プレースホルダーやエラーテキストを隠すには
feComposite, feTile, feMorphology, feFlood, feBlend, feColorMatrix を組み合わせます。
簡易例(省略):
<filter> <feComposite operator="arithmetic" k1="0" k2="4"/> <feTile x="20" y="56" width="184" height="22"/> <feMorphology operator="erode" radius="3" result="thick"/> <feFlood flood-color="#FFF" result="white"/> <feBlend mode="difference" in="thick" in2="white"/> <feComposite operator="arithmetic" k2="100"/> <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0"/> <feComposite in="SourceGraphic" operator="in"/> <feBlend in2="white"/> </filter>
3. ピクセルの読み取り
JavaScript にピクセルデータを渡すことはできませんが、フィルタチェーン内でピクセルを読んでマスクやトリガーに利用できます。
単純な黒ピクセル検出例:
<feTile x="50" y="50" width="4" height="4"/> <feTile x="0" y="0" width="100%" height="100%"/> <feComposite operator="arithmetic" k2="100"/> <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0"/>
4. 論理ゲート
feBlend(difference)と feComposite(arithmetic)を使えば、真偽演算子を実装できます。
| ゲート | SVG スニペット |
|---|---|
| NOT | |
| AND | |
| OR | |
| XOR | |
これらを組み合わせれば、SVG フィルタだけで任意の論理回路(例:フルアダー)を構築できます。
実用攻撃:「Securify」
対象は「ユーザーがハッキングされたとマークするまで複数ステップ」を必要とするページです。
- ダイアログ表示検出 (
) – ピクセルを切り取り比較D - ダイアログ読み込み確認 (
) – ボタンの有無L - チェックボックス状態確認 (
) – 色比較C - 赤文字検出 (
) – 形態学+ピクセルチェックR
論理ツリー:
¬D ∧ ¬R → show button1 D ∧ ¬L → show loading D ∧ L ∧ ¬C → show checkbox D ∧ L ∧ C → show button2 ¬D ∧ R → show end screen
これらの条件を SVG フィルタでエンコードし、ターゲット iframe 上に適切な攻撃画像を重ねることで、説得力あるマルチステップクリックジャッキング体験を実現します。
高度な応用
- QR コード生成 –
でビット列を配置し、事前計算した誤り訂正データを加えることで SVG フィルタだけでスキャン可能な QR コードを描画できます。feDisplacementMap - ブラウザ内リアルタイムロジック – ピクセル読み取り・条件判定・ビジュアル更新を JavaScript や CSP を回避して実行。
結論
SVG フィルタは単なる視覚効果だけではありません。レンダリングエンジン内で動作する、実質的にチューリング完全な言語です。この機能を悪用すれば:
- マルチステップクリックジャッキング
- UI 要素の隠蔽
- クロスオリジン iframe からピクセル読み取り
- QR コードの即時生成
などが可能になり、Web ページの攻撃面を大幅に拡張します。見た目は無害な SVG フィルタですが、その裏側で行われる操作は非常に強力かつ危険です。