SV.CSRF.GET
このエラーは、要求 URL を通じてクロスサイトリクエストフォージェリトークンが漏洩する可能性があることを示します。
脆弱性とリスク
クロスサイトリクエストフォージェリ (CSRF) は、悪意のある Web サイト、電子メール、ブログ、インスタントメッセージ、またはプログラムによって、ユーザーが現在認証されている信頼済みサイトでユーザーの Web ブラウザが不正なアクションを実行した場合に発生する攻撃の一種です。
CSRF の脆弱性を軽減するための標準的なアプローチは、シンクロナイザトークンを使用することです。暗号的に安全なランダムトークンは、ユーザーセッションに一意的に関連付けられ、状態変更操作をもたらす任意のフォームへの隠しフィールドとして追加されます。CSRF トークンが検証に失敗した場合、サーバーは要求されたアクションを拒否します。
シンクロナイザトークンの多くの実装では、GET (URL) 要求と POST 要求にチャレンジトークンが含まれます。この制御は CSRF 攻撃のリスクを軽減するのに役立ちますが、一意のセッション単位トークンが GET 要求で公開されます。GET 要求の CSRF トークンは、いくつかの場所で漏洩する可能性があります。
コード例
脆弱コード例 1
void doGet(HttpServletRequest req, HttpServletResponse resp) {
if (!isValidRequest(req)) {
handleInvalidRequest(req, resp);
} else {
update(req, resp);
}
}
private boolean isValidRequest(final HttpServletRequest req) {
return req.getParameter("_csrf_token").equals(req.getSession().getAttribute("_csrf_token"));
}
private void update(HttpServletRequest req, HttpServletResponse resp) {
//...
}
private void handleInvalidRequest(HttpServletRequest req, HttpServletResponse resp) {
//...
}
SV.CSRF.GET が 16 行目に対して報告されています。「req」が CSRF トークンに対してチェックされています (25 行目)。状態変更アクションには GET 要求を使用しないでください。このため、CSRF のチェックは必要ありません。CSRF トークンのチェックは、トークンが GET 要求に存在することをほのめかすため、トークンが URL を介して漏洩する可能性があります。
修正コード例 1
void doPost(HttpServletRequest req, HttpServletResponse resp) {
if (!isValidRequest(req)) {
handleInvalidRequest(req, resp);
} else {
update(req, resp);
}
}
private boolean isValidRequest(final HttpServletRequest req) {
return req.getParameter("_csrf_token").equals(req.getSession().getAttribute("_csrf_token"));
}
private void update(HttpServletRequest req, HttpServletResponse resp) {
//...
}
private void handleInvalidRequest(HttpServletRequest req, HttpServletResponse resp) {
//...
}
理想的な解決策は、POST/PUT/DELETE 要求にのみ CSRF トークンを組み込み、状態変更を起こすサーバー側のアクションが POST/PUT/DELETE 要求にのみ応答するように変更することです。これは実際に RFC 2616 が GET 要求に要求していることです。機密にかかわるサーバー側のアクションが POST/PUT/DELETE 要求のみに応答することが保証されている場合、GET 要求にトークンを含める必要はありません。
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。
拡張機能
このチェッカーは、Klocwork knowledge base (ナレッジベース) を利用して拡張できます。詳細については、Java 解析のチューニングを参照してください。