LiteLLM Python package compromised by supply-chain attack
litellm 1.82.8 PyPI 패키지의 .pth 파일이 Python 시작 시 자동 실행되는 자격증명 탈취 스크립트를 포함해 공급망 침해 사고 발생
AI 요약
Context
PyPI에 배포된 litellm 1.82.8 wheel 패키지에 litellm_init.pth라는 악성 .pth 파일(34,628바이트)이 포함되어 있으며, Python 인터프리터 시작 시 자동으로 실행된다. 이는 litellm을 import하지 않아도 작동하므로 기존의 소스 코드 감사로는 적발이 어려운 공급망 침해 사례이다.
Technical Solution
- .pth 파일 메커니즘 악용: site-packages/ 내 .pth 파일을 Python 인터프리터 시작 시 자동 실행되는 특성을 이용해 import 명령 없이 payload 실행
- 이중 Base64 인코딩으로 난독화: 페이로드를 Base64로 두 번 인코딩하여 간단한 grep 기반 감지 우회
- 다단계 정보 수집 구현: 시스템 정보(hostname, uname, IP 주소) → 환경변수 → SSH 키(id_rsa, id_ed25519, id_ecdsa, id_dsa) → Git 자격증명(~/.gitconfig, ~/.git-credentials) → AWS 자격증명(~/.aws/credentials, ~/.aws/config, IMDS 토큰) → Kubernetes 시크릿(~/.kube/config, /etc/kubernetes/admin.conf, /etc/kubernetes/kubelet.conf, /etc/kubernetes/controller-manager.conf, /etc/kubernetes/scheduler.conf) → GCP 자격증명(~/.config/gcloud/application_default_credentials.json) → Azure 자격증명(~/.azure/) → Docker 설정(~/.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 설정파일) → Webhook URL(Slack/Discord)을 순차적으로 수집
- AES-256-CBC 암호화 및 RSA 공개키 암호화 조합: 수집된 데이터를 openssl rand로 생성한 32바이트 AES-256 세션키로 암호화하고, 이 세션키를 hardcoded된 4096비트 RSA 공개키(첫 64자: MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvahaZDo8mucujrT15ry+...)로 재암호화
- tpcp.tar.gz로 패킹 및 https://models.litellm.cloud/로 exfiltration: 암호화된 데이터 파일과 암호화된 AES 키를 tar.gz 형식으로 압축한 뒤 curl을 통해 POST 요청으로 공격자 서버(litellm.cloud 도메인, 공식 litellm.ai와 다름)로 전송
Key Takeaway
PyPI와 같은 중앙 집중식 패키지 저장소의 신뢰 체인이 compromised된 경우, 소스 코드 레벨의 감지가 불가능한 runtime 실행 메커니즘(.pth 파일)을 통해 광범위한 자격증명 탈취가 가능하므로, 조직은 공급망 보안과 별도로 시스템 레벨의 프로세스 모니터링(Python 시작 시 생성되는 subprocess 감지) 및 egress 트래픽 필터링이 필요하다.
실천 포인트
AI/ML 엔지니어 및 DevOps 팀에서 Python 프로젝트의 의존성을 관리할 때, 피치 버전까지 명시하여 고정(litellm==1.82.7이 아닌 1.82.8 설치 차단)하고, site-packages/ 디렉토리의 .pth 파일 존재 여부를 정기적으로 감사하며, 프로덕션 환경에서는 egress 방화벽 규칙으로 알려지지 않은 외부 도메인(models.litellm.cloud 같은 오타 도메인)으로의 POST 요청을 차단하면 유사한 공급망 침해의 피해를 경감할 수 있다.