LiteLLM 1.107.0 변조, AI 키 탈취 노렸다

대규모 언어 모델 게이트웨이 도구인 LiteLLM이 10월 21일 공급망 공격을 당했다. 클라우드 보안 기업 Wiz는 변조된 LiteLLM 1.107.0이 같은 날 PyPI에 올라왔고, GHCR과 Docker Hub에서 v1.107.0, latest, main-latest, main-stable 태그가 붙은 이미지에도 같은 정보 탈취 프로그램이 심겼다고 공개했다. 공식이 밝힌 가장 최근의 안전한 버전은 v1.106.2다.

LiteLLM은 BerriAI가 개발했으며, 사내에 프록시를 한 겹 두고 통합 인터페이스로 OpenAI, Anthropic, Bedrock 등 100개가 넘는 모델 서비스에 요청을 전달하는 방식으로 흔히 쓰인다. 프록시 뒤에는 각 업체의 API 키가 저장돼 있는데, 이번 공격이 노린 곳이 바로 여기다.

설치하자마자 훔치기 시작한다

악성 패키지는 site-packages 루트에 cook.pth, cook.py, sitecustomize.py 세 파일을 둔다. 앞의 두 파일은 파이썬의 .pth 메커니즘을 이용하므로 인터프리터가 시작되기만 하면 실행되며, 업무 코드가 LiteLLM을 import할 필요도 없다.

내부에서 privcollect라고 불리는 이 탈취 프로그램은 16개 모듈로 이뤄져 있으며, 노리는 대상은 다음과 같다.

  • Chrome, Firefox, Edge, Safari의 브라우저 자격 증명과 쿠키
  • AWS, GCP, Azure의 클라우드 자격 증명
  • OpenAI, Anthropic, Cohere 등 AI 업체의 API 키
  • SSH, GPG 개인 키와 셸 기록
  • LiteLLM Proxy의 PostgreSQL 데이터베이스에서 직접 조회한 상위 업체 자격 증명

데이터는 먼저 AES-256-CBC로 암호화되고 그 키는 다시 RSA-4096으로 감싸진 뒤, 공격자가 등록한 위장 도메인 www.litellm[.]dev로 HTTP POST를 통해 전송된다. sitecustomize.py는 Linux와 macOS에서만 동작하며, GitHub의 '데드 드롭' 저장소에서 2단계 주소를 가져온다. Wiz에 따르면 이 파일에는 테스트 값 외에는 내용이 채워진 적이 없고, GitHub는 해당 저장소를 이미 삭제했다.

타임라인을 펼쳐 보면

Wiz가 공개한 UTC 시각을 바탕으로 각 구간을 대략 계산하면 다음과 같다.

단계시각(UTC)지속 시간
위장 저장소에 커밋 10건 푸시08:56–10:46약 1시간 50분
PyPI에 악성 버전 게시11:39–13:20약 1시간 41분
변조된 Docker 태그 게시13:53 전후 내려감PyPI 게시 시점부터 약 2시간 14분
공격자가 AWS 자격 증명 검증16:20–17:01외부 전송 후 약 4.5시간

PyPI에 올라 있던 한 시간 남짓은 길지 않아 보이지만, latest 같은 태그는 수많은 CI 파이프라인과 Kubernetes 배포가 자동으로 가져가므로 노출 범위는 이 시간 동안 이미지를 다시 빌드한 환경이 얼마나 되는지에 크게 좌우된다. Wiz는 다운로드 수를 밝히지 않았고, 피해를 입은 조직의 수도 현재로서는 확인할 수 없다.

공격자는 자격 증명을 확보한 뒤 침해된 CI 러너와 Kubernetes 노드의 AWS 인스턴스 역할로 sts:GetCallerIdentity, bedrock:ListFoundationModels 등의 API를 호출했다. Wiz는 이것이 남의 클라우드 계정을 도용해 대규모 언어 모델을 공짜로 쓰는 LLMjacking 수법과 일치한다고 본다. 일부 환경에서는 공격자가 통상적인 정찰 차원에서 IAM도 열거했다.

침투 경로는 GitHub 토큰으로 의심

공격자가 푸시한 커밋 10건은 위장 저장소 Berri-AI/litellm에 올라갔다. 앞의 9건에는 GitHub 서명이 있었지만 마지막 한 건은 서명이 없고 이메일도 바뀌어 있었다. BerriAI 측의 설명은 다음과 같다.

"malicious actions were taken through three engineers' GitHub accounts"
(악의적인 행위는 엔지니어 세 명의 GitHub 계정을 통해 이뤄졌다.)

LiteLLM은 이들 GitHub CLI OAuth 토큰이 인터넷에 노출된 내부 배포 환경에서 유출됐다고 의심하고 있으며, 최근 패치된 취약점과 관련됐을 수 있다. 다만 Wiz는 이 부분이 아직 확인되지 않았다고 분명히 적었다. BerriAI는 문제의 토큰을 모두 폐기했다고 밝혔다. 1.107.0을 사용했거나 해당 시간대에 위 이미지를 받은 팀은 해당 머신에서 읽을 수 있는 클라우드 자격 증명, 모델 키, SSH 개인 키를 모두 교체해야 한다.

참고 출처: Wiz 리서치 블로그, CocoLoop, Wiz 위협 인텔리전스 센터 공지, BerriAI 공식 성명. 영향받는 버전과 이미지 태그, 악성 파일 이름, 각 단계의 UTC 시각을 확인했다.