Missing Anti-clickjacking Header

概要

  • 脆弱性の名前: Missing Anti-clickjacking Header (Anti-clickjackingヘッダーの欠如)
  • 問題の要点: Webサイトがクリックジャッキング攻撃に対する保護メカニズムを持っていないため、攻撃者がユーザーを騙して意図しない操作を実行させる可能性がある状態。
  • よくある発生シーン: Webサーバーの設定ミス、フレームワークのデフォルト設定、開発者の認識不足など。クラウド環境では、複数のサービスが連携して動作することが多いため、設定ミスが問題視されています。

背景

クリックジャッキングは、攻撃者がWebページの上に透明なiframeを重ねて表示し、ユーザーが意図しないボタンやリンクをクリックさせる攻撃手法です。
Anti-clickjackingヘッダー(X-Frame-OptionsContent-Security-Policy: frame-ancestors)は、Webページがiframe内で表示されることを制限することで、クリックジャッキング攻撃を防御します。
近年、Webアプリケーションのセキュリティ対策として、Anti-clickjackingヘッダーの設定が重要視されています。

セキュリティ上のリスク

  • クリックジャッキング攻撃による、ユーザーの意図しない操作の実行。
  • ユーザーアカウントの乗っ取り、個人情報の詐取、不正なコンテンツの表示。
  • ソーシャルメディアでの意図しない投稿、オンラインバンキングでの不正送金。

対処方法の具体例

Apache2

誤った設定例

.htaccessファイルにX-Frame-Optionsヘッダーが設定されていない例:

# 誤った例: X-Frame-Optionsヘッダーが設定されていない

正しい設定例

.htaccessファイルにX-Frame-Optionsヘッダーを設定する例:

# 正しい例: X-Frame-Optionsヘッダーを設定
Header set X-Frame-Options "DENY"

または

# 正しい例: X-Frame-Optionsヘッダーを設定
Header set X-Frame-Options "SAMEORIGIN"

Nginx

誤った設定例

設定ファイルにX-Frame-Optionsヘッダーが設定されていない例:

# 誤った例: X-Frame-Optionsヘッダーが設定されていない

正しい設定例

設定ファイルにX-Frame-Optionsヘッダーを設定する例:

# 正しい例: X-Frame-Optionsヘッダーを設定
add_header X-Frame-Options "DENY";

または

# 正しい例: X-Frame-Optionsヘッダーを設定
add_header X-Frame-Options "SAMEORIGIN";

PHP

誤った設定例

PHPスクリプトでX-Frame-Optionsヘッダーが設定されていない例:

<?php
// 誤った例: X-Frame-Optionsヘッダーが設定されていない
?>

正しい設定例

PHPスクリプトでX-Frame-Optionsヘッダーを設定する例:

<?php
// 正しい例: X-Frame-Optionsヘッダーを設定
header("X-Frame-Options: DENY");
?>

または

<?php
// 正しい例: X-Frame-Optionsヘッダーを設定
header("X-Frame-Options: SAMEORIGIN");
?>

JavaScript

JavaScript自体でX-Frame-Optionsヘッダーを設定することはできません。WebサーバーまたはPHPなどのサーバーサイドスクリプトで設定する必要があります。

AWS

正しい設定例

CloudFrontを使用してX-Frame-Optionsヘッダーを設定する例:

  • CloudFrontのBehaviorで、カスタムヘッダーを追加し、X-Frame-Optionsヘッダーを設定します。
  • X-Frame-Optionsヘッダーの値として、DENYまたはSAMEORIGINを指定します。

検出方法

OWASP ZAPでの出力例

  • Alert 名: Missing Anti-clickjacking Header
  • リスク: Low
  • URL: Anti-clickjackingヘッダーが設定されていないURL
  • パラメータ: なし
  • 詳細: X-Frame-OptionsヘッダーまたはContent-Security-Policy: frame-ancestorsディレクティブが設定されていないという情報

手動再現例

  1. Webブラウザの開発者ツールを開き、Networkタブを選択します。
  2. Webサイトにアクセスし、HTTPレスポンスヘッダーを確認します。
  3. X-Frame-OptionsヘッダーまたはContent-Security-Policy: frame-ancestorsディレクティブが存在しない場合、脆弱性が存在します。
curl -I https://example.com

上記コマンドを実行し、X-Frame-Optionsヘッダーが存在しない場合、脆弱性が存在する可能性があります。

まとめ

  • CVSS 基本値: 4.3 (Medium)
  • 運用チームや開発者が意識すべきポイント:
    • Webサイト全体でX-Frame-OptionsヘッダーまたはContent-Security-Policy: frame-ancestorsディレクティブを設定する。
    • X-Frame-Optionsヘッダーの値として、DENYまたはSAMEORIGINを適切に選択する。
    • Content-Security-Policy: frame-ancestorsディレクティブを使用する場合は、許可するオリジンを明示的に指定する。
    • 定期的にペネトレーションテストを実施し、脆弱性を特定する。
  • 再発防止:
    • 開発プロセス全体でセキュリティを考慮する(Security by Design)。
    • コードレビューを実施し、Anti-clickjackingヘッダーの設定漏れを早期に発見する。
    • 自動脆弱性診断ツールを導入し、定期的にスキャンを行う。
    • Webサーバーの設定テンプレートやIaCポリシーに、Anti-clickjackingヘッダーの設定を組み込む。

補足資料・参考URL

以上の対策と検出方法を活用して、Missing Anti-clickjacking Headerのリスクを低減してください。