Кібератака на ланцюг постачання LiteLLM: шкідливі пакети на PyPI та Docker
Зловмисники зламали конвеєр релізів LiteLLM і поширили версію 1.107.0 зі шпигунським ПЗ через PyPI та Docker. Команді проєкту вдалося оперативно видалити пакети.
21 жовтня зловмисники скомпрометували конвеєр релізів LiteLLM і опублікували версію 1.107.0 зі вбудованим інфостілером у PyPI та контейнерах Docker. Команда проєкту вилучила шкідливі артефакти через кілька годин після виявлення.
Що сталося
LiteLLM — відкритий Python SDK і шлюз до моделей ШІ з єдиним API. Це популярний проєкт (понад 61,8 тис. зірок на GitHub, близько 92 млн завантажень на PyPI щомісяця), який використовують, зокрема, NVIDIA, Netflix, AT&T та Okta. За даними підтримувачів, атаковано лише публічний реліз 1.107.0; клієнти приватного enterprise-рішення не постраждали.
Уражені артефакти та часові вікна
- PyPI: litellm==1.107.0 — усі сім коліс (.whl), активні приблизно з 11:39:51 до 13:23 UTC.
- Docker Hub: теги v1.107.0, latest, main-latest, main-stable — вказували на скомпрометований образ з 11:46:56 до 14:20 UTC.
- GHCR: ті самі теги — спрямовували на шкідливі індекси до 13:51 UTC.
Атака не змінювала вихідний код застосунку. Модифіковано інсталяційний пакет: у Python-середовище підкладено файли cook.pth, cook.py та sitecustomize.py.
Як працював шкідливий код
Під час звичайного старту Python обробляє .pth та імпортує sitecustomize, тож пейлоад запускався до старту застосунку щоразу при запуску інтерпретатора. Запуск навіть Python чи pip для діагностики в ураженому середовищі активував шкідник. Один із файлів (sitecustomize.py) щогодини опитував вказівник на GitHub і завантажував та запускав зовнішній Python.
Які дані викрадав
- Хмарні та деплой-облікові дані: AWS, Azure, Google Cloud, Kubernetes, Docker, секрети інфраструктури.
- Облікові дані ШІ та конфігурації: файли автентифікації інструментів розробки ШІ, збережені ключі провайдерів і налаштування моделей у LiteLLM.
- Секрети розробників і ключі: Git, GitHub, npm, PyPI, CI/CD; .env; SSH, GPG, TLS.
- Дані браузера: логіни, куки, автозаповнення/платежі, історія.
- Дані хоста й середовища виконання: змінні середовища, історії оболонки та застосунків, системна й мережева інформація.
Зібрані дані шифрувалися AES‑256‑CBC, ключ шифрували RSA‑4096 і відправляли на litellm.dev/healthcheck.
Що робити користувачам
- Негайно зупинити уражені деплойменти та перевіряти середовище без запуску інтерпретатора Python.
- Ізолювати інфіковані системи, відновити з «чистих» резервних копій, терміново ротувати всі секрети.
- Просте видалення каталогу пакета LiteLLM може залишити стартові файли або активний лоадер.
- Рекомендована відновлювальна версія: LiteLLM 1.106.2 (останній «чистий» реліз до атаки).
Контекст інциденту
Кілька компаній із безпеки зафіксували атаку за шість хвилин після публікації шкідливої версії та проаналізували пейлоад. Раніше, у березні, проєкт також зазнав компрометації: група TeamPCP виклала шкідливі версії LiteLLM на PyPI після зламу сканера вразливостей Trivy від Aqua Security, який використовувався в CI/CD пайплайні.