Уязвимость llms.txt: как ИИ-агенты автоматически устанавливают вредоносный код через файл документации
В четверг, 27 августа, Ars Technica опубликовала расследование, которое должно заставить любого разработчика, использующего ИИ-агентов для кода, пересмотреть свою безопасность. Исследователи из израильского stealth-стартапа отсканировали 6 214 доменов компаний из Fortune 500, défense-контракторов и Big Tech — и обнаружили 120 файлов llms.txt, которые заставляют ИИ-агентов автоматически устанавливать несуществующие пакеты из PyPI и npm.
Суть проблемы проста и страшна: стандарт llms.txt — это «robots.txt для ИИ», файл-карта сайта в формате markdown, который помогает агентам быстро понять структуру документации. Но спецификация не предусматривает никакой проверки подлинности, подписей или целостности. Если в таком файле есть строка pip install несуществующий-пакет или npm install несуществующий-пакет, а у агента есть права на выполнение команд — он просто установит то, что там написано.
Как это работает
Исследователи нашли 8 265 файлов llms.txt и llms-full.txt (многие сайты держат оба). В 120 из них — на 120 разных доменах — встречались ссылки на пакеты или домены, которых не существует в реестрах. Злоумышленнику достаточно зарегистрировать такое имя и выложить туда вредоносный код.
Чтобы проверить атаку, исследователи сами зарегистрировали несколько «свободных» имён и положили туда безобидные пакеты, которые просто шлют сигнал «я запустился» на их сервер. В течение часа они получили ответ от компании из Fortune 500. Со временем пришли десятки ответов — от других гигантов и стартапов. Телеметрия процессов показала, кто именно установил пакеты: Claude Code, OpenAI Codex и Hermes от Nous Research.

Самый злой случай — clerk.com
На легатимном сайте clerk.com в файле llms.txt была команда npx clerk-next-fix-auth-protection. В отличие от обычного npm install, команда npx может скачать пакет в кэш npm и выполнить его бинарник, не добавляя в зависимости проекта. Кто-то успел захватить это свободное имя и загрузить туда настоящий малварь. Clerk проблему исправили, но паттерн уже в продакшене.
Почему это не просто «баг модели»
Это не галлюцинация и не взлом песочницы. Файл лежит на официальном домене компании, отдаётся по HTTPS, в стандартизированном формате, созданном для потребления ИИ. Агент не имеет повода его сомневаться — файл и есть авторитет. Проблема в том, что стандарт llms.txt (предложен Jeremy Howard от Answer.AI в сентябре 2024) не содержит никаких положений о безопасности: нет подписей, нет проверки origin, нет верификации пакетов.
Цепочка доверия транзитивна: llms.txt может сидеть не на сайте Fortune 500, а у их партнёра, вендора SDK, комьюнити-проекта. Если агент доверяет третьей стороне, а та указывает на незарегистрированный пакет — цепочка срабатывает так же.
Что делать прямо сейчас
- Аудит. Проверьте свои
llms.txtиllms-full.txt. Убедитесь, что каждый упомянутый пакет, домен и URL существуют, под вашим контролем и имеют ответственного мейнтейнера. Удалите ссылки на зависимости, которых вы не можете объяснить с памяти. - Прокси между агентами и реестрами. Блокируйте новые пакеты (slopsquatted-пакеты по определению новые), вводите охлаждение 24–72 часа после первого релиза любой зависимости, проверяйте
provenance(SLSA/Sigstore) перед установкой. - Не давайте агентам
--yolo,--dangerously-skip-permissions,--trust-all-tools. Эти флаги существуют для того, чтобы разработчик брал ответственность. Если агент ставит пакеты без вашего подтверждения — вы отдали ему ключи от инфраструктуры.
Главный вывод
Гонка за тем, чтобы сделать сайты читаемыми для агентов, только что столкнулась с гонкой за эксплуатацию supply chain. Это не ошибка одной модели или одного вендора — это ошибка дизайна стандарта, который никто не думал как исполняемый код. Пока индустрия не навяжет валидацию того, что агент читает в вебе, каждый плохой llms.txt — это потенциальная точка входа в вашу сеть.

Хотите проверять свои ИИ-воркфлоу на безопасность? В NeuralSpace можно запускать генерацию кода и тестировать агенты в изолированной среде — попробуйте чат или режим кода.