당근 내부 PyPI Proxy를 Supply Chain Attack으로부터 보호하는 방법
당근은 내부 PyPI Proxy에 cooldown을 적용해 Supply Chain Attack을 차단했다.
LiteLLM에서 발생한 2026년 3월 24일 Supply Chain Attack을 계기로, 당근은 내부 PyPI Proxy에 cooldown 정책을 도입했다. 악성 패키지가 PyPI에 올라온 뒤 탐지·격리되기까지의 짧은 노출 구간을 줄이는 것이 핵심이었다.
기존 AWS CodeArtifact를 직접 쓰면 로컬, CI, Dockerfile마다 AWS 자격증명과 토큰 발급 절차를 따로 맞춰야 했다. 당근은 앞단에 얇은 프록시를 두고 사용자는 pip나 uv에 단일 index만 넣도록 단순화했으며, 프록시는 CodeArtifact 인증 헤더를 붙여 요청을 전달하고 대용량 wheel 파일은 8KB 단위로 스트리밍했다.
쿨다운 필터는 PEP 503의 HTML 응답만으로는 업로드 시점을 알 수 없다는 한계를 PEP 691 JSON으로 보완했다. 같은 패키지의 HTML과 JSON을 동시에 받아 JSON의 upload-time을 기준으로 최근 업로드된 파일 링크를 HTML에서 제거한 뒤, 필터링된 결과를 클라이언트에 반환했다.
- 토큰은 boto3가 허용하는 최단 수명인 900초(15분) 로 발급하고, 만료 300초 전에 자동 갱신했다.
- 갱신 타이밍에는 ±60초 jitter를 넣어 여러 인스턴스의 동시 갱신 폭주를 피했다.
/health는 프로세스 생존 여부뿐 아니라 현재 토큰의 유효성까지 점검했다.- 정책은 Central Dogma로 관리해 활성화 여부, 기간,
exclude목록을 실시간으로 바꿀 수 있게 했다.
이 구조로 내부 Python 패키지 트래픽이 하나의 진입점으로 모였고, Prometheus로 다운로드 현황도 한눈에 볼 수 있게 됐다. 이후 2026년 4월 30일 PyTorch Lightning(2.6.2, 2.6.3)을 노린 후속 공격도 이 프록시에서 차단됐다. 다만 cooldown만으로는 패치 배포 지연이나 기존 악성 패키지를 모두 막을 수 없어, 긴급 예외 처리와 dependency audit을 함께 운용해야 한다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.
