.pth, który uruchamiał ładunek przy każdym wywołaniu Pythona, nawet jeśli LiteLLM nie był jawnie importowany TeamPCP użył skradzionych poświadczeń publikacji PyPI, aby wypchnąć te wydania bezpośrednio do PyPI, omijając normalny proces wydawniczy LiteLLM oparty na GitHub . Grupa skompresowała również dodatkową złośliwą aktywność w tym samym oknie, w tym zdewastowała 15 repozytoriów organizacji, wyczyściła 182 prywatne repozytoria i upubliczniła 70 prywatnych repozytoriów BerriAI (organizacji macierzystej LiteLLM)
.
Atak jest podręcznikowym przykładem kaskadowego naruszenia łańcucha dostaw. TeamPCP nie zaatakował bezpośrednio LiteLLM. Zamiast tego wykorzystał łańcuch zaufania:
pip install litellm==1.82.71.82.8 — lub której potok CI/CD automatycznie pobrał najnowszą wersję — miała swoje środowisko budowania przeszukane w poszukiwaniu tajemnic.Jak zauważył CloudSEK, „atak pochodził od zależności Trivy używanej w [LiteLLM] przepływie pracy skanowania bezpieczeństwa CI/CD” . Nie ma CVE dla samego naruszenia LiteLLM, ponieważ nic w kodzie LiteLLM nie było podatne; podatność leżała w relacji zaufania między potokiem budowania LiteLLM a jego narzędziem do skanowania bezpieczeństwa
.
Pełna skala kradzieży danych stała się jasna dopiero pięć miesięcy później, gdy kilka firm zajmujących się analizą zagrożeń opublikowało swoje analizy:
.env, ciągi połączeń do baz danych, tajemnice logowania Slack, tajemnice klienta Salesforce i poświadczenia Git FBI wydało błyskawiczne ostrzeżenie 2 lipca 2026 r. (FLASH-20260702-01) ostrzegające, że powiązani aktorzy prawdopodobnie będą używać danych uwierzytelniających eksfiltrowanych podczas kampanii TeamPCP na długo po początkowym naruszeniu. Poradził organizacjom, aby zmieniły tajemnice CI/CD, tokeny publikacji i poświadczenia chmurowe dostępne podczas odpowiednich okien narażenia .
Narażone domeny obejmowały główne przedsiębiorstwa z sektorów technologicznego, finansowego, przemysłowego i telekomunikacyjnego. Potwierdzone nazwane organizacje z wielu źródeł obejmują :
Zbiór danych CloudSEK zawierał „dopasowania o wysokim poziomie ufności” powiązane z domenami korporacyjnymi, repozytoriami, poświadczeniami lub infrastrukturą należącą do tych organizacji . Hudson Rock zauważył, że archiwum zawierało poświadczenia „nadal ważne” dla wielu z tych organizacji miesiące po incydencie
.
Pięć miesięcy po naruszeniu, niezależny badacz bezpieczeństwa Kevin Beaumont przeprowadził kluczowy test rzeczywistości. Po raporcie Ars Technica o naruszeniu, Beaumont przetestował skompromitowane poświadczenia od dużej amerykańskiej firmy technologicznej, która publicznie twierdziła, że „zmieniła wszystko”. Stosując politykę odpowiedzialnego ujawniania, przetestował poświadczenia i odkrył, że „prawie każde z nich działało” — co oznacza, że organizacja w rzeczywistości nie zmieniła swoich skompromitowanych tajemnic, mimo że twierdziła inaczej .
To odkrycie podkreśla kluczową lekcję: deklaracje o rotacji poświadczeń a faktyczna rotacja poświadczeń to często dwie różne rzeczy, a skradzione poświadczenia z tego ataku pozostają realnym zagrożeniem.
Traktuj wszystkie tajemnice, klucze API, poświadczenia chmurowe, klucze SSH, konfiguracje Kubernetes i wszelkie inne poufne dane, które były dostępne dla wersji LiteLLM 1.82.7 lub 1.82.8, jako w pełni skompromitowane. Natychmiastowa zmiana każdego poświadczenia, które mogło zostać narażone podczas okna 24 marca 2026 r., jest niezbędna — niezależnie od tego, czy organizacja uważa, że już je zmieniła .
Atak jest uważany za największe naruszenie łańcucha dostaw infrastruktury AI w 2026 r., a skradzione dane pozostają trwałym zagrożeniem dla kolejnych włamań, co pokazał test Beaumonta . FBI ostrzegło, że kolejne ataki są prawdopodobne, a skarbnica ważnych poświadczeń w archiwum 153 GB jest darem, który wciąż przynosi korzyści dla aktorów zagrożeń.
Jeśli Twoja organizacja korzystała z LiteLLM w jakikolwiek sposób 24 marca 2026 r., zakładaj naruszenie. Sprawdź obecność złośliwego pliku .pth (litellm_init.pth) i backdoora trwałości (~/.config/sysmon/sysmon.py), zweryfikuj zainstalowaną wersję za pomocą pip show litellm.