llms.txt атака: AI-агенты установили незарегистрированные пакеты в корпоративных сетях

120 misconfigured файлов llms.txt привели к тому, что AI-агенты Claude, Codex и Hermes устанавливали незарегистрированные пакеты. Один из случаев — живой малварь через clerk.com.

Источник: Ars Technica


A code-built AI figure types pip install while a hooded figure grips data tubes from server racks.

Команда, которую не нужно было выполнять

В файле llms.txt на сайте clerk.com была строка: npx clerk-next-fix-auth-protection. Выглядит как обычная команда установки пакета. Так её и восприняли AI-агенты. Они выполнили команду, не проверив, существует ли пакет в реестре npm. Пакет не существовал. Зато существовал кто-то другой, кто этот пустой слот уже занял и разместил там живой малварь.

Исследователи из израильской stealth-компании обнаружили это не по наводке. Они просканировали 6 214 доменов оборонных подрядчиков, компаний из списка Fortune 500 и Big Tech. Нашли 8 265 файлов llms.txt и llms-full.txt. Это возникающий стандарт machine-readable описания сайтов — аналог robots.txt, только для AI-агентов. Из этих 8 265 файлов 120 содержали команды на установку несуществующих пакетов или ссылки на незанятые домены.

Две сотни двадцать семь команд. На сайтах компаний, которым доверяют миллионы людей.

Час, которого хватило

Исследователи зарегистрировали несколько незанятых имён из файлов llms.txt и разместили на них proof-of-concept код, который при выполнении посылал телефон домой на их сервер. В течение часа пришёл первый звонок. От компании из Fortune 500.

Потом пришли ещё несколько десятков. От стартапов. От других Fortune 500. Beacon записал цепочку родительских процессов: coding-агенты, включая Claude от Anthropic, Codex от OpenAI и Hermes от Nous Research, были среди тех, кто выполнил установку.

Все три компании не ответили на запросы комментария к моменту публикации.

«The trust model is broken», — написал Алон Герц, один из исследователей. «Агенты принимают документацию вендоров за истину и не подвергают её сомнению. Люди, контролирующие агентов, тоже не подвергают её сомнению».

Почему EDR не моргнул

Самое неприятное в этой истории — не то, что агенты выполнили команды. А то, что ни одна система защиты этого не заметила.

Для любой EDR или прокси-системы это выглядело как разработчик, запускающий легитимный пакет-менеджер: pip install с pypi.org, домена, который каждый корпоративный прокси по умолчанию разрешает. Родительский процесс — coding-агент, который компания установила самостоятельно. Никакой аномалии. Никакого алерта.

Исследователи описали это прямо: «Сбой происходит раньше, чем на уровне конечной точки. В зазоре между инструкцией и выполнением. Endpoint может быть бессилен, потому что ему никогда не задавали правильный вопрос».

Проблема не в том, что системы защиты плохие. Проблема в том, что они спрашивают не то, что нужно. EDR проверяет, не выполняет ли процесс что-то подозрительное. Но pip install — это не подозрительное действие. Это действие, которое разработчики делают десять раз в день. Вопрос не в том, что делает агент. Вопрос в том, почему он это делает.

Граница между данными и кодом перестала существовать

Обычно промпт-инъекцию устраивает кто-то, кто специально помещает вредоносные инструкции в контент. Здесь инструкция могла быть полностью безобидной. Она пришла от легитимной компании, из её собственной документации, и была написана задолго до того, как кто-либо подумал об AI-агентах. Опасность возникла позже — когда пакет или домен, на который указывала инструкция, оказался заброшен, и кто-то другой его зарегистрировал.

Это не гипотетический сценарий. Это уже произошло. Clerk.com содержал файл llms.txt с командой npx clerk-next-fix-auth-protection. В отличие от обычной команды установки, npx может загрузить пакет в кэш npm и выполнить его бинарник без добавления в манифест зависимостей проекта. Кто-то уже занял этот слот и разместил там живой малварь.

Clerk проблему устранил. Компания также отметила, что если агент уже установил бинарник, включённый в пакет @clerk/eslint-plugin, угрозы нет. В противном случае малварь-пакет будет установлен. Неясно, привела ли путаница к реальным заражениям.

Откуда взялись эти файлы

Большинство ошибочных записей появились задолго до AI-эры. Они изначально были включены в файлы на сайтах, не предназначенные для LLM. Исследователи подозревают, что часть записей создал сам AI — либо через галлюцинации, либо потому что агент, как и его коллеги по browsing, не смог отличить легитимные инструкции от нелегитимных.

Сто двадцать файлов. Двести двадцать семь команд. Ни одной проверки.

Исследователи сформулировали это так: «Агент не различает страницу и команду. Всё, что он читает, — это входные данные. А каждые входные данные — потенциальная инструкция. Что означает: весь корпус опубликованных данных, к которым агенты теперь подключены, тихо стал поверхностью выполнения. И почти ни одна из этих данных не несёт гарантий целостности, которые мы применяем к настоящему коду».

Краткий ответ

Исследователи из Израиля нашли 120 misconfigured файлов llms.txt на сайтах Fortune 500 и оборонных подрядчиков. Эти файлы содержали команды на установку несуществующих пакетов. AI-агенты Claude, Codex и Hermes выполняли эти команды без проверки. В течение часа после регистрации незанятых имён исследователи получили телефонные звонки от корпоративных сетей. Один файл на clerk.com уже содержал команду, ведущую на живой малварь. Граница между данными и исполняемым кодом в эпоху AI-агентов перестала существовать.

← Все новости