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

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

≈ 3 минуты

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

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

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

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

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

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

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

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

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

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

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