高度な攻撃者は常に手法を進化させ、無害に見えるページの上に悪質なリンクを含む透明なレイヤーを重ねる場合があります。この攻撃手法、すなわちクリックジャッキングは、ウェブカメラの起動や口座からの資金移動などを引き起こす可能性があります。
本記事では、クリックジャッキング攻撃の各種手法を解説し、Wallarmが推奨する最適な防御策について紹介します。
クリックジャッキングは、攻撃者が信頼できるサイトだと認識されるページ上のリンクをタップさせる攻撃手法です。ただし、被害者は気づかず、実際には危険な悪質サイトを覆い隠す形となります。
場合によっては、タップ自体は一見無害に見えることがあります。例えば、攻撃者が広告主に偽装し、Facebookページで「いいね」を集める投稿を行う、いわゆるライクジャッキングがその例です。そのタップが、マルウェアの不正ダウンロードを引き起こしたり、JavaScriptコードを作動させてウェブカメラを起動、パスワードの取得、キーストロークの記録など、より危険な動作につながることがあります。
カーソルジャッキングは、クリックジャッキングの別の手法です。この攻撃では、攻撃者がカスタムカーソルを追加し、被害者を混乱させることで、本来クリックすべきでない箇所をタップさせます。また、場合によっては、ユーザーが通常利用している入力フォームにユーザー名、パスワード、クレジットカード番号などの個人情報を入力させ、その情報が悪質なサイトに送信されることもあります。
クリックジャッキングという用語は、2008年に Jeremiah Grossman と Robert Hansen によって提唱されました。
一見、攻撃者が画面の一部を再利用して、偽のページと本物のページを入れ替える単なる詐欺のように見えるかもしれません。しかし、実際の攻撃はもっと巧妙です。クリックジャッキングでは、被害者が訪れるサイトは本来信頼できるサイトですが、その上に攻撃者が不明瞭なオーバーレイを追加しています。このオーバーレイは、カスタムスタイルシート(CSS)やiframeなどの各種HTML技術を用いて、他のサイトのコンテンツを取り込むことで実現されます。
クリックジャッキング攻撃には、基本的な手法が2~3種類存在します。しかし、ウェブの開放性と技術(Web技術やCSS)の進化により、攻撃手法は非常に複雑化しています。
最も一般的な手法の一つで、本物のページを悪質なページの上に重ねます。正規のページは透明なiframeとして埋め込まれ、ユーザーは下に存在する攻撃用ページに気づきません。
これは様々な手法を含みますが、先述のカーソルジャッキングはその一例です。攻撃者は1x1ピクセル程度の小さなiframeを、マウスカーソルの下に配置し、すべてのタップを悪質なページに誘導します。
実装がより難しい手法で、悪質なページの特定の要素のみを正規のページに重ねます。攻撃者は、本来のリンクを他のリンクに置き換えたり、ページのコンテンツを別の表現に変えて被害者を惑わせたりします。
こちらは、ユーザーにとって明白な攻撃手法です。攻撃者はCSSのpointer-eventsプロパティをnoneに設定して、ページ上でクリックが機能しないようにします。しかし、下層の悪質なページにはクリックが届くため、異常が発生しても気づかれにくくなります。リンクやボタンが反応しない場合は、サイト管理者に連絡する必要があります。
高度なユーザー体験を狙う攻撃者は、高速コンテンツ置換という手法を用いることがあります。この手法では、オーバーレイが一瞬現れタップを登録すると、即座に除去されます。そのため、ユーザーは有害なリンクをクリックしていることに気づかない場合があります。
オーバーレイを挿入する以外にも、攻撃者がユーザーを欺く方法は存在します。
この手法では、攻撃者が正規のフォームやポップアップを画面外に表示させ、その上に悪質なページを配置します。見た目は無害なウィジェットとして表示されますが、ユーザー側のポップアップブロッカーなどが作動する場合もあり、攻撃者はそれを回避する工夫が必要です。(偽広告ブロッカー対策も一種の攻撃手法です。)
ユーザーに追加の操作を強いるクリックジャッキング手法です。ユーザーがファイルをドラッグ&ドロップしたり、他の操作を行った結果、入力情報が下層の悪質なページを通じて攻撃者に送信されます。
ウェブの動的かつ創造的な性質により、新たなJavaScript技術とともに、クリックジャッキング攻撃は今後も発生し続けるでしょう。ユーザーは、普段利用している正規の要素上で不正な操作をさせられる可能性があるため、クリックイベントは迅速に検知し対処する必要があります。
これは、高速コンテンツ置換の一種で、攻撃者がユーザーの注意が他に向いている間に、信頼できるUI要素を素早く移動させる手法です。その結果、ユーザーは本来意図していた操作ではなく、移動された要素をクリックしてしまいます。通常、このような変化はユーザーにとって明らかであり、異常があった場合はサイト管理者やセキュリティ担当へ報告する必要があります。
CSRFとクリックジャッキングの脆弱性は多くの類似点を持つため、一見同じように思えるかもしれません。どちらもターゲットを偽のサイトやページに誘導し、金銭やデータを不正に奪う狙いがありますが、実際の手法は大きく異なります。
大きな違いは、攻撃における実行者にあります。
CSRFではブラウザが自動的に操作を実行しますが、クリックジャッキングではエンドユーザーに操作をさせることで攻撃が成立します。被害者は直接悪質なサイトと接触し、攻撃者はその結果を待つだけです。
クリックジャッキング攻撃では、CSSを用いてレイヤーを作成・制御します。攻撃者は、iframeレイヤーとしてターゲットサイトを悪質なサイトの上に表示させます。以下は、styleタグと境界設定を用いた例です:
<head>
<style>
#target_website {
position:relative;
width:128px;
height:128px;
opacity:0.00001;
z-index:2;
}
#decoy_website {
position:absolute;
width:300px;
height:400px;
z-index:1;
}
</style>
</head>
<body>
<div id="decoy_website">
...bait web content here...
</div>
<iframe id="target_website" src="https://defenseless website.com"></iframe>
</body>
ターゲットサイトのiframeは、正規のページを悪質なサイトで覆い隠すように、適切な幅・高さ・位置に設定されています。
絶対配置や相対配置を用い、画面サイズやブラウザ、状態にかかわらずターゲットサイトが偽のページを完全に覆うようにします。z-indexはiframeとその他のレイヤーの積み重ね順を決定し、opacityは0.0(またはそれに近い値)に設定され、iframeの内容がユーザーに表示されるようになっています。
ブラウザによるクリックジャッキング防御として、iframeの透明度を制限する仕組みが導入される場合があります(例:Chromeのバージョン76では実装されていますが、Firefoxでは対応していません)。攻撃者は、セキュリティ対策を発動させないように、適切なopacity値を選択しています。
様々なハッカーがターゲットを騙すために用いる一般的な手法であるクリックジャッキングは、単独でも大規模な攻撃の一部としても利用され、いずれの場合も被害者を巧みに騙すことに成功しています。実際、過去にもいくつかの攻撃で使用されました。
Wallarmでは、実際に話題となったクリックジャッキングの有名な例を紹介します。
PayPalの送金サービスには、クリックジャッキング攻撃に利用されかねない脆弱性が確認され、2022年にセキュリティ研究者によって発見されました。不正な人物に悪用されると、ユーザーから資金を巧みに騙し取り、第三者の口座へ送金させる恐れがあります。
熟練のハッカーにとって、この脆弱性を利用するのは容易で、iframeに悪意のあるエンドポイントを挿入するだけで、任意の送金先に資金を誘導できます。
さらに、この脆弱性は、PayPal口座を第三者送金サービスとして利用している全プラットフォームで送金のリダイレクトが可能であることが判明し、エンドユーザーにとって深刻なセキュリティ問題となりました。
Sypengは非常に悪名高いマルウェアで、2013年に誕生したものの、2017年に急速に拡散し、いくつかのクリックジャッキング攻撃を引き起こすなど大きな問題となりました。このマルウェアは銀行関連のデータを狙うよう設計され、Androidデバイスに対応し、未認証のアプリを介して拡散されました。
AndroidユーザーがPlayストアからそのようなアプリをダウンロードすると、マルウェアが作動し、ターゲットのデータをクリックジャッキング攻撃で奪いました。しかし、これだけでなく、場合によっては管理者権限まで侵入し、特権を悪用するケースも見受けられました。
管理者権限に到達すると、マルウェアはオーバーレイ画面の制御、SMSの自動送信、連絡先の取得、さらにはランダムな通話まで行いました。また、操作のスクリーンショットを撮影し、自動的に攻撃者へ送信するほど、技術的に高度なものでした。
この攻撃では、マルウェアはコマンド&コントロールサーバーの助けを借り、そのサーバーは攻撃者の管理下に置かれていました。銀行関連のデータのみが狙われていたものの、SMSにもアクセスできたため、銀行関連のOTP情報漏洩のリスクもありました。
このマルウェアは非常に強力で、わずか1週間で23か国以上に拡散し、まさにウイルスのように広がりました。
2018年12月、セキュリティ専門家が、許可なく他者のウォールに投稿が行われた事例を発見しました。
詐欺の手口では、被害者にコミックサイトのリンクをクリックさせ、年齢確認を行わせるものでした。確認が完了すると、そのコミックサイトの投稿が可能になり、同時に被害者のウォールに思わぬ投稿がされるという問題が発生しました。このバグの原因は、モバイルのFacebookユーザーがログインする際、XFOレスポンスヘッダーが設定されていなかったことにあります。
興味深いことに、Facebookのバグバウンティチームはこの脆弱性をプライバシーあるいはセキュリティ上の脅威と見なさなかったため、問題が依然として残っている可能性があります。
Facebookを利用される場合は、不審なリンクはクリックせず、正規に見えるリンクであっても、事前にリンクをコピーして検証することが望ましいです。
幸い、ウェブサイト側でユーザーや訪問者、その他の資産をクリックジャッキング攻撃から守るための対策がいくつか存在します。これらの対策は、通常、ウェブ開発担当者によって実施され、一定のコーディングやウェブに関する知識が必要です。
ウェブページのコンテンツが他のページのHTMLコンテナ内に埋め込まれるのを防ぐため、コンテンツセキュリティポリシー(CSP)と呼ばれる仕組みが導入されます。CSPは、JavaScriptやCSSなど、特定のウェブ資源のみを許可することで、クリックジャッキング攻撃に対する主要な防御策として機能します。
X-Frame-Optionsと呼ばれる仕組みは、ブラウザがページをフレームや埋め込み、オブジェクトとして表示するかどうかを示すレスポンスヘッダーに依存します。これにより、サイト所有者はiframeやobjectの利用を制御できます。なお、X-FrameはInternet Explorer 8向けに初めて導入されたため、すべてのブラウザで確実に機能するとは限らない点に注意が必要です。
CSPとX-Frame-Optionsを併用することで、クリックジャッキング攻撃に対する堅固な防御策となります。
Framekiller(framebusterまたはframebreakerとも呼ばれる)は、ウェブページがフレーム内に埋め込まれるのを防ぐJavaScriptコードです。現在のウィンドウがトップウィンドウかどうかを確認し、そうでない場合はページの表示を停止します。
コンテンツセキュリティポリシー (CSP) は、XSS やクリックジャッキングなどの攻撃から守るための標準的な仕組みで、ウェブ開発者がアプリのレスポンスヘッダーとして実装します。ここで、ポリシーはセミコロンで区切られた指令文の列となり、指定したウェブ資源のみを許可することで不正な動作を防ぎます。推奨される対策として、アプリのCSP内にframe-ancestorsディレクティブを統合する方法があります。frame 'none' はX-Frame-Optionsのdeny指令に、frame 'self' は基本的にsameoriginに相当します。例えば、以下のように指定します:
Content-Security-Policy: frame-ancestors 'self';
もちろん、表示は特定のドメインに限定することもできます。たとえば:
Content-Security-Policy: frame-ancestors example.com;
また、自社および指定ドメインのみを許可する場合は:
Content-Security-Policy: frame-ancestors 'self' example.com;
クリックジャッキングやXSS対策として、CSPは慎重な管理、実装、テストが必要であり、多層防御システムの一部として利用されるべきです。
一部のウェブブラウザには、HTTPリクエスト発生時にスクリプト実行を防ぐ拡張機能があります。これにより、攻撃者のコードの実行を阻止できます。これはクライアント側の対策で、ユーザーはブラウザに拡張機能を導入し、可能であれば全デバイスに適用することが推奨されます。
フレームバスティングスクリプトは、ウェブページがフレーム内で動作するのを防ぐためのJavaScriptです。ページがフレームに埋め込まれた場合の挙動を定義でき、一般的な手法としては、トップウィンドウで悪質なページを再読み込みさせ、偽のサイトを悪質なiframeレイヤーの上に表示させる方法があります。
以下のJavaScriptコードでこの動作を実現できます:
<script>
if (top != window) {
top.location = window.location;
}
</script>
しかし、この対策は容易に回避される可能性があり、攻撃者は以下のコードで再読み込みを阻止することができます:
<script>
window.onbeforeunload = function() {
return 'bogus';
};
</script>
また、HTML5のiframe sandbox属性を利用してフレームバスティングを防ぐ方法もあります。以下は、その例です:
<iframe id="decoy_webpage" src="https://pantomime website.com" sandbox="allow-scripts award structures permit same-origin"> </iframe>
allow-top-navigationフラグをブロックすることで、偽のページを含むiframeが悪質なページ上に埋め込まれるのを防げます。この対策により、攻撃者はアプリにスクリプト実行やフォーム送信を許可させることができます。
なお、フレームバスティングスクリプトはクリックジャッキング攻撃に対する確実な防御策としては推奨されません。多くのブラウザがこれらのJavaScriptコードをブロックしており、容易に回避される可能性があるためです。
Standford Web Security Groupの評価でも、フレームバスティング手法のクリックジャッキングに対する脆弱性が指摘されています。
frame-ancestorsは、クリックジャッキングのリスクを軽減し、ターゲットを守る有効な手段です。CSP(コンテンツセキュリティポリシー)の一部として、iframeやobjectの埋め込みを制御し、クリックジャッキングやXSS攻撃を防ぐ役割を果たします。
これはHTTPレスポンスヘッダーを利用して、許可されるリソースを定める仕組みです。クリックジャッキング防止策として、CSPはX-Frame-Optionsの代替となる場合もありますが、すべてのブラウザで有効とは限らないため、使用中のブラウザが対応しているか確認する必要があります。
以下の手順に従い、frame-ancestorsディレクティブを追加してください。
対象ウェブサイトの設定ファイルを編集することで、frame-ancestorsディレクティブを容易に追加できます。以下の手順を実施してください。
Subscribe for the latest news