San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
San Antonio API Security Summit 2025 に参加しよう!
閉じる
プライバシー設定
ウェブサイト運営に必要なCookieや類似技術を使用しています。追加のCookieは貴社の同意がある場合のみ利用されます。同意は「Agree」をクリックすることでいただけます。どのデータが収集され、どのようにパートナーと共有されているかの詳細は、Cookieポリシープライバシーポリシーをご確認ください。
Cookieは、貴社デバイスの特性や、IPアドレス、閲覧履歴、位置情報、固有識別子などの特定の個人情報を取得、解析、保存するために使用されます。これらのデータは様々な目的で利用されます。分析Cookieによりパフォーマンスを評価し、オンライン体験やキャンペーンの効果向上に役立てます。パーソナライズCookieは、利用状況に応じた情報やサポートを通じ、貴社専用の体験を提供します。広告Cookieは、第三者が貴社のデータをもとにオーディエンスリストを作成し、ソーシャルメディアやネット上でのターゲット広告に使用します。貴社は各ページ下部のリンクから、いつでも同意の許可、拒否、または撤回が可能です。
ご送信ありがとうございます。内容を受け付けました。
申し訳ありません。フォーム送信時にエラーが発生しました。
/
/
Vulnerabilities

クリックジャッキングとは?

高度な攻撃者は常に手法を進化させ、無害に見えるページの上に悪質なリンクを含む透明なレイヤーを重ねる場合があります。この攻撃手法、すなわちクリックジャッキングは、ウェブカメラの起動や口座からの資金移動などを引き起こす可能性があります。

本記事では、クリックジャッキング攻撃の各種手法を解説し、Wallarmが推奨する最適な防御策について紹介します。

Author
クリックジャッキングとは?

クリックジャッキングとは何で、どのように動作するのか

クリックジャッキングは、攻撃者が信頼できるサイトだと認識されるページ上のリンクをタップさせる攻撃手法です。ただし、被害者は気づかず、実際には危険な悪質サイトを覆い隠す形となります。

場合によっては、タップ自体は一見無害に見えることがあります。例えば、攻撃者が広告主に偽装し、Facebookページで「いいね」を集める投稿を行う、いわゆるライクジャッキングがその例です。そのタップが、マルウェアの不正ダウンロードを引き起こしたり、JavaScriptコードを作動させてウェブカメラを起動、パスワードの取得、キーストロークの記録など、より危険な動作につながることがあります。

カーソルジャッキングは、クリックジャッキングの別の手法です。この攻撃では、攻撃者がカスタムカーソルを追加し、被害者を混乱させることで、本来クリックすべきでない箇所をタップさせます。また、場合によっては、ユーザーが通常利用している入力フォームにユーザー名、パスワード、クレジットカード番号などの個人情報を入力させ、その情報が悪質なサイトに送信されることもあります。

クリックジャッキングという用語は、2008年に Jeremiah Grossman と Robert Hansen によって提唱されました。

一見、攻撃者が画面の一部を再利用して、偽のページと本物のページを入れ替える単なる詐欺のように見えるかもしれません。しかし、実際の攻撃はもっと巧妙です。クリックジャッキングでは、被害者が訪れるサイトは本来信頼できるサイトですが、その上に攻撃者が不明瞭なオーバーレイを追加しています。このオーバーレイは、カスタムスタイルシート(CSS)やiframeなどの各種HTML技術を用いて、他のサイトのコンテンツを取り込むことで実現されます。

how clickjacking work

クリックジャッキングの種類

クリックジャッキング攻撃には、基本的な手法が2~3種類存在します。しかし、ウェブの開放性と技術(Web技術やCSS)の進化により、攻撃手法は非常に複雑化しています。

  • 完全な透明オーバーレイ

最も一般的な手法の一つで、本物のページを悪質なページの上に重ねます。正規のページは透明なiframeとして埋め込まれ、ユーザーは下に存在する攻撃用ページに気づきません。

  • 隠しオーバーレイ

これは様々な手法を含みますが、先述のカーソルジャッキングはその一例です。攻撃者は1x1ピクセル程度の小さなiframeを、マウスカーソルの下に配置し、すべてのタップを悪質なページに誘導します。

  • クロッピング

実装がより難しい手法で、悪質なページの特定の要素のみを正規のページに重ねます。攻撃者は、本来のリンクを他のリンクに置き換えたり、ページのコンテンツを別の表現に変えて被害者を惑わせたりします。

  • クリックイベントドロップ

こちらは、ユーザーにとって明白な攻撃手法です。攻撃者はCSSのpointer-eventsプロパティをnoneに設定して、ページ上でクリックが機能しないようにします。しかし、下層の悪質なページにはクリックが届くため、異常が発生しても気づかれにくくなります。リンクやボタンが反応しない場合は、サイト管理者に連絡する必要があります。

  • 高速コンテンツ置換

高度なユーザー体験を狙う攻撃者は、高速コンテンツ置換という手法を用いることがあります。この手法では、オーバーレイが一瞬現れタップを登録すると、即座に除去されます。そのため、ユーザーは有害なリンクをクリックしていることに気づかない場合があります。

オーバーレイを挿入する以外にも、攻撃者がユーザーを欺く方法は存在します。

  • スクロール

この手法では、攻撃者が正規のフォームやポップアップを画面外に表示させ、その上に悪質なページを配置します。見た目は無害なウィジェットとして表示されますが、ユーザー側のポップアップブロッカーなどが作動する場合もあり、攻撃者はそれを回避する工夫が必要です。(偽広告ブロッカー対策も一種の攻撃手法です。)

  • ドラッグ&ドロップ

ユーザーに追加の操作を強いるクリックジャッキング手法です。ユーザーがファイルをドラッグ&ドロップしたり、他の操作を行った結果、入力情報が下層の悪質なページを通じて攻撃者に送信されます。

ウェブの動的かつ創造的な性質により、新たなJavaScript技術とともに、クリックジャッキング攻撃は今後も発生し続けるでしょう。ユーザーは、普段利用している正規の要素上で不正な操作をさせられる可能性があるため、クリックイベントは迅速に検知し対処する必要があります。

  • 再配置

これは、高速コンテンツ置換の一種で、攻撃者がユーザーの注意が他に向いている間に、信頼できるUI要素を素早く移動させる手法です。その結果、ユーザーは本来意図していた操作ではなく、移動された要素をクリックしてしまいます。通常、このような変化はユーザーにとって明らかであり、異常があった場合はサイト管理者やセキュリティ担当へ報告する必要があります。

CSRFとの違い

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値を選択しています。

example of clickjacking

実際のクリックジャッキングの例

様々なハッカーがターゲットを騙すために用いる一般的な手法であるクリックジャッキングは、単独でも大規模な攻撃の一部としても利用され、いずれの場合も被害者を巧みに騙すことに成功しています。実際、過去にもいくつかの攻撃で使用されました。

Wallarmでは、実際に話題となったクリックジャッキングの有名な例を紹介します。

  1. 例 1 - Paypalでクリックジャッキングにつながる脆弱性が確認された

PayPalの送金サービスには、クリックジャッキング攻撃に利用されかねない脆弱性が確認され、2022年にセキュリティ研究者によって発見されました。不正な人物に悪用されると、ユーザーから資金を巧みに騙し取り、第三者の口座へ送金させる恐れがあります。

熟練のハッカーにとって、この脆弱性を利用するのは容易で、iframeに悪意のあるエンドポイントを挿入するだけで、任意の送金先に資金を誘導できます。

さらに、この脆弱性は、PayPal口座を第三者送金サービスとして利用している全プラットフォームで送金のリダイレクトが可能であることが判明し、エンドユーザーにとって深刻なセキュリティ問題となりました。

  1. 例 2 - Sypengマルウェアが大きな問題を引き起こしていた

Sypengは非常に悪名高いマルウェアで、2013年に誕生したものの、2017年に急速に拡散し、いくつかのクリックジャッキング攻撃を引き起こすなど大きな問題となりました。このマルウェアは銀行関連のデータを狙うよう設計され、Androidデバイスに対応し、未認証のアプリを介して拡散されました。

AndroidユーザーがPlayストアからそのようなアプリをダウンロードすると、マルウェアが作動し、ターゲットのデータをクリックジャッキング攻撃で奪いました。しかし、これだけでなく、場合によっては管理者権限まで侵入し、特権を悪用するケースも見受けられました。

管理者権限に到達すると、マルウェアはオーバーレイ画面の制御、SMSの自動送信、連絡先の取得、さらにはランダムな通話まで行いました。また、操作のスクリーンショットを撮影し、自動的に攻撃者へ送信するほど、技術的に高度なものでした。

この攻撃では、マルウェアはコマンド&コントロールサーバーの助けを借り、そのサーバーは攻撃者の管理下に置かれていました。銀行関連のデータのみが狙われていたものの、SMSにもアクセスできたため、銀行関連のOTP情報漏洩のリスクもありました。

このマルウェアは非常に強力で、わずか1週間で23か国以上に拡散し、まさにウイルスのように広がりました。

  1. 例 3 - Facebookのクリックジャッキングバグ(2018年)

2018年12月、セキュリティ専門家が、許可なく他者のウォールに投稿が行われた事例を発見しました。

詐欺の手口では、被害者にコミックサイトのリンクをクリックさせ、年齢確認を行わせるものでした。確認が完了すると、そのコミックサイトの投稿が可能になり、同時に被害者のウォールに思わぬ投稿がされるという問題が発生しました。このバグの原因は、モバイルのFacebookユーザーがログインする際、XFOレスポンスヘッダーが設定されていなかったことにあります。

興味深いことに、Facebookのバグバウンティチームはこの脆弱性をプライバシーあるいはセキュリティ上の脅威と見なさなかったため、問題が依然として残っている可能性があります。

Facebookを利用される場合は、不審なリンクはクリックせず、正規に見えるリンクであっても、事前にリンクをコピーして検証することが望ましいです。

どのようにクリックジャッキングを防止できるか

幸い、ウェブサイト側でユーザーや訪問者、その他の資産をクリックジャッキング攻撃から守るための対策がいくつか存在します。これらの対策は、通常、ウェブ開発担当者によって実施され、一定のコーディングやウェブに関する知識が必要です。

  • フレーミング防止

ウェブページのコンテンツが他のページのHTMLコンテナ内に埋め込まれるのを防ぐため、コンテンツセキュリティポリシー(CSP)と呼ばれる仕組みが導入されます。CSPは、JavaScriptやCSSなど、特定のウェブ資源のみを許可することで、クリックジャッキング攻撃に対する主要な防御策として機能します。

  • X-Frame-Options

X-Frame-Optionsと呼ばれる仕組みは、ブラウザがページをフレームや埋め込み、オブジェクトとして表示するかどうかを示すレスポンスヘッダーに依存します。これにより、サイト所有者はiframeやobjectの利用を制御できます。なお、X-FrameはInternet Explorer 8向けに初めて導入されたため、すべてのブラウザで確実に機能するとは限らない点に注意が必要です。

CSPとX-Frame-Optionsを併用することで、クリックジャッキング攻撃に対する堅固な防御策となります。

  • Framekillerの導入

Framekiller(framebusterまたはframebreakerとも呼ばれる)は、ウェブページがフレーム内に埋め込まれるのを防ぐJavaScriptコードです。現在のウィンドウがトップウィンドウかどうかを確認し、そうでない場合はページの表示を停止します。

  • コンテンツセキュリティポリシー (CSP)

コンテンツセキュリティポリシー (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ディレクティブを追加するには

frame-ancestorsは、クリックジャッキングのリスクを軽減し、ターゲットを守る有効な手段です。CSP(コンテンツセキュリティポリシー)の一部として、iframeやobjectの埋め込みを制御し、クリックジャッキングやXSS攻撃を防ぐ役割を果たします。

これはHTTPレスポンスヘッダーを利用して、許可されるリソースを定める仕組みです。クリックジャッキング防止策として、CSPはX-Frame-Optionsの代替となる場合もありますが、すべてのブラウザで有効とは限らないため、使用中のブラウザが対応しているか確認する必要があります。

以下の手順に従い、frame-ancestorsディレクティブを追加してください。

Apacheの場合

  • Step #1: ‘sudo a2enmod headers’コマンドでmod_headersを有効にする。
  • Step #2: ‘sudo service apache2 restart’コマンドでApacheを再起動する。
  • Step #3: httpd.confまたはapache.confを編集し、frame-ancestorsディレクティブを追加できるようにする。
  • Step #4: ‘frame-ancestors 'none';’コマンドを使用し、すべてのソースからの入力を拒否するよう設定する。
  • Step #5: ‘frame-ancestors 'self';’コマンドで自社ソースのみを許可する。
  • Step #6: ‘frame-ancestors ex_1.com ex_2.com ex_3.com;’で特定のドメインからの入力を許可する。
  • Step #7: ‘frame-ancestors 'self' ex_1.com ex_2.com ex_3.com;’コマンドで自社および指定ドメインの入力を許可する。
  • Step #8: ‘sudo service apache2 restart’コマンドでApacheを再起動し、変更を反映する。

Nginxの場合

対象ウェブサイトの設定ファイルを編集することで、frame-ancestorsディレクティブを容易に追加できます。以下の手順を実施してください。

  • Step #1: “add_header set Content-Security-Policy: frame-ancestors 'none';”コマンドで全てのソースを拒否する。
  • Step #2: “add_header set Content-Security-Policy: frame-ancestors 'self';”コマンドで自社ソースのみを許可する。
  • Step #3: “add_header set Content-Security-Policy: frame-ancestors ex_1.com ex_2.com ex_3.com;”コマンドで特定ドメインからの入力を許可する。
  • Step #4: “add_header set Content-Security-Policy: frame-ancestors 'self' ex_1.com ex_2.com ex_3.com;”コマンドで自社および指定ドメインを許可する。
  • Step #5: ‘sudo service nginx restart’コマンドでNginxを再起動し、編集内容を適用する。

FAQ

References

Subscribe for the latest news

Updated:
February 17, 2025
Learning Objectives
Subscribe for
the latest news
subscribe
Related Topics