
BadHost(CVE-2026-48710)는 Starlette의 request.url 재구성 과정에서 발생한 취약점입니다. Starlette는 HTTP Host 헤더와 요청 경로를 조합해 request.url을 만들었는데, 1.0.1 이전 버전은 이 값을 만들기 전에 Host 헤더가 RFC 9112 및 RFC 3986 문법에 맞는지 충분히 검증하지 않았습니다.1
핵심은 Host 헤더 안의 작은 문자입니다. /, ?, # 같은 문자가 포함되면 URL을 다시 파싱하는 과정에서 path, query, fragment의 경계가 바뀔 수 있습니다.2 그 결과 애플리케이션 내부에서 보는 request.url.path가 실제 HTTP 요청 경로와 달라질 수 있습니다.
라우터와 보안 로직이 서로 다른 경로를 볼 때
BadHost가 위험한 이유는 라우팅과 보안 판단이 같은 값을 보지 않을 수 있기 때문입니다.
ASGI 라우터는 실제 HTTP 요청 경로를 기준으로 요청을 라우팅합니다. 반면 인증·인가 미들웨어가 request.url.path를 기준으로 접근 제어를 한다면, 오염된 경로 값을 보고 잘못된 결정을 내릴 수 있습니다.2
예를 들어 실제 요청은 /admin으로 들어갔지만, 미들웨어는 이를 공개 경로처럼 오인할 수 있습니다. 공개된 예시에서는 Host: foo? 헤더를 붙인 /admin 요청이 차단되지 않고 정상 처리될 수 있었습니다.2
따라서 점검해야 할 코드는 비교적 명확합니다. 다음과 같은 판단에 request.url 또는 request.url.path를 사용하는 부분입니다.2
인증
인가
감사 로깅
속도 제한
라우팅 또는 프록시 분기
특히 /admin, /v1/models, /internal, /metrics, /shutdown처럼 경로 접두어로 보호하는 엔드포인트가 있다면 우회 가능성을 확인해야 합니다.2
왜 AI 스택에서 더 민감한가
Starlette는 FastAPI의 기반이며, FastAPI는 Python 기반 AI 서비스에서 널리 쓰입니다. BadHost의 영향권에는 FastAPI뿐 아니라 vLLM, LiteLLM 같은 LLM 서버·게이트웨이도 언급됐습니다.3
AI 서비스에서 보호해야 할 경로는 단순한 관리자 페이지에 그치지 않습니다. 모델 목록 조회, 내부 도구 호출, 메트릭 노출, 서비스 종료, 키 관리와 연결된 엔드포인트가 포함될 수 있습니다. 이런 경로가 request.url.path 기반 미들웨어로만 보호되고 있다면, 실제 라우팅 경로와 보안 판단 경로가 어긋나는 순간 방어가 무력화될 수 있습니다.
피해 반경은 더 커질 수 있습니다. 보호된 엔드포인트가 외부 URL을 호출하는 기능을 갖고 있다면 SSRF로 이어져 클라우드 메타데이터 서비스나 내부 호스트가 공격 대상이 될 수 있습니다.2 AI 에이전트나 LLM 게이트웨이는 외부 서비스 자격 증명을 함께 다루는 경우가 많기 때문에, 같은 웹 취약점이라도 운영 환경에서는 더 큰 위험으로 번질 수 있습니다.
지금 확인할 것
우선 Starlette를 1.0.1 이상으로 올려야 합니다. 다만 실행 환경의 pip list만 확인하는 것으로는 충분하지 않을 수 있습니다. 컨테이너 이미지, 번들된 가상환경, 고정된 의존성 파일, 재빌드되지 않은 배포 산출물까지 함께 확인해야 합니다.2
코드에서는 보안 판단에 request.url.path를 직접 사용하는 부분을 찾아야 합니다. 경로 기반 접근 제어가 필요하다면 재구성된 URL 값보다 ASGI의 원래 경로인 request.scope["path"]를 사용하는 편이 안전합니다.2
앞단 프록시도 점검 대상입니다. nginx, Apache, Cloudflare 같은 계층에서 잘못된 Host 헤더를 차단하도록 설정할 수 있지만, 설정이 존재하는 것과 실제로 차단되는 것은 다릅니다. /, ?, #가 포함된 비정상 Host 헤더가 운영 경로에서 거부되는지 직접 검증해야 합니다.2
BadHost의 결론은 단순합니다. 보안 판단에는 보기 좋게 재구성된 값이 아니라 요청의 원본 의미에 가까운 값을 써야 합니다. AI 스택이 복잡해질수록 새로운 보안 원칙이 필요한 것이 아니라, 오래된 웹 보안 원칙을 더 엄격하게 적용해야 합니다.
1CVE-2026-48710 - Starlette has missing Host header validation
2Disclosing the BADHOST Vulnerability in Starlette - OSTIF.org
3BadHost: One Character Bypasses Host-Based Security Across Most of the Python AI Stack
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.
