#Backend

How We Protect Karrot’s Internal PyPI Proxy from Supply Chain Attacks

How We Protect Karrot’s Internal PyPI Proxy from Supply Chain Attacks
01

Summary

"업로드 직후엔 설치 금지!" 당근이 공급망 공격을 막는 영리한 방법

AWS CodeArtifact와 커스텀 프록시로 구현한 철통 보안 파이썬 패키지 관리 전략

최근 빈번해진 PyPI 공급망 공격에 대응하기 위해 당근 Python 챕터가 도입한 '디펜던시 쿨다운' 전략을 소개합니다. 단순한 프록시 서버를 넘어, PEP 691 표준을 활용해 악성 패키지가 생태계에서 검증될 시간을 벌어주는 기술적 구현 노하우를 담고 있습니다.

  • 01LiteLLM 및 PyTorch Lightning 사태로 본 공급망 공격의 메커니즘 분석
  • 02AWS CodeArtifact의 복잡한 인증 절차를 투명하게 해결한 프록시 레이어 설계
  • 03PEP 503(HTML)과 PEP 691(JSON) API를 조합하여 업로드 시점을 판별하는 필터링 기법
  • 04Central Dogma를 활용한 동적인 쿨다운 정책 제어 및 예외 처리 시스템
  • 05스트리밍 응답(8KB 청크) 구현을 통한 프록시 서버의 메모리 효율 최적화

RECOMMENDATION

오픈소스 의존성 관리가 중요한 보안 요구사항인 팀에게 강력 추천합니다. 특히 다수의 개발자가 다양한 환경에서 PyPI를 이용한다면, 개별 클라이언트 설정에 의존하기보다 당근의 사례처럼 프록시 계층에서 일괄적인 보안 정책을 적용하는 것이 훨씬 효율적이고 안전한 선택이 될 것입니다.

The Problem

LiteLLM 사례와 같이 악성 코드가 포함된 패키지가 PyPI에 업로드된 후 격리되기 전까지의 짧은 노출 시간 동안 사용자가 이를 설치하게 되는 공급망 공격 위험이 존재한다. 또한, AWS CodeArtifact를 직접 사용할 경우 모든 환경에서 복잡한 인증 과정을 거치고 토큰을 주기적으로 갱신해야 하는 운영상의 번거로움이 있다.

The Solution

AWS CodeArtifact 앞에 씬(Thin) 프록시 레이어를 구축하여 인증을 자동화하고, PEP 691 JSON API를 활용해 패키지의 업로드 시간을 확인하여 최신 패키지 설치를 유예하는 '쿨다운(Cooldown)' 정책을 도입했다. 이 정책은 Central Dogma를 통해 실시간으로 활성화 여부와 대상 패키지를 동적으로 관리할 수 있도록 설계되었다.

The Result

쿨다운 정책 도입 이후 실제로 발생한 PyTorch Lightning 공급망 공격 시도에서 악성 버전의 다운로드를 프록시 단에서 성공적으로 차단하는 성과를 거두었다. 또한 전사적으로 일관된 보안 정책을 강제할 수 있게 되었으며, 개발자들은 복잡한 설정 없이도 안전하게 패키지를 설치할 수 있게 되었다.

Trade-off

긴급한 보안 패치나 버그 수정 버전도 쿨다운 정책에 의해 배포가 지연될 수 있으므로 수동으로 예외 목록을 관리해야 하는 운영 비용이 발생한다. 또한 정책 도입 이전에 이미 업로드된 기존 악성 패키지에 대해서는 대응이 어렵다는 한계가 존재한다.

03

Key Concepts

Concept · 01

공급망 공격 (Supply Chain Attack)

소프트웨어의 개발, 배포, 업데이트 과정에 악성 코드를 삽입하여 해당 소프트웨어를 사용하는 최종 사용자에게 피해를 입히는 공격 방식이다.

  • LiteLLM 사례처럼 CI/CD 자격 증명을 탈취해 악성 버전을 PyPI에 직접 업로드하는 형태로 발생했다.
  • 악성 패키지는 환경 변수, SSH 키, 클라우드 자격 증명 등을 외부로 유출하는 페이로드를 포함한다.
Concept · 02

의존성 쿨다운 (Dependency Cooldown)

새로 배포된 패키지 버전을 즉시 신뢰하지 않고, 보안 검토나 커뮤니티의 검증이 이루어질 때까지 일정 기간 설치를 유예하는 보안 전략이다.

  • 대부분의 공급망 공격 노출 윈도우가 1주일 미만이라는 점에 착안하여 도입된 방어 기법이다.
  • 당근은 프록시 서버에서 업로드 시간을 체크하여 일정 기간이 지나지 않은 패키지 링크를 HTML 응답에서 제거한다.
Concept · 03

PEP 691 (JSON-based Simple API)

기존의 HTML 기반(PEP 503) Simple API를 보완하기 위해 정의된 JSON 기반의 파이썬 패키지 인덱스 표준 인터페이스이다.

  • HTML 응답과 달리 각 파일의 'upload-time' 필드를 포함하고 있어 정확한 배포 시점 파악이 가능하다.
  • 당근 프록시는 이 API를 사용하여 쿨다운 대상 여부를 판별하는 핵심 로직을 구현했다.