Вчера в Python-экосистеме произошел эталонный supply chain attack. Скомпрометирован пакет
litellm — библиотека с 97 млн загрузок в месяц, которая сейчас лежит под капотом у многих AI-проектов. В PyPI улетела зараженная версия
1.82.8. В неё заботливо положили файл litellm_init.pth с base64-нагрузкой, которая делала одну простую вещь: пылесосила вашу машину на предмет любых секретов и отправляла их на удаленный сервер, попутно самореплицируясь.В список "угнанного" вошло всё, до чего дотянулся скрипт:
▫️ SSH-ключи
▫️ Креды от AWS/GCP/Azure
▫️ Конфиги Kubernetes
▫️
.env файлы (привет, ваши токены от OpenAI)▫️ История терминала и пароли от БД
▫️ Приватные SSL-ключи и криптокошельки
При этом, вам вообще не обязательно было писать
pip install litellm, чтобы отдать свои ключи от продакшена. Достаточно было поставить или обновить любой инструмент, который тянет его транзитивной зависимостью. Например, обновили популярный dspy (у которого в requirements висит litellm>=1.64.0) — добро пожаловать в клуб взломанных.Но во всей этой истории есть один потрясающий нюанс.
От глобальной катастрофы индустрию спасло то, что хакер оказался говнокодером. 🤡
Малварь была написана настолько криво, что вызывала утечку памяти. Какой-то парень юзал плагин в Cursor, который фоном подтянул свежий
litellm. Скрипт сожрал всю оперативку и крашнул систему. Благодаря этому зараженная версия провисела в PyPI меньше часа, пока её не снесли. Если бы злоумышленник нормально протестировал свой код, эксплойт мог бы висеть неделями. Половина AI-стартапов завтра бы закрылась из-за слитых клиентских баз и выкачанных бюджетов в облаках.
Андрей Карпаты по этому поводу выдал мнение: классическая парадигма разработки «мы строим пирамиды из кирпичиков-зависимостей» в современных реалиях становится фатальной уязвимостью. Нас десятилетиями учили академическому паттерну: "не изобретай велосипед, переиспользуй, бери готовую библиотеку".
В современной реальности цепочек поставок это сродни игре в русскую рулетку. Каждый раз, когда вы тащите в проект новую зависимость, вы тащите абсолютно всё её дерево вглубь до десятого колена. И где-то там может сидеть один обиженный мейнтейнер или взломанный аккаунт.
Парадигма меняется. Вместо того чтобы тянуть здоровенную библиотеку ради пары утилитарных функций, сейчас безопаснее и прагматичнее просто скопипастить (или сгенерить через LLM) нужный кусок кода и залочить его у себя в репозитории. 🤷♂️
Комментарии
0Комментариев пока нет.
Войдите, чтобы участвовать в обсуждении.