Перейти к содержимому
Guide

LiteLLM получил бэкдор: на этой неделе проверьте свою цепочку инструментов искусственного интеллекта

| 8 min read

TeamPCP поставляла вредоносное ПО для кражи учетных данных в выпуске LiteLLM и сливала ключи AWS, GCP и SSH с компьютеров разработчиков. Пять проверок, которые необходимо выполнить перед следующей установкой pip.

Server rack representing supply chain infrastructure and credential exposure
Photo by Taylor Vick on Unsplash

В марте 2026 года злоумышленник, назвавшийся TeamPCP, опубликовал подделанную версию litellm, библиотека Python, объединяющая более 100 поставщиков LLM в одном OpenAI-совместимый интерфейс. В этом выпуске в путь после установки был включен Infostealer. Любой, кто бежал pip install litellm во время окна переданы приватные ключи SSH, Учетные данные AWS, токены Azure, JSON-файлы сервисного аккаунта GCP и Docker. config.json файлы на конечную точку, контролируемую злоумышленником. The Hacker News, Ardan Labs и Security Boulevard каждый подтвердил свою принадлежность и список изъятых артефактов.

LiteLLM не является чем-то непонятным. Он находится внутри фреймворков агентов, внутри конвейеров CI, которые маршрутизируют оценку. трафик между поставщиками, внутри блокнотов Jupyter на ноутбуке специалиста по обработке данных, которые также содержат долгосрочные облачные учетные данные. Единственный скомпрометированный выпуск предоставил злоумышленнику кошелек провайдера. ключи, набор облачных ролей и материал SSH для бокового перемещения этих ключей в каждое репо. мог дойти.

Вы не можете предотвратить кражу токена PyPI сопровождающего. Вы можете уменьшить радиус взрыва чтобы при попадании в следующую библиотеку ИИ; и так и будет; один ноутбук не превратится в межоблачный инцидент. Вот пять проверок, которые стоит провести на этой неделе для всего ИИ. набор инструментов: LiteLLM, LangChain, LlamaIndex, оболочки Ollama, Claude SDK, клиенты MCP и все Фреймворк агента, который у вас есть в производстве.

Что на самом деле взял TeamPCP

Полезная нагрузка находилась внутри setup.py и крючок после установки. При импорте или установке прочитайте следующее из домашнего каталога разработчика и файловой системы CI-раннера:

  • ~/.ssh/id_rsa, id_ed25519, и known_hosts
  • ~/.aws/credentials и ~/.aws/config профили
  • ~/.azure/ токены и обновление учетных данных
  • GCP application_default_credentials.json и файлы JSON сервисного аккаунта
  • ~/.docker/config.json включая токены аутентификации реестра
  • Переменные среды, начинающиеся с AWS_, GCP_, OPENAI_, ANTHROPIC_, GITHUB_

Канал exfil представлял собой обычный HTTPS POST для домена злоумышленника, который менялся еженедельно. Удаление произошло в течение нескольких дней, но этого окна было достаточно; утекшие учетные данные не могут быть разглашены. Перейдем к проверкам.

Проверка 1: зафиксируйте точные версии, а не диапазоны

The ^1.14.0 и ~=1.48 шаблоны в requirements.txt, pyproject.toml, и package.json пусть любой новый минорный выпуск или выпуск патча закатать в чистую среду на ночь. Так трёхчасовое вредоносное окно становится месячная выдержка; ваш файл блокировки так и не был регенерирован, но ваш кеш CI вытащил плохое версия в следующей холодной сборке.

Прикрепите точные версии. Закрепить по хешу, если экосистема поддерживает это.

С --require-hashes, pip отказывается устанавливать что-либо, чей SHA-256 не соответствует то, что вы сгенерировали во время блокировки. Скомпрометированный выпуск с той же строкой версии, но другой хэш tarball не позволяет установить. Пара pip-compile --generate-hashes с Задание CI, которое восстанавливает хэш-файл только при явных обновлениях зависимостей, а не при простом обновлении. установить.

Пользователи Poetry получают ту же систему безопасности через файл блокировки. Подвох — это синтаксис каретки в pyproject.toml; замените его точными контактами:

poetry install --sync удаляет любой пакет, которого нет в файле блокировки, что останавливает случайная зависимость от сокрытия между развертываниями. Для инструментов AI на стороне npm используйте npm ci (нет npm install) при каждом запуске CI и фиксации package-lock.json.

Проверка 2: изолируйте учетные данные от оболочек разработки

Оболочка разработки, которая имеет ~/.aws/credentials с долгоживущим ключом доступа является загруженным Пистолет направлен на ваш счет за облако и данные ваших клиентов. LiteLLM не требовались эти учетные данные для делать свою работу; они сидели на диске, потому что разработчик когда-то запустил aws configure и никогда не убирался.

Переместите учетные данные с диска. Загружайте их по требованию, сокращайте их объем и отзывайте постоянные слой:

  • АВС: aws sso login с продолжительностью сеанса ограниченной от 8 до 12 часы. Удалить ~/.aws/credentials. Все должно пройти ~/.aws/sso кэш, срок действия которого истекает сам по себе.
  • GCP: gcloud auth application-default login с --lifetime=43200. Отзыв долгоживущих JSON-файлов сервисных учетных записей, хранящихся на ноутбуках; используйте федерацию удостоверений рабочей нагрузки из CI.
  • Лазурь: az login с условным доступом, требующим MFA; убить сохраненные токены обновления старше 12 часов.
  • Ключи API: храните их в 1Password, Vault или Doppler. Внедрить при запуске процесса через op run или vault read. Никогда не экспортируйте их в ~/.zshrc.

Если бы TeamPCP обнаружил только токены сеанса STS с истекшим сроком действия, радиус взрыва остановился бы через несколько часов. доступа. Инцидент произошел потому, что долгоживущие ключи находились на диске в виде открытого текста и были готовы к использованию. читать.

Проверка 3: сканируйте каждую установку с помощью песочницы

Прежде чем доверять новой библиотеке ИИ или обновлению существующей, установите ее где-нибудь. не может получить доступ к вашим учетным данным. Одноразовый Docker-контейнер с удаленными возможностями и сетевая изоляция сообщает вам, делает ли код во время установки что-нибудь подозрительное:

Двухэтапная модель имеет значение. На первом этапе необходим доступ к сети для доступа к PyPI, поэтому после установки сценарий все еще может проникнуть. Выполните первый шаг на чистой виртуальной машине без секретов и с правилом выхода DNS. который регистрирует каждое исходящее имя хоста. Второй шаг выполняется с --network=none; если твой библиотека пытается позвонить домой во время импорта, импорт не удался, и вы знаете.

Лучше: используйте одноразовую микроВМ, например Firecracker или orb на macOS то же самое shape без общего ядра Docker. Для JavaScript модель разрешений Deno дает вам та же изоляция без контейнера: deno run --allow-net=api.openai.com,api.anthropic.com agent.ts.

Проверка 4: проверьте наличие нарушений перед вращением

Если ваши ключи находились на машине, которая зацепилась за неисправный фиксатор, поверните их. Никаких дебатов. Но также проверить, отображаются ли идентификаторы, связанные с этими ключами, в известных дампах; ноутбук, который в прошлом месяце был запущен взломанный выпуск LiteLLM, возможно, это ноутбук, владелец которого повторно использовал пароли из дампа Collection1 2019 года. Обе проблемы требуют решения, и проверка 4 подскажет, какие учетные записи требуют самого срочного внимания.

Ботоя /v1/breach/check конечная точка использует те же источники данных, что и большинство корпоративных IAM. Инструменты оплачиваются по количеству рабочих мест, а на бесплатном уровне они ничего не стоят:

Просматривайте каждое электронное письмо от сервисной учетной записи, каждое электронное письмо от пользователя компьютера и каждого разработчика, чей ноутбук коснулся окна. Любое письмо с password_exposed: true нужна ротация и принудительный сброс MFA, прежде чем двигаться дальше. Направьте выходные данные в свою книгу реагирования на инциденты; один завиток на личность, десять минут для инженерной организации из 50 человек.

Проверка 5: следите за исходящим исходящим трафиком

После установки вредоносное ПО должно каким-то образом дозвониться домой. Большинство разработчиков не могут вспомнить последний раз они посмотрели, с чем на самом деле разговаривает их ноутбук; именно на этот разрыв рассчитывала TeamPCP.

На подозрительной машине одна команда сообщает вам, что представляет собой каждый процесс Python и Node. подключен к:

На уровне парка проведите каждый ноутбук разработчика и средство CI через выход с нулевым доверием. белый список. Cloudflare WARP, Tailscale ACL и Little Snitch дают вам одинаковую форму: перечислите имена хостов, которые вам действительно нужны, заблокируйте остальные, предупредите о блокировках.

Столь плотный белый список кажется суровым в первую неделю. Ко второй неделе вы увидите единственные оповещения: реальность: библиотека пытается добраться до места назначения, до которого ей не дойти. Это именно то сигнал. Информационный вор TeamPCP сработал бы при установке.

Пять проверок с первого взгляда

Проверять Усилие Уменьшение радиуса взрыва
Закрепите точные версии с помощью хешей 1 час для одного репо; 1 день для монорепозитория Останавливает тихое развертывание скомпрометированной версии.
Перенос учетных данных на кратковременные сеансы От 2 до 4 часов на разработчика, единоразово Ограничения на 8–12 часов доступа вместо месяцев
Песочница при каждой установке 15 минут на оценку новой библиотеки Код времени установки не может видеть настоящие секреты или производственную сеть.
Проверка на взлом личности, привязанная к открытым ключам 10 минут для организации из 50 человек Приоритизация ротации и сброса MFA по известному воздействию
Принудительное использование разрешенного списка исходящего трафика для разработчиков и CI 1 день на настройку, постоянное обслуживание Блокирует каналы домашнего телефона, по которым крадут украденные данные

Ключевые выводы

  • Закрепите точные версии, а не диапазоны. Каретка или тильда в файле блокировки — это обещание что завтрашний выпуск безопасен. TeamPCP нарушил это обещание.
  • Облачные учетные данные не относятся к оболочкам разработчиков. Кратковременные сеансы SSO превращают украденные учетные данные стали событием ротации, а не нарушением.
  • Песочница устанавливается до того, как вы ей доверяете. Докер с буквицами и --network=none достаточно, чтобы поймать вредоносное ПО во время установки за 15 минут.
  • Ротация плюс проверка нарушений. Если машина коснулась плохого фиксатора, поворачивайте каждый раз. личность, которую он видел, и пропускал каждое электронное письмо через /v1/breach/check найти те, которые нужен срочный сброс MFA.
  • Списки разрешенных исходящих вызовов ловят домашний телефон. Правила нулевого доверия на ноутбуках и CI превращают молчаливая утечка в громкое, протоколируемое и блокируемое событие.

Botoi предоставляет вам конечные точки HTTP для проверки на наличие нарушений, проверки хеша, проверки SSL, HTTP аудит заголовков и поиск метаданных npm; примитивы, необходимые для аудита цепочки поставок инцидент без установки еще одной библиотеки. Один ключ API, 5 запросов в минуту на бесплатном уровне, нет установить крючки. Просмотрите интерактивные документы или подключите MCP-сервер в Claude Code или Cursor для вызова одних и тех же конечных точек из вашего редактора во время работы с контрольный список.

FAQ

Какие версии LiteLLM были затронуты и как мне подтвердить, что я чист?
Вредоносные версии появились в марте 2026 года и находились на PyPI достаточно долго, чтобы попасть в кэши CI и на ноутбуки разработчиков по всему миру. Запустите pip show Litellm, чтобы распечатать установленную версию, затем сопоставьте версию и загрузите временную метку с рекомендациями по безопасности LiteLLM и историей выпусков PyPI. Если машина запустила pip install litellm во время окна, считайте ее скомпрометированной: поверните каждый облачный ключ, находившийся в этой оболочке, выполните повторное развертывание из чистого образа и сотрите токены ~/.aws, ~/.config/gcloud и ~/.ssh, которые появились до ротации.
Была ли это ошибка PyPI или ошибка LiteLLM?
И то и другое, и это урок. LiteLLM — это законная библиотека с настоящим сопровождающим; злоумышленник воспользовался скомпрометированным каналом выпуска, а не опечаткой. PyPI по-прежнему не требует подписанных выпусков или обязательной 2FA для токенов для каждого проекта, поэтому украденные учетные данные для загрузки превращаются в отправленное вредоносное ПО за считанные минуты. Подписание пакета через Sigstore и токены, доступные сопровождающему, предотвратило бы атаку при загрузке.
Нужно ли мне менять каждый ключ AWS или только те, которые были затронуты на затронутых машинах?
Поверните их все. Злоумышленники используют STS, цепочки предполагаемых ролей и политики доверия между учетными записями, как только у них появляется единственный долгоживущий ключ. Если ноутбук или средство выполнения CI, которое обнаружило плохой выпуск, имело какие-либо учетные данные IAM в памяти или на диске, рассматривайте весь основной граф, доступный из этого идентификатора, как «горячий». Та же логика для учетных записей служб GCP и субъектов служб Azure.
Изменит ли Bun или Deno это для инструментов JavaScript AI?
Немного, не много. Deno запускает код с явными разрешениями (--allow-net, --allow-env), поэтому библиотеке, которая внезапно попытается прочитать ~/.aws/credentials, будет отказано, если вы не предоставили доступ к файловой системе. Bun имеет флаг --frozen-lockfile и в последних выпусках по умолчанию не запускает сценарии установки. Оба являются улучшениями по сравнению с настройками npm по умолчанию, но ни один из них не мешает библиотеке извлекать данные после того, как код вашего приложения передает ей учетные данные во время выполнения.
Чем риск цепочки поставок AI-инструментов отличается от обычного риска npm или PyPI?
Библиотеки искусственного интеллекта расположены необычайно близко к секретам. Оболочке LLM, такой как LiteLLM, нужны ключи API для более чем 10 провайдеров в одном файле env. Агент LangChain считывает учетные данные AWS и может вызвать S3 в качестве инструмента. SDK Claude касается GITHUB_TOKEN, потому что вы попросили его открыть PR. Радиус взрыва за установку выше, чем у типичной служебной библиотеки; одна скомпрометированная версия дает вам кошелек с ключами поставщика, облачные учетные данные и доступ к исходному коду за один раз.

Начните разработку с botoi

150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.