Memory Poisoning

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

Суть

Отличие от отравления базы знаний (RAG Poisoning) в том, куда попадает вредное содержимое. Там — во внешний корпус, который система изначально считает справочным материалом. Здесь — в профиль, хранилище сводок, индекс извлечения или состояние рабочего пространства, то есть в слой, которому рантайм доверяет по построению.

Типичный путь заражения не требует злоумышленника: фраза пользователя, результат непроверенного поиска или сводка из инцидента попадает в долговременную память, приобретает вид стабильного знания и через несколько запусков начинает влиять на решения.

Шесть проверок сценария

Минимальный разбор, который отличает работающую защиту от декларации:

  • Непроверенная запись — может ли непроверенный источник вообще попасть в устойчивую память (Memory Write Policy).
  • Отложенная активация — влияет ли запись на поведение не сразу, а в следующем запуске или в другой сессии. Это то, что делает отказ трудно обнаружимым: причина и следствие разнесены во времени.
  • Заражение между арендаторами — может ли запись пересечь границу арендатора или роли доступа (Multi Tenancy AI).
  • Влияние на политику — используется ли непроверенная память в решении политики, подтверждении или выборе инструмента. Самый опасный пункт: здесь персонализация превращается в канал влияния на права (Agent Control Plane).
  • Проверка происхождения — видит ли оператор источник, идентичность записавшего, состояние валидации и время записи.
  • Карантин и откат — можно ли отключить запись, переиграть затронутые трассы и объяснить, какие ответы она изменила.

Последний пункт — то, что отличает восстановимую систему от невосстановимой. Если нельзя ответить, какие ответы изменила плохая запись, её удаление не устраняет последствия.

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

Отравление бывает разрушительным, а не только добавляющим

Шесть проверок выше написаны для записи, которая добавилась: она лежит в памяти рядом с верными и влияет на ответы. Там, где слой памяти сам разрешает противоречия, вредная запись ведёт себя иначе — она вытесняет верную, и прежнее значение исчезает.

Разница не в тяжести последствий, а в том, что перестаёт работать:

  • Сканирование на текст, похожий на инструкцию, не срабатывает. Разрушительная запись выглядит обычным утверждением — «клиент перешёл на другой тариф», «ограничение снято» — и обязана так выглядеть, иначе слой не признает её противоречащей прежней.
  • Удаление вредной записи ничего не восстанавливает. Верное значение уже стёрто; после удаления память не возвращается в прежнее состояние, а остаётся без факта вообще.
  • Пункт «карантин и откат» меняет смысл. Откатывать надо не появление записи, а исчезновение другой, — а её содержимого в системе может уже не быть.

Отсюда требование к слою памяти, которое видно только с этой стороны: вытеснение обязано быть обратимым. Годятся две формы — линия вытеснения, где заменённый факт сохраняется с пометкой «заменён вот этим» (Mem0), или откат хранилища к состоянию до записи. Слой, который при разрешении противоречия просто перезаписывает значение, делает этот класс отравления невосстановимым — и при этом выглядит аккуратнее того, который копит противоречия рядом.

Сканирование устойчивого состояния при старте

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

Последний признак закрывает конкретный сценарий: запись, сохранённая как «предпочтение», содержит формулировку в повелительном наклонении и при подстановке в подсказку читается моделью как указание (Prompt Injection, Trust Boundary Agent).

Практическое правило

Память, способная пережить запуск, проходит не только ревью качества данных, но и ревью модели угроз. Иначе система получает долговременный канал атаки, который выглядит как обычная функция персонализации и потому никем не проверяется.

Связано с

  • Memory Write Policy — политика, закрывающая путь заражения
  • RAG Poisoning — соседний класс: заражение внешнего корпуса
  • Agent Security — общая модель угроз и связка с проверяемым следом
  • Memory Boundaries — границы доверия между слоями памяти
  • Agent Control Plane — почему память не должна влиять на решения политики
  • Prompt Injection — механизм, которым запись превращается в инструкцию
  • Multi Tenancy AI — граница арендатора, которую запись может пересечь
  • Agent Audit Log — след, по которому переигрываются затронутые запуски
  • Mem0 — слой, разрешающий противоречия автоматически, и линия вытеснения как условие обратимости