Claude и Codex начали ставить чужой код по инструкции с сайта компании

изображение: grok
Исследователи нашли способ незаметно подсунуть вредоносный код корпоративным ИИ-агентам через обычную документацию сайта. В файлах для языковых моделей обнаружились ссылки на несуществующие программные пакеты, и агенты вроде Claude, Codex и Hermes пытались их установить на реальных рабочих машинах компаний. Тестовые версии таких пакетов, которые исследователи зарегистрировали сами, начали получать сигналы из корпоративных сетей почти сразу после публикации.
Формат называется llms.txt и llms-full.txt. Компании публикуют такие файлы, чтобы языковые модели быстрее разбирались в документации и не бродили по десяткам страниц сайта в поисках нужной команды. Для агента с доступом к терминалу подобная страница нередко становится первым источником, откуда он берёт инструкцию для установки библиотеки или подключения сервиса.
Alon Hertz с коллегами проверили 6214 доменов, связанных с оборонными подрядчиками, компаниями из списка Fortune 500 и крупными технологическими игроками. В обнаруженных файлах нашлось 227 команд, указывающих на пакеты и домены без владельца. Среди типичных причин появления таких пустых ссылок исследователи выделили несколько:
- разработчик переименовал библиотеку или удалил старый проект;
- в документации осталась опечатка или устаревшая команда из давно закрытого репозитория;
- имя пакета когда-то придумала сама модель, которая помогала писать документацию;
- владелец библиотеки забросил проект и перестал продлевать регистрацию домена.
Для человека это просто битая ссылка в старой инструкции. Для агента с правами на pip, npm или shell-команды это уже потенциальная точка входа в сеть компании.
Отмечается, что после регистрации нескольких свободных имён исследователи не столкнулись с тишиной на протяжении месяцев. Первый сигнал от инфраструктуры компании из списка Fortune 500 пришёл меньше чем через час, а в отдельных описаниях эксперимента фигурирует значение в 4 минуты.
Всего в проверенных доменах нашлось 8265 файлов llms.txt и llms-full.txt, а по более поздним подсчётам исследователей их число выросло до 8565. Разброс цифр объясняется этапами анализа, а не тем, что проблема исчезла на каком-то из подсчётов.
Механизм похож на старый добрый squatting доменных имён, только теперь ждать приходится не человека с браузером, а агента с доступом к терминалу. Модель не всегда воспринимает отсутствие пакета как повод остановиться, она способна перебирать варианты, переключаться между менеджерами пакетов и повторять команду до результата. У злоумышленника есть несколько путей превратить забытую строчку документации в рабочий инструмент атаки:
- зарегистрировать несуществующее имя пакета из старой инструкции на сайте компании;
- занять освободившийся домен, на который до сих пор ссылается документация;
- заполнить занятое имя вредоносным содержимым и ждать обращения от автоматического клиента;
- использовать любой менеджер пакетов, от PyPI и npm до RubyGems, NuGet и crates.io.
В одном из зафиксированных случаев легитимный сайт компании содержал команду npx с обращением к свободному имени. Позже это имя заняли настоящим вредоносным пакетом, и только после этого запись на сайте поправили.
Исследователи прошли по цепочке родительских процессов от момента запуска тестового кода до конкретного инструмента, который его вызвал. В логах обнаружились Claude от Anthropic, Codex от OpenAI и Hermes от Nous Research. Anthropic, OpenAI и Nous Research не ответили изданию Ars Technica на запрос о комментарии на момент публикации материала.
Для российских компаний, которые уже подключают агентных ИИ-помощников к репозиториям и внутренним пайплайнам, риск ровно тот же самый. Формат llms.txt никак не привязан к юрисдикции, а часть открытых пакетных реестров и доменных зон доступна разработчикам из России без ограничений.
Базовая защита от такой атаки выглядит довольно скучно и требует ручной работы над документацией:
- регулярно проверять актуальность команд установки в llms.txt и обычных README;
- удалять ссылки на заброшенные пакеты и домены сразу после обнаружения;
- резервировать имена критичных зависимостей заранее, а не после инцидента;
- ограничивать агентам права на автоматический запуск pip, npm и shell без подтверждения человеком.
Стоит обратить внимание на то, что для атаки не понадобился ни взлом сайта, ни украденный пароль администратора, ни письмо сотруднику. Агент просто дочитал документацию до конца и сделал ровно то, для чего его создали.
Масштаб проблемы шире одной команды pip install. В более поздних материалах исследователей упоминается уже свыше 237 незанятых артефактов разных типов, а не только пакетов. В список попадают:
- заброшенные поддомены, которые снова открыты для регистрации;
- устаревшие ссылки на внешние API и сервисы из старой документации;
- имена пакетов из нескольких экосистем одновременно, от Python до JavaScript;
- инструкции, которые копировались между сайтами компаний без проверки актуальности.
Российским разработчикам, работающим с open source и зарубежными пакетными реестрами, стоит закладывать эту уязвимость в модель угроз уже сейчас, а не после первого инцидента с вредоносным пакетом внутри рабочей сети.
Ранее сообщалось, что Anthropic начала принудительно закрывать активные сеансы Claude и удалять сохраненные банковские карты у части пользователей, чьи компьютеры были заражены вредоносными программами класса инфостилеров. Злоумышленники извлекают из браузера уже действующую сессию Claude и получают доступ к чужому аккаунту, расходуя доступный лимит запросов без ведома владельца. Двухфакторная аутентификация в такой ситуации помогает не всегда, поскольку преступнику зачастую не требуется повторно проходить авторизацию.
Эксперты CISOCLUB считают риск вполне реальным для любой компании, которая даёт ИИ-агентам права на установку зависимостей без проверки человеком. По их мнению, само появление llms.txt не создаёт угрозу, а вот безграничное доверие агента к содержимому этого файла создаёт. Разработчикам стоит относиться к такой документации так же строго, как к внешнему коду и сторонним библиотекам, а не как к безобидному тексту для машины.
Проверка актуальности команд установки и ограничение прав агента на автоматический запуск pip, npm и shell выглядят самым дешёвым способом закрыть большую часть риска. Компаниям также стоит следить за цепочкой родительских процессов в собственной инфраструктуре, чтобы вовремя заметить нетипичную активность агентов. Игнорировать этот класс атак нецелесообразно, поскольку количество автономных ИИ-инструментов с доступом к терминалу и репозиториям продолжает расти.



