進行状況の追跡を始めよう
Trailhead のホーム
Trailhead のホーム

クリックジャックの防止

学習の目的

この単元を完了すると、次のことができるようになります。
  • クリックジャック攻撃の概要を説明する。
  • 実際によくあるクリックジャックの使用例を 3 つ挙げる。
  • 組織の設定を変更してクリックジャック攻撃を防止する。

クリックジャックとは?

クリックジャックとは、2000年代前半に猛威を振るった、よく知られている Web アプリケーションの脆弱性です。この攻撃は、悪意のあるアクターが、ユーザをあるオブジェクトを操作していると信じ込ませて、実際には別のオブジェクトを操作させるために使用されます。

クリックジャックされたページには、攻撃者が安全なコンテンツをユーザに表示すると同時に、その上の透過レイヤに別のページを読み込みます。クリックジャックされたページでは、ユーザは下部レイヤに対応するボタンだと思ってクリックしますが、実際にはその上にある非表示ページのアクションを実行しています。

クリックジャックの動作

Kingdom Management 開発者組織でこの動作を確認しましょう。
  1. Kingdom Management 開発者組織にログインして、Kingdom Management アプリケーションを選択します。
  2. [Disloyal Subjects (忠誠ではない臣下)] タブをクリックします。

    このページには、基本のフォームが表示されています。このフォームでは、[Send to the High Tower (塔送りにする)] リンクをクリックして作業場所を再割り当てすることで、忠誠ではない臣下を監禁できます。攻撃者がクリックジャックを使用して、知らない間にエンドユーザに臣下を監禁させる方法を見てましょう。

  3. Clickjacking アプリケーションに移動します。
  4. [Clickjacking Vulnerable Demo (クリックジャック 脆弱性デモ)] タブをクリックします。

    一見、これは通常の Visualforce ページのように見えます。現在監禁されている人物のリストが表示された表と、その前面にクリックするように促す大きなバナーが表示されます。

  5. [You Found Treasure! (財宝発見!)] バナー上の [Click Here (ここをクリック)] ボタンをクリックします。
  6. タブを更新します。

監禁されている人数が 1 人増えています。どうやって起きたのでしょうか? Visualforce コードを見ると明らかになります。

Visualforce:

<style>
.clickjackframe {
    position:absolute;
    top: -40px;
    left: 200px;
    height: 300px;              
    //Comment below 2 lines to see what is behind image
    filter:alpha(opacity=0);
    opacity:0;
}
</style>

<iframe class="clickjackframe" frameBorder="0" allowTransparency="true" style="background-color:none transparent; filter:alpha(opacity=0)"  src="/apex/Vulnerable_Clickjacked_Form"/>

<img height="150px" width="400px" src="{!$Resource.Clickjacking_background}"/>

攻撃者は、このページに、前に見た不忠な臣下フォームの内容を参照する iFrame を追加しました。ただし、ユーザであるあなたにこのフォームは見えませんでした。それは、攻撃者が巧妙に iFrame の透過性を 0 に設定して見えないように表示したためです。次に、攻撃者は iFrame の CSS プロパティを変更して、ボタンの真上に配置しました。ユーザがボタンをクリックすると、実際にはボタンの上にある透明な iFrame を操作することになります。その結果、人物が監禁されました。

下記は、デモページのスクリーンショットです。iFrame の不透明度が増加されたため、攻撃を視認しやすくなっています。

デモ組織の非表示 iframe を示すスクリーンショット

その他のよくあるクリックジャック使用方法

ここでは簡単な例で、クリックジャックを使用して Salesforce インスタンスのデータを変更する方法を説明しました。一方、Salesforce プラットフォーム以外では、クリックジャック攻撃が次のような多種多様な悪意のある活動に利用されています。

  • ユーザを騙して Flash を通じて Web カメラやマイクを使用できるようにする (Cursorjacking とも呼ばれる)。
  • ユーザを騙してソーシャルネットワークのプロファイル情報を公開させる。
  • マルウェアをダウンロードして実行し、攻撃者がリモートから他者のコンピュータを制御できるようにする。
  • ユーザに Twitter で他のユーザをフォローさせる。
  • Facebook でリンクを共有またはいいね! する (Likejacking とも呼ばれる)。
  • Google AdSense 広告をクリックして PPC (pay-per-click) 広告収入を得る。
  • YouTube 動画を再生してビュー数を増やす。
  • Facebook で他のユーザをフォローする。

クリックジャック攻撃の防止

クリックジャック攻撃の概要は理解できましたが、どうやって防止すればよいのでしょうか? 一般的に使用されているクリックジャック防止手法がいくつかありますが、それぞれ制限があります。

フレームバスティングスクリプトを使用する

最もよく使用されるのは、「フレームバスティング」スクリプトを使用して攻撃者が iFrame に Web サイトを読み込めないようにする方法です。スクリプトはページがフレームに読み込まれるかどうか、検出を試みます。検出したら、ページが読み込まれるのを阻止します。この手法を機能させるには、サイト所有者がサイトページごとにスクリプトを追加する必要があります。

次にフレームバスティングスクリプトの例をいくつか挙げます。

if (top != self) top.location = self.location;
if (top.location != location) top.location = self.location;
if (top.location != location) top.location.href = document.location.href;

これはクリックジャックに対して最もよく使用されるソリューションですが、多くのフレームバスティングスクリプトに既知の迂回路があるため、攻撃者はそれを利用してこの保護を回避できます。

X-Frame Options を使用する

もう 1 つのクリックジャック保護方法では、Internet Explorer® 8 で導入された X-FRAME-OPTIONS という HTTP ヘッダーを使用します。このヘッダーは、サイト所有者がページを読み込み可能な場所の制限を設定できるという点では、フレームバスティングスクリプトと同様に機能します。

このヘッダーは次の 3 つの値のいずれかに設定できます。

  • DENY — ページがフレームに読み込まれるのを完全に阻止します。
  • SAMEORIGIN — 発生源がコンテンツと同じである場合 (Salesforce.com と evilsite.com など) にのみフレーミングを許可します。
  • ALLOW-FROM — 特定の URL からの場合にのみフレーミングを可能にします。

従来のブラウザの多くは X-FRAME-OPTIONS をサポートしていないため、ユーザベースによっては、このヘッダーは完全なソリューションとならない場合があります。

Salesforce クリックジャック保護の使用

Salesforce は、この両方の方法 (フレームバスティングスクリプトと X-Frame Options ヘッダー) を標準のクリックジャック保護として使用しています。[設定] で保護設定を確認できます。[クイック検索] ボックスに「セッションの設定」と入力し、[セッションの設定] を選択します。

Salesforce のクリックジャック設定

デフォルトでは、すべての標準 Salesforce ページはクリックジャックに対して保護されていますが、開発者がこの保護をカスタム Visualforce ページに拡張することもできます。この機能を有効にする前に、Salesforce システム管理者に確認してください。アプリケーションが iFrame を広範囲に使用している場合、クリックジャック保護によって意図した機能が中断するおそれがあります。

最後にもう一言加えると、Kingdom Management 開発者組織でこの設定を有効にしても、攻撃ページを再試行すると攻撃は成功します。なぜでしょうか?

デモ目的で、脆弱なフォームと攻撃ページはどちらも同じドメイン (Salesforce インスタンス) でホストされているため、プラットフォームで設定された X-Frame-Options: SAMEORIGIN ヘッダーによって引き続きフレーミングが許可されます。外部サーバでこれと同じ攻撃を実行しようとするとブロックされます。

retargeting