---
title: "LiteLLM PyPI 공급망 공격 - 발견부터 공개까지 72분의 기록"
published: 2026-03-26T15:48:40.000Z
canonical: https://jeff.news/article/1334
---
# LiteLLM PyPI 공급망 공격 - 발견부터 공개까지 72분의 기록

litellm v1.82.8 PyPI 공급망 공격의 발견과 대응 과정을 분 단위로 기록한 트랜스크립트. 엔지니어가 노트북 멈춤 현상을 Claude Code로 조사하다 악성코드를 발견하고 72분 만에 공개 대응을 완료함.

> [!WARNING]
> litellm v1.82.8은 PyPI에 악성코드가 포함된 상태로 업로드됨. GitHub에는 v1.82.6까지만 존재하며, 해당 버전은 PyPI 퍼블리싱 크리덴셜 탈취를 통해 직접 업로드된 것으로 추정됨.

## 사건 발견 경위

- 엔지니어가 작업 중 노트북이 갑자기 멈춤. htop으로 확인해보니 `exec(base64.b64decode('...'))` 패턴의 Python 프로세스가 **11,000개** 넘게 생성되어 있었음
- 강제 재부팅 후 Claude Code로 원인 조사를 시작함. 처음에는 Claude Code의 런어웨이 루프로 의심했는데, 실제로는 그게 아니었음
- 조사하다 보니 `litellm_init.pth`라는 34KB 파일이 진범으로 밝혀짐. `.pth` 파일은 Python 시작 시 자동 실행되는 파일이라는 거임

## 악성코드 동작 방식

- **감염 경로**: Cursor의 `futuresearch-mcp-legacy`가 `uvx`로 실행될 때 litellm을 전이 의존성으로 설치함. litellm v1.82.8이 PyPI에 올라온 지 **단 6분 만에** 피해자 시스템에 설치됨
- **크리덴셜 탈취 대상**: SSH 키, AWS 시크릿, GCP 인증정보, Kubernetes 토큰, .env 파일, 데이터베이스 비밀번호, 암호화폐 지갑, 쉘 히스토리까지 전부 긁어감
- **데이터 유출**: 수집한 데이터를 RSA+AES로 암호화한 뒤 `models.litellm.cloud`로 전송함. 이 도메인은 정상 litellm 인프라가 아님
- **지속성 확보**: `~/.config/sysmon/sysmon.py`에 systemd 서비스로 영구 설치를 시도함. 다행히 강제 재부팅으로 파일이 0바이트 상태에서 중단됨
- **K8s 확산**: 클러스터 내 모든 노드에 privileged alpine:latest 파드를 생성해서 악성코드를 퍼뜨리려 함
- **포크 폭탄**: `.pth` 파일이 `subprocess.Popen`으로 자식 Python 프로세스를 생성하는데, 자식 프로세스도 .pth를 트리거하니까 무한 재귀가 발생해서 11,000개 프로세스가 생긴 거임. 이건 의도한 게 아니라 부작용이었음

## 타임라인 (UTC 기준)

| 시간 | 이벤트 |
|------|--------|
| 10:52 | 악성 litellm v1.82.8 PyPI에 업로드 (GitHub 태그 없음) |
| 10:58 | futuresearch-mcp-legacy가 감염된 버전을 의존성으로 설치 |
| 11:07 | 악성코드가 persistence 설치 시도 |
| 11:09 | 포크 폭탄으로 인한 강제 재부팅 (persistence 중단됨) |
| 11:13 | Claude Code로 조사 시작 |
| 11:40 | litellm 패키지에서 악성코드 확인 |
| 11:58 | Docker 컨테이너에서 PyPI 다운로드하여 악성코드 존재 재확인 |
| 12:00 | PyPI 보안팀과 LiteLLM 메인테이너에게 이메일 발송 |
| 12:02 | Claude Code가 공개 블로그 포스트 작성 + PR 생성 (3분 소요) |
| 12:04 | Reddit(r/Python, r/netsec, r/LocalLLaMA)에 공유 |

## 핵심 포인트

- **GitHub에 없는 버전**: v1.82.8은 PyPI에만 존재하고 GitHub 릴리스 태그가 없음. 누군가 PyPI 퍼블리싱 크리덴셜을 탈취해서 직접 올린 것으로 보임
- **K8s 확산은 실패함**: 악성코드가 macOS에서 실행됐기 때문에 Linux 전용 경로(`/var/run/secrets/kubernetes.io/serviceaccount/token`)가 존재하지 않아서 K8s 횡이동이 실패함
- **AI가 탐지 속도를 높임**: 보안 전문가가 아닌 개발자가 Claude Code의 도움으로 72분 만에 전체 분석과 공개 대응을 완료함. Claude Code가 블로그 포스트 작성과 PR 생성까지 3분 만에 해냄

> [!IMPORTANT]
> 이 사건은 PyPI 공급망 공격이 얼마나 빠르게 진행될 수 있는지 보여줌. 패키지 업로드 후 6분 만에 첫 피해자가 감염됐고, 보안 전문가가 아닌 일반 개발자가 AI 도구만으로 72분 만에 전체 대응을 완료했다는 거임.

## 핵심 포인트

- litellm v1.82.8이 PyPI에 악성코드 포함 상태로 업로드됨 (GitHub에는 v1.82.6까지만 존재)
- .pth 파일이 Python 시작 시 자동 실행되어 SSH키, AWS, GCP, K8s 크리덴셜 등을 탈취하고 RSA+AES 암호화 후 유출
- 패키지 업로드 후 6분 만에 첫 피해자 감염, 72분 만에 공개 대응 완료
- 포크 폭탄은 .pth의 subprocess 재귀 호출로 인한 부작용으로 11,000개 프로세스 생성
- Claude Code가 악성코드 분석부터 블로그 포스트 작성, PR 생성까지 전 과정을 지원

## 인사이트

보안 전문가가 아닌 일반 개발자가 AI 도구만으로 공급망 공격을 실시간 탐지하고 대응한 첫 사례. AI가 공격 도구로만 쓰이는 게 아니라 방어 속도도 극적으로 높일 수 있다는 걸 보여줌.
