LiteLLM 1.107.0 악성 버전 확인법 — 136일 방치된 마스터 키 하나가 배포 파이프라인을 열었다
LiteLLM 1.107.0, published to PyPI and Docker on October 21, 2026, carried a credential stealer after an attacker used an Agent Platform master key leaked in a public repository on May 27 and never revoked. The poisoned PyPI package was live for about 1 hour 44 minutes and Docker tags for 2 to 2.5 hours. LiteLLM names 1.106.2 as the last safe version; anyone who installed 1.107.0 should rebuild and rotate every reachable secret.
LiteLLM 1.107.0은 2026년 10월 21일 PyPI와 도커에 올라간 악성 버전으로, 설치한 컴퓨터의 클라우드·AI·SSH 키를 훔친다. 5월 27일 공개 저장소에 실수로 올라간 뒤 136일간 폐기되지 않은 마스터 키가 출발점이었다. 마지막 안전 버전은 1.106.2이며, 설치했다면 환경을 새로 만들고 접근 가능한 비밀값을 전부 바꿔야 한다
3줄 요약
- 피해 버전 — PyPI 1.107.0(약 1시간 44분 노출), 도커 latest 등 4개 태그
- 원인 — 5월 27일 유출된 마스터 키 미폐기, 10월 10일 침입해 소유자 토큰 탈취
- 조치 — 1.106.2로 고정, 환경 재구축, 클라우드·AI·DB 키 전부 교체
핵심 질문
- litellm 1.107.0 악성코드
- **10월 21일 배포된 1.107.0에 비밀값 탈취 코드가 들어 있었다.** | 경로 | 노출 시간(UTC) | 상태 | |---|---|---| | PyPI litellm 1.107.0 | 11:39~13:23, 약 1시간 44분 | 격리 | | 도커 허브 v1.107.0·latest·main-latest·main-stable | 11:46~14:20 | 삭제·정상 이미지로 교체 | | GHCR 이미지 | 11:46~13:51 | 내려감 | | 마지막 안전 버전 | 1.106.2 | — |
- litellm 해킹 확인 방법
- **설치 기록과 site-packages, 네트워크 로그를 본다.** | 확인 대상 | 볼 것 | |---|---| | 잠금 파일·pip/uv 캐시·빌드 로그 | litellm 1.107.0 | | site-packages | litellm-1.107.0.dist-info, cook.pth, cook.py, sitecustomize.py | | 네트워크 로그 | litellm[.]dev, /healthcheck, /codepy 요청 | | 클라우드 감사 로그 | 인스턴스 역할의 GetCallerIdentity, 베드록 모델 목록 조회 |
- litellm 1.107.0 설치했으면
- **그 환경에서 파이썬을 다시 돌리지 말고, 새로 만들고, 키를 다 바꾼다.** | 순서 | 할 일 | |---|---| | 1 | 의심 환경에서 pip·python 실행 금지 | | 2 | /tmp/remote_code_loader.lock 잡은 프로세스 종료 | | 3 | cook.pth·cook.py·sitecustomize.py 삭제 | | 4 | 가상환경·이미지 재구축, 1.106.2 고정 | | 5 | 클라우드·SSH·CI·AI·DB 비밀값 전부 교체, 세션 폐기 |
AI 앱 개발자가 많이 쓰는 파이썬 라이브러리 LiteLLM이 공격자 손에 배포됐다. LiteLLM은 오픈AI·앤트로픽·구글 등 여러 AI 모델을 하나의 방식으로 부르게 해 주는 게이트웨이다. 2026년 10월 21일 PyPI와 도커에 올라간 1.107.0 버전에 비밀값을 훔치는 코드가 들어 있었다. 회사는 10월 23일 원인 분석을 냈고 10월 24일 공개했다.
출발점은 다섯 달 전 실수였다. 5월 27일 공개 저장소에 마스터 키가 담긴 설정 파일이 올라갔다. 팀은 파일은 지웠지만 키는 폐기하지 않았다. 공격자가 그 키를 쓴 날까지 136일이 걸렸다.
1. 136일의 타임라인
| 일시(UTC) | 일 |
|---|---|
| 5월 27일 | 공개 저장소 LiteLLM-Labs/lite-harness에 에이전트 플랫폼 마스터 키 포함 설정 파일 커밋. 커밋은 덮어썼지만 키는 미폐기 |
| 10월 10일 | 공격자(IP 69.48.229.143)가 유출 키로 에이전트 플랫폼 접속, 깃허브 조직 소유자의 CLI 토큰 탈취 — 범위 제한 없는 소유자 권한 |
| 10월 10일 22:11 | 내부 저장소에 악성 커밋, 워크플로가 비밀값 수집 후 브랜치 삭제 |
| 10월 12일 | 두 번째 악성 커밋으로 수집 범위 확대(앤트로픽·오픈AI·AWS 베드록 키 등) |
| 10월 21일 10:08~11:08 | 브랜치 보호 해제, 배포 파이프라인을 비슷한 이름의 가짜 저장소(Berri-AI/litellm)로 돌림 |
| 10월 21일 11:39 | PyPI에 1.107.0 업로드(바퀴 파일 7개) — 훔친 토큰 하나로 배포, 다른 하나로 승인 |
| 10월 21일 11:46 | 도커 허브·GHCR 이미지 배포 |
| 10월 21일 12:06 | 업윈드 연구원 신고 |
| 10월 21일 13:23 | PyPI가 1.107.0 격리 |
| 10월 21일 14:20 | 도커 허브 태그 삭제·정상 이미지로 교체 |
| 10월 24일 | LiteLLM 공개 |
공격자는 들어온 뒤에도 열하루를 조용히 기다렸다. 그 사이 두 번 비밀값을 긁어 갔고, 배포 권한을 손에 넣은 뒤 정식 릴리스처럼 꾸며 내보냈다. 실행 기록도 지웠다.
2. 내가 영향을 받았는지 확인하는 법
| 확인 대상 | 볼 것 | 의미 |
|---|---|---|
| 잠금 파일·pip/uv 캐시·빌드 로그·사내 미러 | litellm 1.107.0 | 설치 흔적 |
| 도커 | v1.107.0·latest·main-latest·main-stable을 10월 21일에 받았는지 | 이미지 감염 |
| site-packages | litellm-1.107.0.dist-info, cook.pth, cook.py, sitecustomize.py | 악성 파일(없어도 안전 보장 아님) |
| 네트워크 로그 | litellm[.]dev, /healthcheck, /codepy | /codepy 요청이면 2단계 코드 실행 |
| 클라우드 감사 로그 | 인스턴스 역할의 GetCallerIdentity, 베드록 모델 목록 조회 | 탈취 키 사용 흔적 |
| 백신 | 마이크로소프트 디펜더 Trojan:PyPI/Stealer.SA 등 | 탐지 |
핵심은 .pth 파일이다. 파이썬은 시작할 때 site-packages 안의 .pth 파일을 자동으로 읽는다. 그래서 코드에서 litellm을 불러오지 않아도, 그 환경에서 파이썬이 한 번이라도 켜지면 탈취 코드가 돈다. 1.107.0이 깔린 서버에서 확인하겠다고 pip를 다시 돌리면 그것만으로 악성 코드가 또 실행될 수 있다.
3. 설치했다면 할 일
| 순서 | 할 일 |
|---|---|
| 1 | 의심 환경에서 pip·python을 실행하지 않는다 |
| 2 | /tmp/remote_code_loader.lock을 잡고 있는 프로세스를 끈다 |
| 3 | cook.pth, cook.py, sitecustomize.py와 캐시 바이트코드를 지운다 |
| 4 | 가상환경·이미지를 처음부터 다시 만들고 litellm 1.106.2(또는 검증된 이미지 다이제스트)로 고정한다 |
| 5 | 그 컴퓨터가 읽을 수 있던 비밀값을 전부 바꾼다 — 클라우드·SSH·GPG·CI·레지스트리·AI 도구·DB |
| 6 | LiteLLM 프록시라면 공급사 키·마스터 키·가상 키를 전부 바꾼다 |
| 7 | 세션을 폐기한다(키를 바꿔도 이미 발급된 토큰은 살아 있을 수 있다) |
| 8 | litellm[.]dev를 DNS·방화벽에서 막는다 |
탈취 코드가 노린 것은 넓다. AWS·애저·구글 클라우드·쿠버네티스 자격 증명, 깃·npm·PyPI 설정, .env 파일, SSH 키, 셸 기록, 브라우저 데이터, AI 도구 키까지다. LiteLLM 프록시에서는 DB 테이블의 모델 공급사 키를 한 번에 최대 500행씩 꺼냈다.
교훈은 마지막 줄에 있다. 한 번이라도 공개된 키는 커밋을 지웠어도 폐기해야 한다. 깃 기록을 덮어써도 그 사이 누군가 복사했을 수 있다. 훔친 AI 키가 어떻게 쓰이는지는 「API 키 도용이란」, npm에서 벌어진 비슷한 사고는 「npm 공급망 공격이란」, 10월 19일 오픈코드 키 유출은 「오픈코드 API 키 유출」에서 다뤘다.
4. 남은 것과 확인되지 않은 것
- 피해 규모: 1.107.0 다운로드 수와 실제 감염 수는 공개되지 않았다.
- 2차 피해: 10월 12일 수집된 앤트로픽·오픈AI·베드록 키가 다른 공격에 쓰였는지는 확인되지 않았다.
- 세부 시각: 격리·삭제 시각은 출처마다 몇 분씩 다르다.
출처
- 더해커뉴스 — Leaked LiteLLM Master Key Let Attackers Steal GitHub Tokens and Hijack Release Pipeline
- DEV 커뮤니티 — Leaked LiteLLM Master Key Sat Unrevoked for 136 Days, Then Shipped a Malicious 1.107.0 Release
- 브랜디펜스 — LiteLLM 1.107.0 Compromised: What to Do Now
- 디지털투데이 — LiteLLM deployment system compromised after admin key exposed by mistake