# PyPI 보안팀 공식 공급망 공격 사고 보고서: LiteLLM·Telnyx 악성 패키지 사건 그리고 방어하기

> Clean Markdown view of GeekNews topic #28171. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=28171](https://news.hada.io/topic?id=28171)
- GeekNews Markdown: [https://news.hada.io/topic/28171.md](https://news.hada.io/topic/28171.md)
- Type: news
- Author: [darjeeling](https://news.hada.io/@darjeeling)
- Published: 2026-04-03T22:04:56+09:00
- Updated: 2026-04-03T22:04:56+09:00
- Original source: [blog.pypi.org](https://blog.pypi.org/posts/2026-04-02-incident-report-litellm-telnyx-supply-chain-attack/)
- Points: 5
- Comments: 1

## Topic Body

#### 🔑 핵심 요약  
  
Trivy 의존성 취약점을 통해 API 토큰이 탈취되었고, 이를 발판으로 PyPI에 `litellm`과 `telnyx` 패키지의 악성 버전이 배포됐다. 악성코드는 설치 즉시 실행되어 민감한 자격증명과 파일을 수집한 뒤 외부 서버로 유출했다.  
  
---  
  
#### ⚠️ 이번 악성코드가 특별한 이유  
  
기존 PyPI 악성 패키지 대부분은 **새로 만든 패키지**(타이포스쿼팅 등)였다. 이번 공격은 다르다. **이미 널리 사용 중인 오픈소스 패키지에 악성코드를 주입**하는 방식이다.  
  
주입 경로는 두 가지다:  
- 보안이 취약한 저장소·릴리스 워크플로·인증을 가진 오픈소스 프로젝트를 직접 공략  
- 최신 버전을 설치하는 개발자 머신에서 API 토큰·키를 탈취  
  
탈취한 PyPI 또는 GitHub API 토큰으로 또 다른 오픈소스 패키지를 추가 침해하는 **연쇄 공격** 구조다.  
  
---  
  
#### 📅 사건 타임라인  
  
##### LiteLLM  
  
악성 버전 노출 기간 중 **119,000회 이상** 다운로드되었다.  
PyPI는 13건의 신고를 ["악성코드 신고" 기능](https://blog.pypi.org/posts/2024-03-06-malware-reporting-evolved/)을 통해 접수했다.  
  
| 단계 | 소요 시간 |  
|------|-----------|  
| 업로드 → 첫 신고 | 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** — 현재 지원 중:  
```toml  
# ~/.config/uv/uv.toml 또는 pyproject.toml  
[tool.uv]  
exclude-newer = "P3D"  # 3일 이내 배포된 패키지 제외  
```  
  
**pip v26.1** — 4월 중 지원 예정:  
```ini  
# ~/.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](https://github.com/zizmorcore/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](mailto:sponsors@python.org)로 문의할 수 있다.  
  
> Mike Fiedler와 Seth Larson의 PyPI 보안 엔지니어 직책은 **Alpha-Omega**의 지원을 받고 있다.

## Comments



### Comment 54930

- Author: yjcho9317
- Created: 2026-04-08T18:27:12+09:00
- Points: 1

MCP 서버 만들어서 npm에 올려봤는데, 이 사건 보고 좀 섬뜩했습니다.  
  
MCP 서버들도 결국 npm, PyPI에 그대로 올라가는데 버전 고정 안 하고 설치하는 경우 꽤 많고, 신고 체계나 trusted publisher 같은 것도 아직 없습니다. LiteLLM이 2시간 조금 넘게 노출됐는데도 다운로드가 저 정도면, 이쪽은 한 번 들어오면 꽤 오래 남을 것 같다는 생각이 들더라고요.  
  
Claude Code 쪽도 보니까 pip install 할 때 이런 보호 설정이 제대로 걸리지 않는 경우가 있어서, 에이전트가 알아서 패키지 깔아버리는 흐름이면 어디서 막아야 하는지 애매합니다.
