概要
脆弱性名(Ja) | 安全なフラグが検出されない Cookie |
脆弱性名(En) | Cookie Without Secure Flag Detected |
ID | 98064 |
危険度 | Low |
ファミリー | Web Applications |
説明
Secure 属性は、Cookieに設定する属性の一つで、Cookieが暗号化されたHTTPS通信時のみ送信されるように制御するための属性です。
このフラグがないと、HTTP通信でもCookieが送信されるため、クリアテキストで通信が行われ、攻撃者に盗聴されるリスクが高まります。
特に、セッショントークンや機密情報を含むCookieがHTTP経由で漏洩する危険性があります。
リスク
Secureフラグが設定されていないCookieは、攻撃者がHTTP通信を盗聴することで、機密情報を入手できるリスクがあります。
これにより、セッションハイジャックや個人情報の漏洩が発生する可能性があります。
HTTPSを使用していても、HTTPリンクやリダイレクトを通じて、Cookieが不適切に送信されることがあります。
検出トリガー
- HTTPレスポンスのSet-Cookieに「Secure」属性が設定されていない
NG: Set-Cookie: laravel_session=abcde12345;
OK: Set-Cookie: laravel_session=abcde12345; Secure;
- JavaScriptで生成されたCookieで存在する (Google Analyticsなど)
_ga=GAxxxxxxxxx;
対策 (プログラム側で対策する場合)
サーバー側のCookieの場合は、セッション生成時に「Secure」属性を設定します。
PHP
setcookie("session", $sessionID, [ 'httponly' => true, 'secure' => true ]);
Java (Servlets)
Cookie cookie = new Cookie("session", sessionID);
cookie.setSecure(true);
response.addCookie(cookie);
対策 (サーバーで対策する場合)
Apacheの設定
Apacheサーバーで設定するには、サーバーの設定ファイルに以下のように記述します。
Header edit Set-Cookie ^(.*)$ $1;Secure
Nginxの設定
Nginxでは、設定ファイルに以下の行を追加してSecureを適用します。
この設定により、すべてのCookieにHttpOnly属性が付加されます。
add_header Set-Cookie "Secure";
これにより、セッショントークンや重要なデータを含むCookieがクリアテキストで送信されなくなります。
対策 (JavaScriptで生成されたCookieの場合)
JavaScriptで生成されたCookieの場合は、Httpnly属性・Secure属性は指定できません。
Secure属性は「HTTPS通信でのみクッキーを送信する」ためのものであり、HttpOnly属性とは異なり、JavaScriptからクッキーを利用することを禁止するものではありません。
そのため技術的にはJavaScriptでSecure属性を設定できても良いのですが、JavaScriptではSecure属性を指定する手段が提供されていません。
クッキーの安全性に関しては、サーバー側の管理が推奨されており、クライアントサイド(JavaScript)からのクッキーのセキュリティ属性設定を許可していないためです。
関連リンク
危険度が脆弱性ツールによって異なる場合があります。