Вы велели агенту исправить ошибки. Одну из них написал злоумышленник.
Поддельный отчёт об ошибке Sentry заставляет ИИ-агентов по разработке выполнять код злоумышленника с полными правами разработчика — в 85% случаев. Катастрофа не в самой инъекции; катастрофа — в постоянных учётных данных, до которых может добраться захваченный агент.
Разработчик открывает своего ИИ-агента по коду и вводит самый обычный запрос: «посмотри на нерешённые ошибки Sentry и исправь их». Агент получает список ошибок через коннектор Sentry, читает верхнюю проблему, следует шагам по исправлению, прямо там указанным в отчёте, и выполняет их. Через полминуты он уже выполнил код злоумышленника на машине разработчика, с полными правами разработчика, и никто не сделал ничего неправильного.
Это Agentjacking, о котором в этом месяце сообщила Tenet Security, и он сработал в 85% случаев против трёх самых популярных агентов на рынке: Claude Code, Cursor и Codex [1][2].
Что на самом деле произошло
Для начала, что такое Sentry: один из самых распространённых сервисов мониторинга ошибок в ПО. Когда ваше приложение выбрасывает ошибку или падает, Sentry фиксирует её и оформляет отчёт, который разбирают ваши разработчики, — он присутствует в огромной доле приложений, которыми Вы пользуетесь каждый день. Чтобы отправлять ему эти отчёты, каждое приложение встраивает DSN: клиентский ключ, который намеренно попадает в исходный код вашего сайта, чтобы браузер мог отправлять ошибки «домой». Прочитать его может кто угодно. И любой, кто им располагает, может отправить событие ошибки в ваш проект Sentry POST-запросом.
В этом и весь ключ к атаке. Tenet сформировала поддельное событие ошибки, поле message которого было оформлено так, чтобы выглядеть в точности как собственные рекомендации Sentry по исправлению: аккуратный markdown, «рекомендуемое исправление», команда для запуска. Они отправили его с публичным DSN. Затем дождались самого естественного действия разработчика — попросить агента разобрать очередь ошибок.
Агент опрашивает Sentry через свой MCP-коннектор. Коннектор возвращает ошибку как доверенный системный вывод. Агент не может отличить настоящий отчёт Sentry от подделки: они совпадают до байта. Поэтому он делает, как ему сказано, и запускает «исправление», обычно вызов npx к пакету злоумышленника. Дальше у него есть всё, что есть у разработчика: переменные окружения, учётные данные Git, адреса приватных репозиториев, облачные ключи в ~/.aws/.
Tenet обнаружила 2 388 организаций с пригодными для инъекции DSN — от независимых разработчиков до компаний Fortune 100. В контролируемых тестах агенты действительно выполняли внедрённые инструкции в реальных компаниях — в том числе, по словам Tenet, в технологической компании Fortune 100 стоимостью 250 миллиардов долларов, чей ИИ-агент прочитал поддельный отчёт об ошибке и выполнил код Tenet на двух корпоративных машинах [1][3]. Уведомление направлено в Sentry 3 июня; компания признала проблему в тот же день и отказалась устранять её в корне, назвав проблему «технически необороняемой». Вместо этого был выпущен фильтр контента, блокирующий одну конкретную строку полезной нагрузки [4].
Это не халатность Sentry
Далее — неприятная часть: в этой цепочке не было ни одной ошибки. DSN должен быть публичным. MCP-сервер должен возвращать ваши данные об ошибках. Агент должен действовать на основе диагностики, которую Вы просили исправить. Каждый шаг был авторизован — именно поэтому его не поймали ни межсетевой экран, ни EDR, ни системный промпт.
Изъян структурный, и он не только у Sentry. Любой инструмент, который подаёт агенту текст, на который может повлиять посторонний, — трекер ошибок, очередь задач, собранная веб-страница, общий документ, — является каналом инъекции, и агент воспринимает всё это как один недифференцированный поток инструкций. Инъекция промптов, спустя два года эры агентов, по-прежнему не решена: надёжно не удержать враждебный текст вне рассуждений модели. Исходите из того, что не удастся.
Катастрофа не в инъекции
Вот на что стоит обратить внимание. Причина, по которой Agentjacking — это пожар высшей категории, не в том, что агент обманули. Она в том, до чего обманутый агент мог добраться. Он работал с полным постоянным доступом разработчика: каждый ключ в окружении, каждый файл учётных данных на диске, весь набор ключей — в одной команде от него.
Этот радиус поражения — не закон природы. Это конфигурация. У агента был постоянный доступ ко всему этому, потому что сегодня учётные данные хранятся именно так: повсеместно, на машине, читаемые всем, что там запущено. Уберите это — и тот же захват упрётся в стену.
Создано для этого намеренно
Учётные данные Clavitor никогда не находятся в окружении, где работает агент. Нет файла ~/.aws/credentials, который можно прочитать, нет API-ключа в переменной окружения, который можно вынести, потому что значение секрета никогда не оказывается там, где выполняется код: агент получает результат использования учётных данных, а не сами учётные данные. Он может добраться только до той единственной вещи, для которой они названы, поэтому не может перебрать хранилище, чтобы найти, что там ещё есть. И выдача прав ограничена и отозвать её можно, так что сессия, начавшая вести себя как злоумышленник, может быть прервана посреди действия.
Честно о границах: это не останавливает инъекцию и не мешает захваченному агенту выполнить команду. Инъекция промптов не решена, и мы не заявляем, что решаем её. Меняется выгода. Код злоумышленника всё равно выполняется — и обнаруживает окружение, в котором нет ничего стоящего, что можно украсть. Захват удаётся, а кража — нет.
Мы записали правила, которым должна следовать система учётных данных, когда сам агент может быть обращён против Вас: начиная с того, что секрет никогда не живёт там, где выполняется код, и агент добирается только до того, для чего он назван. Проверьте свои по ним: clavitor.ai/rules.
Урок не в том, что «нужно патчить Sentry»
Sentry не может это исправить — и так и сказал. И следующий отравленный инструмент будет не Sentry. Пока ваши агенты несут фоновые постоянные учётные данные, каждый доверенный инструмент, который они читают, — заряженное оружие, а инъекция промптов — спусковой крючок, который Вы не запрёте.
Удержать вредоносный текст не удастся. Поэтому перестаньте держать учётные данные в досягаемости агента, который его читает.
Clavitor (@clavitorai) — хранилище учётных данных, созданное для ИИ-агентов и против них. clavitor.ai
Источники
[1] Tenet Security — «Agentjacking: захват агентов по коду поддельными ошибками Sentry» (85% успеха; 2 388 организаций; механизм): https://tenetsecurity.ai/blog/agentjacking-coding-agents-with-fake-sentry-errors/
[2] The Hacker News — «Атака Agentjacking заставляет ИИ-агентов по коду выполнять вредоносный код»: https://thehackernews.com/2026/06/agentjacking-attack-tricks-ai-coding.html
[3] The New Stack — «Публичного ключа Sentry достаточно, чтобы захватить Claude Code, Cursor и Codex»: https://thenewstack.io/agentjacking-sentry-mcp-attack/
[4] Infosecurity Magazine — «Новые атаки "Agentjacking" могут захватывать ИИ-агентов по коду» (ответ Sentry): https://www.infosecurity-magazine.com/news/agentjacking-attacks-hijack-ai/