PyPI 보안팀 공식 공급망 공격 사고 보고서: LiteLLM·Telnyx 악성 패키지 사건 그리고 방어하기
(blog.pypi.org)🔑 핵심 요약
Trivy 의존성 취약점을 통해 API 토큰이 탈취되었고, 이를 발판으로 PyPI에 litellm과 telnyx 패키지의 악성 버전이 배포됐다. 악성코드는 설치 즉시 실행되어 민감한 자격증명과 파일을 수집한 뒤 외부 서버로 유출했다.
⚠️ 이번 악성코드가 특별한 이유
기존 PyPI 악성 패키지 대부분은 새로 만든 패키지(타이포스쿼팅 등)였다. 이번 공격은 다르다. 이미 널리 사용 중인 오픈소스 패키지에 악성코드를 주입하는 방식이다.
주입 경로는 두 가지다:
- 보안이 취약한 저장소·릴리스 워크플로·인증을 가진 오픈소스 프로젝트를 직접 공략
- 최신 버전을 설치하는 개발자 머신에서 API 토큰·키를 탈취
탈취한 PyPI 또는 GitHub API 토큰으로 또 다른 오픈소스 패키지를 추가 침해하는 연쇄 공격 구조다.
📅 사건 타임라인
LiteLLM
악성 버전 노출 기간 중 119,000회 이상 다운로드되었다.
PyPI는 13건의 신고를 "악성코드 신고" 기능을 통해 접수했다.
| 단계 | 소요 시간 |
|---|---|
| 업로드 → 첫 신고 | 1시간 19분 |
| 첫 신고 → 격리 | 1시간 12분 |
| 총 노출 시간 | 2시간 32분 |
LiteLLM은 주당 약 1,500~2,000만 건 설치되며, 분당 약 1,700건 설치된다. 이 중 약 40~50%가 버전 미고정 상태로 최신 버전을 자동으로 받고 있었다.
Telnyx
telnyx 패키지는 PyPI의 신뢰 제보자 풀(trusted reporters) 덕분에 자동 격리가 이루어졌다.
| 단계 | 소요 시간 |
|---|---|
| 업로드 → 첫 신고 | 1시간 45분 |
| 첫 신고 → 격리 | 1시간 57분 |
| 총 노출 시간 | 3시간 42분 |
🛡️ 개발자를 위한 보안 권고
1. 의존성 쿨다운 (Dependency Cooldowns)
최근 배포된 패키지를 일정 기간 설치하지 않도록 설정해, 보안 연구자와 PyPI 관리자가 대응할 시간을 확보하는 전략이다.
uv — 현재 지원 중:
# ~/.config/uv/uv.toml 또는 pyproject.toml
[tool.uv]
exclude-newer = "P3D" # 3일 이내 배포된 패키지 제외
pip v26.1 — 4월 중 지원 예정:
# ~/.config/pip/pip.conf
[install]
uploaded-prior-to = P3D
⚠️ 쿨다운은 만능이 아니다. 보안 패치가 필요한 경우에는 즉시 설치해야 하므로, Dependabot·Renovate 같은 취약점 스캔 도구와 병행해야 한다.
2. 의존성 잠금 (Lock Files)
버전만 기록하는 pip freeze는 락 파일이 아니다. 보안을 위해서는 체크섬/해시가 포함된 진짜 락 파일이 필요하다.
권장 도구:
-
uv lock -
pip-compile --generate-hashes -
pipenv
🔒 오픈소스 관리자를 위한 보안 권고
1. 릴리스 워크플로 보안 강화
-
안전하지 않은 트리거 사용 금지 — GitHub Actions의
pull_request_target은 특히 위험 - 파라미터·입력값 무해화 — 환경변수로 전달해 템플릿 인젝션 방지
- 가변 참조 사용 금지 — Git 태그 대신 커밋 SHA 사용, 의존성 락 파일 유지
- 검토 필요 배포 설정 — Trusted Publishers + GitHub Environments 조합으로 배포 시 추가 승인 요구
GitHub Actions 사용자라면 Zizmor 도구로 워크플로 취약점을 점검할 것을 권장한다.
2. API 토큰 대신 Trusted Publishers 사용
- API 토큰은 장기 유효해서 탈취 시 즉각 탐지가 어렵다
- Trusted Publishers는 단기 토큰을 사용해 탈취되더라도 즉시 사용해야 하므로 위험이 낮다
- Digital Attestations를 통해 정상 릴리스 워크플로를 거치지 않은 배포를 하위 사용자가 탐지할 수 있다
3. 2FA 필수 적용
PyPI는 2024년부터 패키지 배포에 2FA를 의무화했다. 하지만 PyPI 계정뿐 아니라 GitHub, GitLab, 이메일 등 오픈소스 개발에 연관된 모든 계정에 2FA(가능하면 하드웨어 키)를 적용해야 한다.
💰 이 활동을 지원하려면
PyPI 보안 활동은 Python Software Foundation(PSF) 지원을 통해 가능하다. PSF 스폰서십 프로그램, 직접 후원, 또는 sponsors@python.org로 문의할 수 있다.
Mike Fiedler와 Seth Larson의 PyPI 보안 엔지니어 직책은 Alpha-Omega의 지원을 받고 있다.