🔑 핵심 요약

Trivy 의존성 취약점을 통해 API 토큰이 탈취되었고, 이를 발판으로 PyPI에 litellmtelnyx 패키지의 악성 버전이 배포됐다. 악성코드는 설치 즉시 실행되어 민감한 자격증명과 파일을 수집한 뒤 외부 서버로 유출했다.


⚠️ 이번 악성코드가 특별한 이유

기존 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의 지원을 받고 있다.