- PyPI를 통해 배포된 LiteLLM 1.82.8 악성 패키지 감염을 실시간으로 탐지하고 분석한 분 단위 대응 일지
- 감염은 Cursor IDE 자동 업데이트 중 발생했으며,
litellm_init.pth파일이 실행되어 자격 증명 탈취와 시스템 감염을 유발 - 악성 코드는 SSH 키·클라우드 인증 정보 수집, Kubernetes 확산 시도, 포크 폭탄 생성 등 복합적 행위를 수행
- PyPI 보안팀과 LiteLLM 유지관리자에게 즉시 보고되어 패키지 격리 및 CVE 등록으로 이어짐
- Claude Code 등 AI 기반 코드 분석 도구가 공격 탐지에 핵심 역할을 하며, AI 생태계 공급망 보안 강화 필요성을 드러냄
LiteLLM 공급망 공격 대응 기록
- LiteLLM 1.82.8 버전이 PyPI를 통해 배포된 악성 패키지로 확인되어, 감염 탐지부터 격리까지의 과정을 분 단위로 기록한 대응 일지
- 감염은 Cursor IDE의 자동 업데이트 과정에서 발생했으며, Claude Code와 uv 패키지 관리자를 통해 설치된 의존성 중
litellm_init.pth파일이 실행되어 시스템 감염을 유발 - 공격은 자격 증명 탈취, 시스템 지속성 설치, Kubernetes 확산 시도, 포크 폭탄(fork bomb) 을 포함한 복합적 행위로 구성
- PyPI 보안팀과 LiteLLM 유지관리자에게 즉시 보고되어 패키지 격리 및 CVE 발급으로 이어짐
- AI 기반 코드 분석 도구가 실시간 악성 행위 탐지 및 분석에 핵심 역할을 수행
초기 탐지와 시스템 이상 징후
- 11:13 UTC경 macOS 노트북에서 11,000개 이상의 Python 프로세스가 생성되어 시스템이 정지 상태에 진입
-
exec(base64.b64decode('...'))형태의 명령이 반복 실행되며 CPU와 메모리를 포화시킴 - 강제 종료 후 재부팅 시 지속성(persistence) 관련 흔적은 발견되지 않음
-
- 초기에는 Claude Code의 내부 루프나
uv run스크립트 오류로 인한 비악성 루프 현상으로 판단 - 이후
htop스크린샷과 로그를 통해 base64 인코딩된 Python 스크립트가 반복 실행된 사실이 확인됨
감염 원인 규명
- 11:40경 설치된 Python 도구 내에서
litellm_init.pth파일이 발견되어 악성 행위로 판명-
.pth파일은 Python 시작 시 자동 실행되며 모든 Python 프로세스에서 동작 - SSH 키, 클라우드 자격 증명, 데이터베이스 비밀번호, 환경 변수, 쉘 히스토리 등을 수집
- 수집된 데이터는 RSA 암호화 후
https://models.litellm.cloud/로 전송 -
~/.config/sysmon/sysmon.py에 지속성 설치를 시도했으나 강제 재부팅으로 중단
-
- 감염은 Cursor IDE의 자동 업데이트(10:58 UTC) 중 발생
-
futuresearch-mcp-legacy확장이uvx를 통해 litellm 1.82.8을 다운로드 - 해당 버전은 PyPI에만 존재하며 GitHub 릴리스 태그가 없음
- PyPI 업로드 시각은 10:52 UTC로, 감염 직전 배포된 것으로 확인
-
악성 코드 구조
-
1단계(
litellm_init.pth): Python 시작 시 자동 실행되어 base64 인코딩된 페이로드를 디코딩 후 실행 - 2단계: RSA 공개키 포함, 탈취 데이터 암호화용
- 3단계(B64_SCRIPT): 실제 자격 증명 수집 및 전송 수행
-
지속성 설치:
sysmon.py를 systemd 서비스로 등록 시도 -
Kubernetes 확산 코드:
alpine:latest이미지를 이용해 각 노드에 privileged pod 생성 시도 -
포크 폭탄 원인:
subprocess.Popen([sys.executable, "-c", ...])호출이 자식 프로세스에서도.pth를 재실행하여 무한 루프 발생
피해 범위 및 대응 조치
-
노출된 자격 증명
- SSH 키, GCloud 및 Kubernetes 인증 정보,
.env파일 내 API 키, Supabase·ClickHouse·Grafana 비밀번호 등 - 즉각적 조치 권고
- 모든 SSH 및 클라우드 자격 증명 회전
-
.env및.mcp.json내 비밀키 재발급 -
~/.cache/uv캐시 삭제 - PyPI 보안팀(
security@pypi.org) 및 LiteLLM 유지관리자에 신고
- SSH 키, GCloud 및 Kubernetes 인증 정보,
-
Kubernetes 클러스터 점검 결과
- 악성 pod(
node-setup-*,sysmon) 미발견 - macOS 환경에서 실행되어 클러스터 내부 확산 실패
- 단,
~/.kube/config노출 가능성으로 인해 자격 증명 회전 필요
- 악성 pod(
PyPI 및 공개 대응
- 11:58 UTC, Docker 격리 환경에서 PyPI로부터 litellm 1.82.8 다운로드 후 악성
.pth파일 존재 재확인 - PyPI 보안팀과 BerriAI/litellm 저장소에 즉시 보고
- 이후 PYSEC-2026-2 (CVE) 로 등록
- 12:01 UTC, FutureSearch 블로그에 공급망 공격 공개 게시물 작성 및 배포
- 3분 내 PR 작성·병합 완료
- 12:04 UTC, r/Python, r/netsec, r/LocalLLaMA, r/MachineLearning, r/devops 커뮤니티에 공유 제안
- Python 및 보안 커뮤니티에서 빠른 대응 유도
사건의 의미
- AI 기반 코드 분석 도구 Claude Code가 실시간으로 악성 행위를 식별하고 보안 연구자 개입 전 단계에서 경고를 생성
- 공급망 공격이 AI 개발자 생태계를 직접 겨냥한 사례로, PyPI 계정 보안 및 자동 업데이트 검증 강화 필요성을 부각
- AI 도구가 단순 개발 보조를 넘어 사이버 위협 탐지 및 대응 자동화에 활용될 수 있음을 보여준 사례