Skip to main content

クリックジャッキングをDevSecOps流に防ぐ!

2020年5月25日

0 分で読めます

ここ数週間で、バグ報奨金プログラムを通じて、Snykの一部の内部ドメインがクリックジャッキング攻撃に対して脆弱だという報告がいくつか寄せられました。もちろん、メインサイトは初日から保護されていましたが、保護が設定されていない小規模なサブドメインがいくつかありました。問題の修正は簡単でしたが、さらに一歩進んで、すべてのエンドポイントを保護し、この問題を心配せずに済むようにしたいと考えました。どのように対応したのか見ていきましょう。

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

OWASPの定義を見てみましょう。

「クリックジャッキングは「UI redress attack(UIのリダイレクト攻撃)」とも呼ばれます。攻撃者が複数の透明または不透明なレイヤーを使い、ユーザーが最前面のページをクリックするつもりでいるのに、別のページ上のボタンやリンクをクリックするように仕向ける攻撃です。つまり攻撃者は、本来そのページに向けられていたクリックを「乗っ取り」、別のページに誘導します。誘導先は、別のアプリケーションやドメイン、またはその両方が所有するページである可能性が高いです。」

これはかなり深刻な攻撃です。よくある攻撃手法は、別のWebサイトを作成し、標的のサイトをiframe内に埋め込むことです。こうすることで、攻撃者は簡単にクリックジャッキング攻撃を仕掛け、何も知らないユーザーをだまして悪意のあるWebサイトをクリックさせることができます。

クリックジャッキングを防ぐ

前述のとおり、主な攻撃手法はiframeの利用です。つまり、サイトをiframe内に読み込めないようブラウザーに伝えれば、この攻撃を完全に防げます。幸い、それを実現するx-frame-optionsというヘッダーがあります。このヘッダーを設定すれば完了です!

ただし、ひとつ小さな問題があります。どのエンドポイントにこのヘッダーが設定されていて、どこに設定されていないのか、どうすれば把握できるでしょうか?Snykには多数のエンドポイントがあり、すべてを追跡するのは非常に困難です。そこで役立つツールが必要です。

OWASP AMASSの紹介

OWASP AMASSはOWASPのツールで、「詳細な攻撃対象領域のマッピングとアセットの検出」を実現します。まさに必要としていた機能です。機能のひとつにDNS列挙があり、指定したドメインのDNSレコードをすべて検出できます。使い方はとても簡単です。

amass enum -d <domain> -o out.txt

これで関連するレコードをすべて検索し、out.txtに出力できます。あとはリストを順番に処理し、各DNSレコードにx-frame-optionsヘッダーがあるか確認するだけです。そのために使うのが、名前のとおり「Security Headers Checkers」というツールです。

セキュリティヘッダーをスキャンする

Security Headers Checkerは、x-frame-optionsなどのセキュリティヘッダーの欠落を含め、指定したURLのさまざまなセキュリティ上の問題をスキャンできるPythonユーティリティです。便利な機能が豊富で、特にREADMEには検出できる問題と、それらに注意すべき理由が詳しく記載されています。今回の用途で最も重要なのは、AMASSが出力したもののように、URLのリストを含むファイルを受け付けられる点です。必要な作業は次のとおりです。

python ./securityheaders/securityheaders.py out.txt --checkers HeaderMissingChecker --format json  --flatten --file ./result

amassの出力を渡し、確認対象をHeaderMissingCheckerのみに絞っています。次の引数は出力形式です。ここではJSONを選びましたが、ほかにも多くの形式がサポートされています。

これで脆弱なURLをすべて含むファイルができました。Security Headersはほかにも多数の興味深いヘッダーを報告するので、x-frame-optionsヘッダーがないURLだけを抽出するには、JQで簡単にフィルタリングします。次のように実行できます。

jq 'map(select(.header == "x-frame-options"))’ ./result/1.csv 

出力ファイルの拡張子がcsvなのはバグです :)

これでリストができました。残るのは、リストを確認し、脆弱なエンドポイントをすべて修正するという、本当の意味で大変な作業です。次はこれを毎日実行し、x-frame-optionヘッダーのない新たなエンドポイントがないことを確認します。見つかったURLが実際にWebサイトかどうかを確認するのも課題です。APIにクリックジャッキング対策は必要ありません。

まとめ

今回の事例は、システムのセキュリティ上の問題を研究者が報告できる仕組みである、バグ報奨金プログラムの重要性を示しています。しかし、報告への対処方法を知っておくことは、さらに重要です。問題を修正するだけでは十分ではありません。問題を再現するテストを追加しなければ、同じことが再び起こらないとは保証できません。人間である以上、誰もが間違いを犯します。同じ間違いを繰り返さないためのコードを活用しましょう!

Capture the Flagを始めよう

オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。

続きを読む

blog feature ai pink
Blog

PHP2Shellが最後ではない。次の脆弱性が最初に現れる場所

PHP2Shellは、エンジンレベルの欠陥がインターネットに公開されたアプリケーションをいかに速く危険にさらすかを示しました。次の脆弱性が公表される前に、外部からの資産把握、迅速なテスト、繰り返しの確認がなぜ重要なのかをご紹介します。