본문으로 건너뛰기
0
r/jeffnews HN 약 6분

LiteLLM PyPI 공급망 공격 - 발견부터 공개까지 72분의 기록

security

요약

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

기사 전체 정리

LiteLLM PyPI 공급망 공격 - 발견부터 공개까지 72분의 기록

⚠️주의

> 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-legacyuvx로 실행될 때 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분 만에 해냄

중요

> 이 사건은 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가 공격 도구로만 쓰이는 게 아니라 방어 속도도 극적으로 높일 수 있다는 걸 보여줌.

댓글

댓글

댓글을 불러오는 중...

security

4월 24일까지 옵트아웃 안 하면 GitHub이 너의 프라이빗 레포로 AI 학습함

GitHub이 Free/Pro/Pro+ Copilot 사용자의 인터랙션 데이터를 4월 24일부터 AI 모델 훈련에 활용한다고 발표함. 옵트아웃하지 않으면 자동 적용되며, Business/Enterprise는 제외됨.

security

덴버 횡단보도 신호기 해킹당해 반트럼프 메시지 송출됨

덴버시 횡단보도 음성 안내기 2대가 공장 초기 비밀번호 미변경으로 해킹당해 반트럼프 메시지가 송출된 사건. 작년 캘리포니아에서도 동일한 사례가 있었으며, 블루투스 접근이 가능한 장비의 기본 비밀번호 관리 문제가 다시 부각됨.

security

EU 의회, 'Chat Control' 대량 감시 단 1표 차로 최종 폐기 — 진짜 아동보호로의 전환점

EU 의회가 미국 빅테크의 개인 메시지 무차별 스캔(Chat Control)을 단 1표 차이로 최종 부결시킴. 4월 4일부터 Meta·Google·Microsoft의 유럽 시민 채팅 대량 감시가 중단됨. 다만 Chat Control 2.0 영구 규정 협상과 메신저 나이 인증 의무화가 다음 전투로 남아 있음.

security

Meta, 뉴멕시코 배심원 재판서 아동 성착취 방치 혐의 유죄 평결 ㄷㄷ — 3750억 배상 명령

미국 뉴멕시코주 배심원단이 Meta가 플랫폼에서 아동을 성적 포식자로부터 보호하지 않았다는 혐의에 대해 전 항목 유죄 평결을 내렸음. 배상액은 약 $3억 7500만(한화 약 5천억 원)으로 결정됐고, 이건 Meta가 배심원 재판에서 아동 안전 문제로 실제 책임을 진 최초의 사례임. Meta는 당연히 항소 예정 ㅋㅋ

security

EU가 또 당신 DM이랑 사진 뒤지려 함 ㄷㄷ (feat. 보수파의 역주행)

유럽의회가 한 번 NO라고 했는데 EPP(유럽국민당)가 3월 26일 목요일에 재표결 강행하려는 중임. 개인 메시지·사진 전수 스캔하는 법안인데, 이미 부결된 걸 뒤집으려는 거라 논란 ㄹㅇ 폭발.