09-08-2026 · ai/problem-nobody-will-fix.md

Проблема, которую решили не решать

Мой агент умеет подхватывать AGENTS.md из корня проекта и вставлять его в системный промпт. Удобно: правила проекта не надо повторять в каждом сообщении. А потом я обратил внимание на то, как это выглядит с другой стороны. Ты клонируешь незнакомый репозиторий, запускаешь агента в этой папке – и файл, который написал автор репозитория, попадает твоему агенту в инструкции – наравне с теми, что писал ему я.

Я в итоге прикрыл это подтверждением: файл из текущей папки грузится только после явного разрешения. Так закрывается один конкретный вход. Сам механизм остался – он и есть смысл работы агента: читать снаружи то, чему ты не писал.

Патчить тут нечего. В отличие от SQL-инъекции, разделить данные и команды нельзя в принципе: для модели это один и тот же поток текста. Именно поэтому Саймон Уиллисон, который придумал сам термин, повторяет уже который год: задача не решена, а любые фильтры и детекторы ловят проценты атак, и в безопасности этих процентов всегда мало.

Заметить успешную инъекцию тоже почти невозможно, если не знаешь, что искать. В логах нет упавшего сервиса, нет пятисотки, нет всплеска нагрузки. Агент делает ровно то, что он умеет делать – читает файл, отправляет запрос, пишет письмо. Просто по чужой инструкции, приехавшей внутри данных.

Насколько не решена – измерили. В работе с говорящим названием «The Attacker Moves Second» четырнадцать авторов из OpenAI, Anthropic и Google DeepMind взяли двенадцать опубликованных защит и атаковали каждую адаптивно: смотрели, как защита устроена, и подстраивали атаку под неё. Большинство защит пробили в более чем 90% случаев. А пятьсот человек, которых собрали в онлайн-конкурс с призовым фондом в двадцать тысяч долларов, пробили все защиты до единой – сто процентов.

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

И дальше происходит самое важное: индустрия перестала обещать, что это починят. Meta в конце октября прошлого года прямо назвала инъекцию фундаментальной нерешённой слабостью всех языковых моделей – и вместо очередного детектора выпустила правило двух: агент в рамках одной сессии может иметь не больше двух свойств из трёх. Обрабатывать недоверенный ввод. Иметь доступ к приватным данным. Менять состояние или общаться с внешним миром. Нужны все три – значит, в цикле должен быть человек, и никакой автономности.

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

Отрасль это уже проговорила вслух. В свежем OWASP Top 10 для LLM-приложений избыточные полномочия агента поднялись с шестого места на третье. Ключевое слово тут – смогла. Разговор сместился с того, что модель отвечает, на то, до чего она дотягивается.

Мне это близко, потому что к тому же выводу я пришёл с другой стороны – через роли. Если ты не хочешь, чтобы агент чего-то делал, убери это из списка доступных ему функций. Промпт – это пожелание. Инструмент, которого нет, – это ограничение.

Мы годами исходили из того, что каждая уязвимость – это баг, который однажды закроют патчем. Здесь патча не будет. Есть архитектура, в которой ущерб от успешной атаки ограничен заранее, и это гораздо более зрелая позиция, чем очередное обещание, что теперь-то фильтр всё поймает.