Information Disclosure - Sensitive Information in URL

概要

  • 脆弱性の名前: Information Disclosure - Sensitive Information in URL (情報漏洩 - URL内の機密情報)
  • どんな問題か: URLにパスワード、トークン、セッションIDなどの機密情報が含まれている状態。
  • よくある発生シーン: GETリクエストでのフォーム送信、認証処理、リダイレクト処理、APIの利用。

背景

  • 問題視されるようになった背景: Webアプリケーションの開発において、URLを介した情報伝達が広く利用されている一方で、開発者のセキュリティ意識の欠如や設定ミスにより、機密情報がURLに含まれてしまうケースが後を絶たないため。
  • クラウド設計や設定ミスによる実例: クラウド環境でAPI Gatewayを使用している場合、認証情報をURLパラメータとしてバックエンドに転送してしまう設定ミスが発生することがある。また、ログ収集システムの設定ミスにより、URLに含まれる機密情報がログに記録されてしまうことがある。

セキュリティ上のリスク

  • どんな攻撃に悪用されるか:
    • 情報漏洩: URLはブラウザの履歴、サーバーのログ、リファラヘッダーなどに記録されるため、機密情報が漏洩する可能性がある。
    • セッションハイジャック: セッションIDがURLに含まれている場合、攻撃者がURLを入手することで、ユーザーのセッションを乗っ取ることができる。
    • CSRF (Cross-Site Request Forgery) 攻撃: URLに重要なパラメータが含まれている場合、攻撃者はユーザーに意図しない操作を実行させることができる。
  • 実被害が出た具体的なインシデント: 具体的なインシデントは特定できませんでしたが、過去には、URLにAPIキーが含まれていたために、クラウドストレージサービスが不正アクセスを受けた事例が報告されています。

対処方法の具体例

WordPressでの対処

<?php
// functions.php
add_action('init', function() {
    // URLからセッションIDを削除
    if (isset($_GET['PHPSESSID'])) {
        wp_redirect(remove_query_arg('PHPSESSID'));
        exit;
    }

    // 管理画面URLの変更
    if (!defined('WP_ADMIN_DIR')) {
        define('WP_ADMIN_DIR', 'secure-admin');
    }
});

PHPでの対処

<?php
// POSTメソッドの強制
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('HTTP/1.1 405 Method Not Allowed');
    exit;
}

// 機密情報の暗号化
function encryptSensitiveData($data) {
    $key = getenv('ENCRYPTION_KEY');
    $cipher = "aes-256-gcm";
    $ivlen = openssl_cipher_iv_length($cipher);
    $iv = openssl_random_pseudo_bytes($ivlen);
    return openssl_encrypt($data, $cipher, $key, 0, $iv, $tag);
}

// URLパラメータの検証
function validateUrlParameters($params) {
    $sensitivePatterns = [
        '/password/i',
        '/token/i',
        '/secret/i',
        '/credential/i'
    ];

    foreach ($params as $key => $value) {
        foreach ($sensitivePatterns as $pattern) {
            if (preg_match($pattern, $key)) {
                throw new Exception('Sensitive information detected in URL');
            }
        }
    }
}

JavaScriptでの対処

javascript
// URLパラメータのサニタイズ
function sanitizeUrlParams(params) {
    const sensitiveKeys = ['password', 'token', 'key', 'secret'];
    const cleanParams = new URLSearchParams(params);

    sensitiveKeys.forEach(key => {
        if (cleanParams.has(key)) {
            cleanParams.delete(key);
        }
    });

    return cleanParams.toString();
}

// History APIの使用
function updateUrlSafely(data) {
    const state = { ...data };
    delete state.sensitiveData;
    history.pushState(state, '', sanitizeUrlParams(window.location.search));
}

ベストプラクティス

  • POSTメソッドの使用: データの送信には、GETメソッドではなく、POSTメソッドを使用する。
  • URLへの機密情報の埋め込み禁止: パスワード、トークン、セッションIDなどの機密情報をURLに含めない。
  • リダイレクト時の注意: リダイレクト時に機密情報をURLに含めないようにする。
  • ログの適切な管理: ログに機密情報が含まれないように、ログの設定を見直す。
  • URLパラメータの検証: URLパラメータに機密情報が含まれていないか検証する。

検出方法

  • OWASP ZAPでの検出時の出力例: OWASP ZAPでは、URLに機密情報が含まれている可能性がある場合に、警告を表示する。
  • 手動での確認: ブラウザの開発者ツールを使用し、ネットワークリクエストを監視し、URLに機密情報が含まれていないかを確認する。また、grepコマンドを使用して、サーバーのログを検索し、URLに機密情報が含まれていないかを確認する。

まとめ

  • 重要度: Medium (機密情報の種類やWebサイトの構成によって変動します)
  • 運用チームや開発者が意識すべきポイント:
    • URLに機密情報を埋め込まない
    • POSTメソッドを適切に使用する
    • ログの適切な管理を行う
    • URLパラメータを検証する
  • 再発防止の観点:
    • 開発者向けのセキュリティトレーニングを実施する
    • Webアプリケーションフレームワークのセキュリティ機能を活用する
    • API Gatewayなどの設定ミスを防ぐためのIaC (Infrastructure as Code) ポリシーを導入する

補足資料リンクや参考URL

この解説記事が、脆弱性理解の一助となれば幸いです。