Besmette LiteLLM-versie stal twee uur lang AI-sleutels
Wie op 21 oktober tussen half één en half drie Nederlandse tijd pip install litellm draaide, heeft mogelijk een inbreker binnengehaald. Versie 1.107.0 van de populaire Python-bibliotheek, die apps via één interface laat praten met modellen van OpenAI, Anthropic en tientallen andere aanbieders, bevatte een credential stealer en een achterdeur. PyPI haalde de release na ongeveer twee uur offline.
Wat er gebeurde
Volgens de tijdlijn van beveiligingsbedrijf Wiz verscheen de besmette versie om 11.39 uur UTC op PyPI. Om 13.20 uur zette PyPI het pakket in quarantaine, rond 13.53 uur verdwenen ook de besmette Docker-images. Die zaten niet alleen onder het versienummer v1.107.0, maar ook onder de tags latest, main-latest en main-stable op GHCR en Docker Hub. Wie in die periode automatisch de nieuwste container trok, kreeg dus de malware mee.
Wiz schat op basis van ClickPy-cijfers dat de kwaadaardige versie zo’n 49.000 keer is gedownload. Ter vergelijking: LiteLLM haalt volgens Datadog Security Labs ongeveer 23 miljoen downloads per week.
Hoe de aanvaller binnenkwam
De git-tag van 1.107.0 in de officiële repository was schoon. De aanvaller gebruikte gestolen GitHub CLI-tokens van drie LiteLLM-engineers om de interne release-workflow te laten bouwen vanuit een nagemaakte repository: Berri-AI/litellm, met één koppelteken verschil ten opzichte van het echte BerriAI/litellm. LiteLLM denkt dat de tokens uit de logs van een interne deployment kwamen die openbaar op internet stond. Hoe de aanvaller daar precies bij kon, is nog niet bevestigd.
Het is niet de eerste keer dat LiteLLM doelwit is. In augustus schreven we al over de LiteLLM-hack die 2.500 bedrijven raakte. De bibliotheek zit diep in veel AI-stacks, en dat maakt haar aantrekkelijk.
Wat de malware deed
De besmette wheels plaatsten drie bestanden in site-packages: cook.pth, cook.py en sitecustomize.py. Python voert die uit bij elke start van de interpreter, ook als niemand LiteLLM importeert. De stealer verzamelde SSH-sleutels, cloudcredentials van AWS, Google Cloud en Azure, browserwachtwoorden, API-sleutels van LLM-aanbieders en de providersleutels uit de database van een LiteLLM-proxy. Alles ging versleuteld naar het lookalike-domein litellm[.]dev.
Daarnaast keek een achterdeur elk uur in een GitHub-bestand welk domein hij moest benaderen om nieuwe code op te halen. Datadog zag daar alleen testwaarden. Wiz zag de aanvaller wel tussen 16.20 en 17.01 uur UTC gestolen AWS-sleutels uitproberen, zo’n vier en een half uur na de diefstal. Wie aanvallen via ontwikkeltools volgt, herkent het patroon van eerdere zaken als de CHAINDROP-worm in npm en de PoeLLM-malware die AI-servers aanviel.
“Een AI-bibliotheek beheert vaak de sleutels van al je andere systemen. Wie zo’n pakket blind laat updaten, geeft een onbekende de reservesleutel van het hele kantoor.”
Leon Tindemans, AI-expert en Copilot- & ChatGPT-trainer, geeft trainingen in AI-geletterdheid
Wat betekent dit
Draai je LiteLLM, controleer dan nu welke versie er in je omgevingen en containers zit. De laatste schone release is 1.106.2. Alleen de package verwijderen is niet genoeg: Datadog adviseert de drie bestanden handmatig uit site-packages te halen, alle mogelijk gelekte sleutels vanaf een schone machine te vervangen en logs na te lopen op misbruik in het blootstellingsvenster. Behandel een machine waarop 1.107.0 heeft gedraaid als gecompromitteerd.
Voor teams die AI-tooling bouwen is de les praktisch. Pin versies, gebruik geen latest-tags in productie en zorg dat API-sleutels niet in logs belanden. Dat dit dezelfde week gebeurt als de kritieke PHP-lekken die door AI werden gevonden, laat zien hoeveel druk er op de softwareketen staat.
