中山テック 代表の中山です。
さて最近ではクリックジャッキングの対策について調べる機会がございました。
これは「ボタンの上に透明化された隠しボタンがあることで意図しない行動を取ってしまう」という攻撃になります。
どのような仕組みで、サーバ側はどのような仕組みを取ればいいのか説明したいと思います。
流れとしては
①利用者は会員制ホームページにログイン
②攻撃者が悪意あるページに誘導
③利用者は悪意あるページにアクセス、罠ボタンをクリック
④会員制ホームページに悪意あるアクションが飛ぶ
と、悪意のあるページから悪意あるアクションが飛ばすのがクリックジャッキング。
しかし、悪意ってなんだろ代表は良く思ってました。
具体例
何のための攻撃かは置いといて、ネットショップを例にすると
①利用者がネットショップへログイン(セッションが確立される)
②とある商品の評判が書いてあるサイトを閲覧(実は罠サイト)
③悪意あるサイトは特定のネットショップとのセッションが確立されているか確認する
④罠サイトに「ギフト券無料プレゼント」といった画面を表示
※画面の上には透明化されたネットショップの画面が配置
⑤利用者はボタンをクリック
⑥透明化されたネットショップのボタンを押下、不要な商品100個購入の流れであった
「ネットショップへのセッションが確立されている」ことが条件です。
確率されているため、隠したネットショップのページは利用者がログインした状態で表示となります。
海外の事例
Facebookのいいねボタンを隠した事例があります。
これもiframeでいいねボタンを透明化し、表面上は通常のボタンを押下させるページとなっています。
クリックすると特定のアカウントの投稿のいいね数が爆上がりするというものです。
paypal
悪意あるページでお金の送付先を攻撃者に出来てしまう脆弱性がありました。
この脆弱性を発見した人に報奨金が支払われたそうです。
対策
HTTPサーバ側で「X-FRAME-OPTIONS」の定義を追加することで防げる可能性が高まります。
これは「iframe」の表示を制御する命令文です。
Apacheを例に取るとhttpd.confに下記の定義を追加します。
Header always set X-Frame-Options "オプション"
オプションについては
◆DENY・・・全面禁止(自サイトの埋め込みも不可)
◆SAMEORIGIN・・・同じホストであれば埋め込み可
※httpsやポート違い、wwwが付いていても違うオリジンとみなされる模様
◆ARROW-FROM {URI}・・・URIで指定したホストなら埋め込み可
対策後は透明にした埋め込みサイト(ifame)が表示されないため、悪意あるアクションは飛ばないでしょう。
また、「Content-Security-Policy」で設定してもiframeの差し込みを防げます。
Header always set Content-Security-Policy "default-src 'self'"
iframe差し込みを防ぐにはX-FRAME-OPTIONとContent-Security-Policyどっちも設定しなければならない?との問いもありますが、ぶっちゃけ
どちらかを設定すればOK
です。どっちも似たような対応方法になるんで。
まとめ
常に外部からの脅威に晒されているインターネット。
お金が絡んだり、被害者の名誉が傷つけられる可能性があるので対策は知っておいた方が良いでしょう。
※ちなみに怪しいボタンをクリックしないのが一番の対策です!
私も開発の際、セキュリティ対策をしなければならないので自戒の念を込めて執筆しました。
最後までご覧頂き、ありがとうございました。