PyPI 공급망 공격 사고 보고서: LiteLLM과 Telnyx 패키지 악성코드 주입 사건
목차
개요
PyPI 보안팀이 LiteLLM과 Telnyx 패키지에 대한 공급망 공격 사고 보고서를 공개했다. 이번 공격은 기존의 타이포스쿼팅과 달리, 이미 널리 사용 중인 패키지에 악성코드를 직접 주입하는 방식으로 진행되었다. 사건 경위와 개발자 대응 방안을 정리한다.
사건 개요
Trivy 의존성의 보안 취약점을 통해 API 토큰이 유출되었다. 공격자는 이 토큰을 악용하여 litellm과 telnyx 패키지에 악성코드를 주입했다. 패키지 설치 직후 악성코드가 실행되어 자격증명과 파일을 탈취하는 구조였다.
사건 타임라인
LiteLLM 사건
LiteLLM은 주당 1,500~2,000만 건이 설치되는 인기 패키지이다. 악성 버전은 119,000회 이상 다운로드되었다. 총 노출 시간은 2시간 32분이었다. 짧은 시간이었지만 대규모 다운로드 수를 고려하면 영향 범위가 상당하다.
Telnyx 사건
Telnyx 패키지는 신뢰 제보자 풀 덕분에 자동 격리되었다. 총 노출 시간은 3시간 42분이었다. LiteLLM 대비 상대적으로 빠르게 격리가 이루어졌다.
공격의 특이점
기존 PyPI 악성 패키지 대부분은 새로 만든 패키지(타이포스쿼팅 등)를 이용했다. 이번 공격은 이미 널리 사용 중인 오픈소스 패키지에 악성코드를 직접 주입하는 방식이었다. 신뢰도가 높은 패키지가 공격 대상이 되었기 때문에 탐지가 더 어려웠다. 이는 공급망 공격의 위험성이 한 단계 더 높아졌음을 보여준다.
개발자 대응 방안
의존성 쿨다운
최신 패키지 배포 후 일정 기간 설치를 지연하는 방식이다. 이를 통해 악성 버전이 배포되더라도 즉시 영향을 받지 않을 수 있다.
uv에서는 다음과 같이 설정할 수 있다.
1
exclude-newer = "P3D"
이 설정은 배포 후 3일 이내의 패키지를 제외한다. pip v26.1에서도 4월 중 해당 기능이 지원될 예정이다.
의존성 잠금
체크섬과 해시를 포함한 락 파일 사용이 권장된다. uv lock, pip-compile, pipenv 등의 도구를 활용할 수 있다. 락 파일을 통해 검증되지 않은 버전의 설치를 방지할 수 있다.
오픈소스 관리자 보안 조치
릴리스 워크플로를 강화해야 한다. GitHub Actions에서 pull_request_target 트리거를 제거하는 것이 권장된다. Zizmor 도구로 워크플로 취약점을 점검할 수 있다.
Trusted Publishers를 활용해야 한다. 기존 API 토큰 대신 단기 토큰(Short-lived Token)을 사용하는 방식이다. 토큰 유출 시 피해를 최소화할 수 있다.
2FA(이중 인증)를 필수로 적용해야 한다. PyPI, GitHub, GitLab, 이메일 등 모든 관련 계정에 적용해야 한다.
오픈소스 보안 강화를 위해 Python Software Foundation(PSF) 스폰서십 프로그램도 활용할 수 있다.
결론
이번 사건은 신뢰받는 패키지도 공급망 공격의 대상이 될 수 있음을 보여준다. 개발자는 의존성 쿨다운과 락 파일을 통해 즉각적인 위험을 줄일 수 있다. 오픈소스 관리자는 Trusted Publishers, 2FA, 워크플로 보안 점검을 통해 패키지 탈취를 방지해야 한다.