기술 설명
Starlette(FastAPI의 기반이 되는 ASGI 프레임워크이자, 전이적으로 vLLM, LiteLLM, Text Generation Inference, MCP 서버, 그리고 대부분의 Python 기반 AI 에이전트 프레임워크의 기반)는 HTTP Host 헤더를 요청 경로와 연결하여 요청 URL을 재구성할 때 Host 값을 RFC 9112 문자 제약 조건에 대해 검증하지 않습니다. 공격자가 URI 특수 문자(?, /, 또는 #)를 Host 헤더에 주입하면 request.url.path가 실제 ASGI 라우트 경로와 달라지므로 경로 기반 보안 미들웨어를 자격 증명 없이 완전히 우회할 수 있습니다. 'Host: foo?'를 사용한 단 하나의 curl 명령만으로 정상 조건에서 403을 반환하는 경로에서 200 OK를 반환할 수 있습니다. 공식 CVSS 점수는 6.5(중간)이지만, X41 D-Sec와 OSTIF의 보안 연구자들은 AI 인프라 스택 전반에 걸친 Starlette의 침투력을 감안할 때 이것이 실제 심각도를 과소평가한다고 공개적으로 주장했습니다.
공격 경로
원격, 인증되지 않음. 공격자가 형식이 잘못된 Host 헤더(예: 'Host: legitimate-host.com?')를 포함한 HTTP 요청을 Starlette 기반 엔드포인트로 전송합니다. ASGI 서버는 요청을 정상적으로 라우팅하고, Starlette의 미들웨어는 손상된 재파싱 URL 경로를 평가하며 보호된 경로 패턴과 일치하지 않아 요청이 핸들러로 통과하도록 합니다. 원시 TCP 소켓 또는 사용자 정의 Host 헤더를 허용하는 도구가 필요합니다(표준 HTTP 클라이언트는 헤더를 정규화합니다).
영향받는 시스템
Starlette 버전 0.8.3부터 1.0.0까지(패치 전의 모든 버전). 다운스트림: FastAPI(경로 기반 인증을 위해 Starlette 미들웨어를 사용하는 모든 버전), vLLM 추론 서버, LiteLLM 프록시 게이트웨이, Text Generation Inference, OpenAI 호환 ASGI shim, FastAPI/Starlette에 구축된 MCP 서버 구현, 그리고 경로 기반 접근 제어를 사용하는 AI 에이전트 하네스, 대시보드, 모델 레지스트리. Cloudflare 또는 AWS ALB 뒤의 배포는 이러한 프록시가 기본적으로 형식이 잘못된 Host 헤더를 거부하므로 부분적인 완화를 받습니다.
완화 방안
1. 모든 직접 및 전이적 종속성에서 Starlette 1.0.1 이상으로 업그레이드하고, 업그레이드 후 모든 컨테이너 및 벤더된 설치를 재구축합니다(제자리 패키지 업데이트는 이전 벤더된 복사본을 활성 상태로 유지하므로). 2. 보안 미들웨어에서 request.url 또는 request.url.path의 사용을 request.scope['path']로 바꿉니다. 이는 Host 헤더 콘텐츠의 영향을 받지 않는 원시 ASGI 와이어 경로를 반환합니다. 3. ASGI 서비스가 직접 노출되는 경우 앞에 HTTP/1.1 호환 리버스 프록시(Nginx, Apache httpd, Cloudflare)를 배포합니다. X41 D-Sec은 취약한 설치를 탐지하기 위한 무료 Semgrep 규칙, CodeQL 쿼리, badhost.org의 원격 스캐너를 발표했습니다.