Open Redirect via Backslash Normalization in OAuth Redirect URI Validation
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 74/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 静か
- 技術スタック
- python
調査の方向性
src/asfquart/generics.py の login と logout の redirect の検証および使用箇所から始め、続いて tests/generics.py の 53-58 行付近を確認します。既存の generics テストを実行し、両方のフローで raw のバックスラッシュと URL エンコードされたバックスラッシュを対象とするカバレッジを追加します。バックスラッシュベースの redirect が拒否され、有効な相対 redirect が引き続き機能すれば完了です。
索引モデルが issue の本文から書いたものです。
説明
Issue: FINDING-114 - Open Redirect via Backslash Normalization in OAuth Redirect URI Validation
Labels: bug, security, priority:medium, asvs-level:L2
ASVS Level(s): [L2-only]
Description:
Summary
The OAuth redirect URI validation in the login and logout flows rejects URIs that don't start with '/' or that start with '//', but does not account for the WHATWG URL Standard backslash normalization. Per the spec (§4.4 'relative slash' state), when a URL parser encounters '' after an initial '/' in a special URL scheme (http/https), it treats '' identically to '/'. Thus '' acts as a path separator, and '/\evil.com' is parsed as '//evil.com', a protocol-relative URL pointing to evil.com. The validation passes '/\evil.com' because it starts with '/' and doesn't start with '//', but browsers normalize this to '//evil.com', causing an open redirect.
Details
Affected locations:
src/asfquart/generics.pylines 48-53: Login redirect validationsrc/asfquart/generics.pylines 69-75: Login redirect usagesrc/asfquart/generics.pylines 113-119: Logout redirect validationsrc/asfquart/generics.pylines 164-172: Logout redirect usagetests/generics.pylines 53-58: Tests don't cover backslash case
Impact includes post-authentication phishing where users complete OAuth login and are then redirected to an attacker's site mimicking the application.
Recommended Remediation
Add backslash normalization check to redirect URI validation. Create a helper function _is_safe_redirect:
def _is_safe_redirect(uri: str) -> bool:
"""Validate redirect URI is safe (relative, same-origin only)."""
if not uri.startswith("/"):
return False
if uri.startswith("//"):
return False
# Block backslash and URL-encoded backslash
if "\\" in uri or "%5c" in uri.lower() or "%5C" in uri:
return False
# Verify no netloc present after parsing
parsed = urllib.parse.urlsplit(uri)
if parsed.netloc:
return False
return True
Add test cases in tests/generics.py to verify rejection of '/%5Cevil.com' and '/\evil.com' for both login and logout flows.
Acceptance Criteria
- Backslash-based open redirects are blocked
- URL-encoded backslashes are blocked
- Test cases verify backslash rejection
- Both login and logout flows are protected
- Unit test verifying the fix
References
- Source reports: L2:3.5.4.md
- Related findings: None
- ASVS sections: 3.5.4
Priority
Medium
- 主要言語
- Python
- スター
- 7
- フォーク
- 13
- PR マージ指標
- 30日以内にマージされた PR はありません
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/infrastructure-asfquart のほかの issue
-
bug priority
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
documentation
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
-
Document OAuth callback consistency rules対応中かも @Marrshal15 が 12 日前に担当しました。 オープンdocumentation
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
apache/infrastructure-asfquart#126 · コメント 1 件 ·
-
ASVS priority
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
apache/infrastructure-asfquart#85 · コメント 1 件 ·
-
Triage and track asfquart issues対応中かも @sbp が 11 日前に担当しました。 オープン
apache/infrastructure-asfquart#134 · 担当者 1 名 ·
apache/infrastructure-asfquart の issue をすべて見る
似ている issue
-
難易度 1/5 1時間未満 初心者へのやさしさ 82/100
EchoTools/nevr-runtime#651 ·
メンテナーはふだん 1 日以内に返信
-
bug frontend rt sev-3
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
noontide-co/mainbranch#1211 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
[1.x Bug] run-operation --sql reports success but rolls back writes on transaction-capable adaptersオープンtriage
難易度 2/5 1〜3時間 初心者へのやさしさ 64/100
dbt-labs/dbt#16784 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信