21 октября разработчики библиотеки LiteLLM сообщили о компрометации релиза 1.107.0. Все семь wheel-пакетов этой версии содержали инструмент для похищения секретов и загрузчик удалённого кода. Для запуска хватало старта Python в окружении с установленным пакетом, даже если приложение не использовало LiteLLM. При этом официальный Git-тег оставался чистым, а заражённые артефакты выпустил и подписал штатный процесс сборки.
Версия была доступна в PyPI с 11:39 до 13:23 UTC. Пострадали и контейнеры в Docker Hub и GHCR. По предварительной версии команды, атакующий получил GitHub CLI-токены из логов внутреннего сервиса, доступного из интернета. Токен владельца организации позволил отключить защиту ветки и перенаправить сборку на подставной репозиторий Berri-AI/litellm вместо BerriAI/litellm.
Механизм компрометации пакета заслуживает внимания. Для начала в настройках сборщика maturin появилась строка data = "cook". Она добавляла каталог с закладкой в служебный раздел wheel. Установщик переносил файлы в корень site-packages, где находятся установленные модули. В исходном архиве каталога cook/ не было: там видна только строка конфигурации, а сам вредоносный код содержится в wheel.
Первым срабатывал файл cook.pth со строкой import cook. Обычно файлы .pth добавляют пути поиска модулей, но строки с командой import Python выполняются при обычной инициализации. Загвоздка в том, что проверка достижимости кода через импорты приложения в таком случае не отвечает на вопрос об исполнении, так как точка входа находится в настройке интерпретатора.