Zatruty pakiet LiteLLM wykradał klucze i hasła z 500 tysięcy maszyn programistów
Złośliwa wersja popularnej biblioteki Pythona dla AI działała automatycznie przy każdym uruchomieniu interpretera. Atak trwał trzy godziny, ale mógł dotknąć pół miliona urządzeń.
24 marca 2026 roku na oficjalnym repozytorium PyPI pojawiły się dwie zatrute wersje biblioteki LiteLLM — 1.82.7 oraz 1.82.8. To opensource’owa bramka API ułatwiająca programistom łączenie się z wieloma modelami językowymi. Pakiet ma na liczniku ponad 97 milionów pobrań i jest używany w tysiącach projektów związanych z AI. Złośliwy kod działał automatycznie przy każdym uruchomieniu Pythona, wykradając dane uwierzytelniające z zainfekowanych maszyn.
Automatyczne uruchomienie bez importu
Atakujący wykorzystali mechanizm Python Startup Hooks, ukrywając złośliwy kod w pliku o rozszerzeniu .pth. Wstrzyknięty do pakietu plik litellm_init.pth był automatycznie wykonywany przy każdym starcie interpretera Pythona. Programiści nie musieli nawet pisać import litellm w swoim kodzie. Wystarczyło, że zainstalowali paczkę — na przykład jako zależność innego projektu — a ukryty skrypt uruchamiał się w tle przy każdym wywołaniu Pythona.
Istotna różnica w porównaniu z typowymi atakami na łańcuch dostaw, gdzie złośliwy kod wymaga jawnego zaimportowania biblioteki. Tutaj sama instalacja pakietu wystarczała do kompromitacji systemu. Mechanizm .pth jest rzadko wykorzystywany w atakach, co mogło opóźnić wykrycie zagrożenia.
Co zostało wykradzione
Złośliwy skrypt systematycznie przeszukiwał system w poszukiwaniu wrażliwych danych. Zbierał klucze SSH, zmienne środowiskowe zawierające klucze API, pliki konfiguracyjne Dockera oraz dane uwierzytelniające do chmur AWS, GCP i Azure. Wykradał także całe konfiguracje klastrów Kubernetes, klucze prywatne TLS, hasła do baz danych PostgreSQL, MySQL i Redis, a nawet pliki portfeli kryptowalutowych.
Szczególnie niebezpieczne było zbieranie historii powłoki — plików bash_history i zsh_history — gdzie programiści często zapisują hasła wpisywane bezpośrednio w terminalu. Wszystkie zebrane dane były pakowane do archiwum tpcp.tar.gz, szyfrowane i wysyłane na serwer kontrolowany przez napastników pod adresem models.litellm.cloud. Szacuje się, że ofiarą ataku mogło paść nawet 500 tysięcy urządzeń.
Błąd hakerów ograniczył skalę katastrofy
Atakujący popełnili istotny błąd implementacyjny. Złośliwy skrypt uruchamiał w tle kolejny proces Pythona, co powodowało, że nowy proces ponownie czytał zatruty plik .pth, odpalając kolejnego Pythona. Powstała fork bomba — nieskończona pętla procesów prowadząca do wyczerpania pamięci RAM i zawieszenia systemu.
U części programistów używających środowisk takich jak Cursor powodowało to natychmiastowe zużycie zasobów i zwieszkę komputera. Dzięki awariom sprzętu wywoływanym przez kod hakerów atak został szybko zauważony. Zatrute wersje pakietu usunięto z PyPI po niespełna trzech godzinach od publikacji. Nie u wszystkich użytkowników kod się jednak zapętlał — część maszyn mogła zostać zainfekowana bez widocznych objawów.
Atak na łańcuch dostaw przez skaner Trivy
Za atakiem stoi grupa TeamPCP, która dostała się do infrastruktury LiteLLM poprzez wcześniejsze zhackowanie skanera podatności Trivy używanego w procesie CI/CD. Klasyczny atak na łańcuch dostaw — atakujący nie włamali się bezpośrednio do repozytorium LiteLLM, lecz skompromitowali narzędzie wykorzystywane w automatyzacji budowania i testowania kodu.
Trivy to popularny skaner bezpieczeństwa dla kontenerów i zależności, używany przez tysiące projektów. Jego kompromitacja umożliwiła TeamPCP wstrzyknięcie złośliwego kodu do procesu publikacji pakietu. Wcześniejsze doniesienia wskazywały, że podobne ataki mogą być przeprowadzane nawet przez boty AI wysyłające złośliwe Pull Requesty na GitHubie.
Co robić po wykryciu infekcji
Administratorzy i programiści powinni natychmiast sprawdzić, czy w systemie lub kontenerach zainstalowano wersję 1.82.7 lub 1.82.8 pakietu LiteLLM. Można to zrobić poleceniem pip show litellm. Należy także przeszukać katalogi site-packages w poszukiwaniu pliku litellm_init.pth i usunąć go w razie znalezienia.
Jeśli zainfekowana wersja została zainstalowana, trzeba założyć, że wszystkie hasła, klucze API i tokeny znajdujące się na tej maszynie — w tym te w plikach .env — są w rękach atakujących. Wymagana jest natychmiastowa rotacja wszystkich danych uwierzytelniających: kluczy SSH, tokenów dostępu do chmur, haseł do baz danych i kluczy API używanych w projektach. Warto także przeanalizować logi sieciowe w poszukiwaniu połączeń z domeną models.litellm.cloud.
Szerszy kontekst ataków na ekosystem Pythona
Atak na LiteLLM to kolejny przykład rosnącego zagrożenia dla repozytoriów pakietów open source. PyPI, podobnie jak npm czy RubyGems, stało się atrakcyjnym celem dla grup przeprowadzających ataki na łańcuch dostaw. Automatyzacja instalacji zależności i zaufanie do popularnych bibliotek czynią jeden skompromitowany pakiet zagrożeniem dla setek tysięcy projektów w ciągu godzin.
Incydent pokazuje także, jak trudno zabezpieczyć cały łańcuch narzędzi deweloperskich. Kompromitacja skanera bezpieczeństwa Trivy — narzędzia mającego chronić przed podatnościami — podkreśla, że atakujący celują nie tylko w kod aplikacji, ale także w infrastrukturę CI/CD i narzędzia używane przez programistów na co dzień. Organizacje powinny rozważyć wdrożenie dodatkowych warstw weryfikacji pakietów, takich jak podpisywanie cyfrowe i monitoring integralności zależności w czasie rzeczywistym.


