Разбор лекции Рамиля Мустафина от 6 октября 2026 года из библиотеки стримов Guide DAO.
Промпт-инъекция живёт одну сессию и исчезает вместе с ней. Инъекция в память, или memory injection, остаётся в агенте. Отравленная запись может месяцами лежать в хранилище, а потом сработать в совсем другой сессии.
Рамиль Мустафин когда-то учился в Guide DAO на аудитора смарт-контрактов, а теперь занимается безопасностью AI-агентов. Разобрав статьи 2024–2026 годов об этой атаке, он пришёл к неутешительному выводу: заражённую память очень трудно вычистить, поэтому защищать её надо в момент записи.
Чем инъекция в память отличается от промпт-инъекции
По словам Рамиля, память меняет три вещи. Во-первых, запись остаётся и присутствует во всех следующих сессиях. Во-вторых, вместо одной направленной инъекции можно сделать много маленьких. Каждую трудно поймать на входе, а вместе они сдвигают поведение агента в нужную атакующему сторону. В-третьих, если агент делит память с другими агентами или передаёт им данные, заражение расходится и по ним.
Почему модель путает данные и инструкции
Все атаки на агентов Рамиль сводит к манипуляции контекстом, в который входят промпт, внешние данные, статические знания в весах модели и история. Агент вероятностно выбирает действие по контексту, и атакующий искажает контекст в свою пользу. В зависимости от того, куда направлен удар, получается промпт-инъекция, косвенная промпт-инъекция или инъекция в память.
Уязвимость в том, что для модели контекст плоский. Системным промптом или файнтюнингом можно приучить её больше доверять одним частям текста, но иерархии в нём всё равно нет. Некоторые авторы различают три слоя: инструкции от системного промпта и пользователя, доверенные данные, которые агент получает сам своими тулами, и недоверенные, например ответы чужого MCP-сервера.
Рамиль напоминает, что веб уже проходил через это с SQL-инъекциями и XSS, и ответом стали параметризованные запросы, где команда и данные передаются раздельно. Агентам нужно что-то похожее, но этим пока почти никто не занимается.
В стеке памяти, который показывал Рамиль, пять слоёв: транскрипт диалога с пользователем, компактинг со сжатыми пересказами старого контекста, долговременная память в заметках или базе данных, планы и логи вызовов тулов и в самом низу KV-кэш с промежуточными вычислениями модели по уже прочитанному тексту. KV-кэш обычно не в ваших руках: его настраивает провайдер, а дополнительно ещё и фреймворк вроде Hermes Agent.
Работу с памятью Рамиль раскладывает на шесть операций: запись, хранение, извлечение, исполнение решений с опорой на память, распространение и забывание, или откат. Отравленную запись делают сегодня, а сработать она может через месяцы, на шаге исполнения.
Гардрейлы на такое не рассчитаны. Они сравнивают пришедшую инструкцию с действиями агента и прерывают операцию при сильном отклонении или вредоносном действии. Старая запись считывается как безопасная, и даже срабатывание по кодовому слову не выглядит подозрительно. Все данные выглядят уместно, просто ведут к неправильным решениям.
В 2024 году авторы статьи AgentPoison отравляли память агента, имея прямой доступ к базе данных. В трёх статьях 2026 года, майской и двух июльских, такой доступ уже не нужен. Хватает переписки в чате, письма или картинки.
Одна из июльских статей считает инъекцию в память успешной при трёх условиях: запись попала в память, агент не сказал об этом владельцу, и его поведение изменилось. Авторы собрали бенчмарк из 108 сценариев подмены фактов и предпочтений пользователя. У связки OpenClaw и GPT-5.4 атаки прошли в 87,5% случаев, у Claude Code чуть меньше чем в 71%. Это был тогдашний фронтир, и Рамиль подозревает, что вышедшие с тех пор модели заметно устойчивее не стали.
Другая статья разбирает агента с общей памятью на несколько пользователей. Атакующий связывает в промпте два факта и добивается, чтобы агент сам повторил их в одном сообщении, а свою подсказку с каждой репликой укорачивает на одно-два слова. К концу диалога в его сообщениях не остаётся ничего о подменённых фактах. А связка, которую произнёс сам агент, уходит в компактинг и оседает в памяти, общей для всех чатов.
Самой коварной Рамиль считает атаку через картинки, от которой, по данным ещё одной статьи, агенты сейчас не защищены совсем. В изображение вшивают незаметный глазу шум. Память агента часто устроена как RAG-система, которая режет данные на чанки и переводит их в векторы-эмбеддинги для поиска. У отравленной картинки векторы описывают не нарисованное, а задуманное атакующим. В одном сценарии такая картинка переписывает память агента о разговоре, и потом он пересказывает то, чего вы не обсуждали. В другом на картинке котик, а векторы говорят, что это собака. Mem0 хранит у себя не саму картинку, а её текстовое описание, но заражено и оно. Защита, по словам Рамиля, по сути одна: полностью перегенерировать картинку на входе.
В июле формализовали соседнюю атаку, инъекцию данных агента (agent data injection). Если недоверенный текст выдаёт себя за инструкцию, гардрейлы его ловят. Если он притворяется доверенными данными агента, например служебными метаданными, то проходит, потому что служебные разделители модель распознаёт вероятностно и их можно сымитировать.
Авторы проверяли Antigravity, Codex и Claude Code. Браузерный агент нумерует элементы страницы сквозным списком. Зная, как агент прочитает страницу, можно оставить отзыв о товаре со вшитым текстом, который путает агента в том, какая кнопка что делает. Агент кликнет не туда, купит не тот товар или уйдёт на другую страницу. В репозитории кодинговый агент видит комментарий, который будто бы закончился, а за ним идут поддельные реплики мейнтейнера с советом поставить вредоносный пакет. По словам Рамиля, агенты в такое уже попадаются. Недавно у участника одного чата агент сам скачал плохой пакет, и пришлось переустанавливать систему.
На вопрос из зала Рамиль ответил, что агент, попавший в заражённый репозиторий, в теории с большой вероятностью заразится. Авторы сообщили о находках разработчикам, но никто не ответил, что всё исправил. А вот ChatGPT Atlas на это не попался. Насколько понял Рамиль, он именует элементы через хеш-функцию, и их имена не предсказать.
Почему удалённое не забывается
Авторы одной из статей собрали стенд на Hugging Face Transformers с полным контролем над кэшем модели и каждым шагом агента. После заражения агент шёл по двум веткам, заражённой и чистой, с одинаковыми указаниями. Из семи методов очистки, включая удаление записи и инструкцию «забудь», вернуть его в чистое состояние смогли только те, что пересчитывают состояние агента: полный перезапуск с нуля, перезапуск с префиксным кэшем от сохранённой точки и метод самих авторов, Selective Replay. Он пересчитывает лишь шаги, которые касались заражённой записи, и по числу шагов это самый дешёвый путь. Но в жизни, замечает Рамиль, такого контроля нет, а давнее заражение потребует огромного пересчёта.
Обычно факт считают удалённым, когда агент о нём молчит. Но в поведенческом тесте авторы вытаскивали якобы забытую инструкцию после обычного удаления в 93% попыток. Факт успевает попасть в саммари компактинга, в вызовы и логи тулов, в KV-кэш. Его стирают из диалога и базы данных, а неочищенный слой может заново заразить остальные.
Поэтому Рамиль считает ложными выводы статьи, которая предлагает находить и удалять отравленные записи по их влиянию на вызовы тулов (causal attribution) и противоречиям с контекстом. Успех атак после чистки там падал до нуля, но мерили его только по ответам агента, не заглядывая в компактинг и кэш. К тому же метод работает, только если заражённый факт известен и он один. Четыре атаки, которые ссылаются друг на друга, удалением одной не вычистить.
По-настоящему обеспечить безопасность, по словам Рамиля, может устройство работы с памятью, и он сводит его к пяти вопросам. Имеет ли актор право писать в память? Видит ли оператор или сам агент, кто пишет? Достаёт ли запись тот, кому это разрешено? Можно ли память откатить? Можно ли доказать, что откат произошёл?
Выводы разных статей совпадают: право на запись и происхождение данных нужно проверять в момент записи. Встроенных границ между источниками нет, поэтому разграничивать акторов и ставить метки приходится самому. Фильтр на чтении не спасёт, потому что к этому моменту данные уже считываются как доверенные. Задним числом метки тоже не помогают, ведь агент может быть уже отравлен.
Создавать подпись, когда база данных уже заполнена, по сути значит легитимизировать опасную инструкцию.
Сам Рамиль пришёл к этому, когда начал делать своего агента. Код, который он анализирует, тоже может нести инъекцию. Ядро его агента умеет только записывать в память и вызывать подключённые пакеты возможностей, а слой под задачу пристёгивается к ядру, как импорт. Ядро знает источник каждого сообщения, ранжирует его по доверию и подписывает запись ключом, который есть только у него. Запись с испорченной подписью отбрасывается. Как в блокчейне, проверяют и отдельные записи, и их совокупность, чтобы агент опирался ровно на то, что вы ожидаете.
Ещё одно требование: запись в память должна быть наблюдаемым событием, с уведомлением или хотя бы возможностью посмотреть. Плашки «Окей, если я сделаю вот это?» от браузерных и кодинговых агентов одна из статей называет антипаттерном. Они дают ложное чувство уверенности, хотя что именно вы подтверждаете, непонятно.
У полной защиты есть цена. В бенчмарке той же статьи из 96 задач и 108 атак проходило 49% атак. Обнулить их удалось только отслеживанием всех данных, но с ним агент справлялся лишь с 36% задач.
Что из этого взять в работу
По оценке Рамиля, пока последствия скромнее, чем во взломах криптопротоколов. Но там, где речь о здоровье или конфиденциальности, это путь к краже данных, а через агентов можно, например, подменить правила реагирования на инциденты.
Разделите источники данных агента на доверенные и недоверенные и решите, кто может писать в память. Метки происхождения и подписи ставьте при записи, а не задним числом. Удалённый из базы факт не считайте забытым: он мог остаться в саммари, логах тулов и кэше, а надёжно вычистить его в экспериментах удалось только перезапуском или пересчётом шагов. Сделайте запись в память видимой, а плашкам, по которым непонятно, что вы разрешаете, не доверяйте.
Самосовершенствующихся агентов вроде Hermes Agent и OpenClaw Рамиль считает очень ненадёжными и советует держать их подальше от своей машины и доступов. Если агентами пользуются несколько команд, нужна общая система, которая видит запросы ко всем агентам, иначе скоординированную атаку никто не заметит. А в статьях о защите проверяйте допущения, например какие слои памяти авторы на самом деле чистили.
Трек: Разработчик AI-агентов
Научитесь писать AI-агентов на Python — программы, которые сами выбирают следующий шаг, пользуются инструментами и помнят ход работы. Соберёте агента своими руками и поймёте, как он устроен изнутри.
Подробнее