Anthropic Claudeセキュリティ⭐ リポ 16品質スコア 77/100
open-redirect
リクエストパラメータ、フォーム入力、またはその他の呼び出し元が制御するソースからURLにユーザーをリダイレクトするコードを書く際に使用します。また、「return to」URLやOAuthコールバックリダイレクトを含むログインフローを構築する際にも活用できます。
description の原文を見る
Use when writing code that redirects users to a URL from request parameters, form input, or any caller-controlled source. Also invoke when building login flows with "return to" URLs or OAuth callback redirects.
SKILL.md 本文
オープンリダイレクトセキュリティチェック (CWE-601)
チェック内容
攻撃者が信頼できるドメインからユーザーを悪意のあるサイトにリダイレクトするリンクを作成するオープンリダイレクト脆弱性から保護します。フィッシングキャンペーンで悪意のあるリンクを正当なものに見せかけたり、OAuthフローで認可コードを窃取したりするために使用されます。
脆弱なパターン
redirect(request.args["next"])— 呼び出し元が提供するあらゆるURLにリダイレクトhttp.Redirect(w, r, r.URL.Query().Get("return"), 302)— 検証なしresponse.sendRedirect(req.getParameter("url"))— Java の検証されていないリダイレクトwindow.location = params.get("redirect")— クライアント側のオープンリダイレクト
すぐに修正
脆弱なコードをフラグ付けし、リスクを説明します。その後、以下のプロパティを確立する修正を提案します:
- すべてのリダイレクト対象は相対パスであるか、完全一致するホストの許可リストのメンバーです。 URLを解析し、ホストを検査し、許可リスト外のものは拒否します。プリフィックスマッチング (
startswith) は不十分です —allowed.com.evil.comはプリフィックスチェックに合格してしまいます。 - スキーム相対URLは明示的にブロックされます。
//で始まる値はプロトコル相対URLとして解析され、その後に続くホストにリダイレクトします。http:///https://だけをチェックするとこれを見落とします。 - OAuthおよびログイン「リターント」パラメータは、他のリダイレクト対象と同じバリデータを通ります。 これらは認証されたコンテキストで実行されるため、最も価値の高いターゲットです。ここでのリダイレクトは、攻撃者にログイン後のセッションまたは認可コードを与えます。
- 検証失敗時には、悪意のあるURLを含むエラーをエコーバックするのではなく、安全なデフォルト (
/、ホーム、ダッシュボード) にリダイレクトします。 これをエコーバックすると、攻撃者に反射型XSS表面を与えてしまいます。
アンカー — 実装ではなく形状:
def safe_redirect(target):
if target.startswith("//"): return "/" # block scheme-relative
u = parse(target)
if u.host and u.host not in ALLOWED_HOSTS: return "/"
return target
検証
- ユーザー入力から派生するすべてのリダイレクト対象は、相対パスまたは明示的なホスト許可リストのメンバーとして検証されている
- スキーム相対URL (
//evil.com) がブロックされている —http://とhttps://だけではない - OAuthおよびログイン「return_to」パラメータはリダイレクト前に検証されている
参考資料
- CWE-601 (信頼されていないサイトへのURL リダイレクション)
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- thejefflarson
- ライセンス
- MIT
- 最終更新
- 2026/4/26
Source: https://github.com/thejefflarson/soundcheck / ライセンス: MIT