Deweloperzy biblioteki Python LiteLLM, która rejestruje 95 milionów pobrań miesięcznie i 3,5 miliona w ciągu ostatnich 24 godzin, poinformowali o kompromitacji projektu. Napastnicy zdołali przechwycić dane logowania maintenancera i opublikować w PyPI dwie złośliwe wersje — 1.82.7 i 1.82.8, zawierające kod do kradzieży kluczy i haseł z systemów użytkowników. W tej chwili złośliwe wersje zostały usunięte z PyPI, a projekt został tymczasowo wstrzymany do zakończenia dochodzenia.
Token dostępu do konta LiteLLM w PyPI trafił w ręce napastników z powodu użycia w systemie ciągłej integracji skanera bezpieczeństwa zależności trivvy. W końcu lutego napastnicy zdołali uzyskać dostęp do infrastruktury projektu Trivy, wykorzystując lukę w przetwarzaniu pull_request_target, uruchamianym w systemie ciągłej integracji Trivy. Po kompromitacji napastnicy opublikowali złośliwe wydania Trivy 0.69-0.69, podmienili GitHub Action handler trivy-action oraz umieścili zmodyfikowany obraz Dockera z Trivy.
24 marca o 11:30 (MSK) przechwycone dane logowania maintenancera LiteLLM (krrishdholakia) zostały wykorzystane do bezpośredniego opublikowania złośliwych wersji LiteLLM 1.82.7 i 1.82.8 w PyPI, omijając oficjalny GitHub CI/CD. Repozytorium projektu na GitHubie nie ucierpiało — złośliwa aktywność była obserwowana tylko w PyPI. W wydaniu LiteLLM 1.82.7 złośliwy kod został osadzony w pliku litellm/proxy/proxy_server.py i był aktywowany podczas importowania litellm.proxy. W wydaniu 1.82.8 włączono plik site-packages/litellm_init.pth, a do pliku proxy_server.py dodano handler, spakowany w formacie base64, uruchamiany przy każdym starcie.
Dodany złośliwy kod skanował i przesyłał poufne dane. Przesyłane były znalezione w systemie klucze SSH i SSL/TLS, zawartość zmiennych środowiskowych, dane logowania do AWS, GCP, Azure i K8s, klucze do portfeli kryptograficznych, hasła do baz danych, historia operacji w interpreterze poleceń, pliki konfiguracyjne z Git, CI/CD, menedżerów pakietów i Dockera. Wykryte dane były szyfrowane przy użyciu algorytmów AES-256-CBC + RSA-4096 i przesyłane za pomocą żądania HTTP POST na stronę "https://models.litellm.cloud/" (domenę litellm.cloud został zarejestrowany na kilka godzin przed publikacją złośliwych wersji).
Użytkownikom LiteLLM zaleca się upewnienie, że w katalogu site-packages nie ma pliku litellm_init.pth, zaktualizowanie wszystkich kluczy i danych uwierzytelniających w przypadku zainstalowania wersji 1.82.7 lub 1.82.8, ustalenie konkretnych wersji LiteLLM w parametrach ładujących zależności oraz porównanie używanych wydań LiteLLM z kodem w wersjach na GitHubie.
Źródło: opennet.ru
