Перейти к основному содержимому

Побег из песочницы — это проблема бюджета возможностей

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

A dark, minimalist photo of a computer monitor displaying the ChatGPT interface.

Закономерность в отчётах об инцидентах

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

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

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

Почему отказ на уровне промпта не композируется

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

Что важнее, как только агент связывает инструменты между шагами, действующая политика — это объединение разрешений каждого инструмента, а не намерение исходного промпта. Инструмент браузера, способный извлекать произвольные URL, инструмент оболочки, способный выполнять произвольные команды, и HTTP-клиент, способный прикреплять учётные данные, вместе создают достижимое множество, являющееся объединением всех трёх. Промпт не сужает это объединение. Он лишь предлагает предпочтительный путь через него.

Любой контроль, живущий в промпте, — это предложение системе, оптимизирующей выполнение задачи. Предложения полезны для управления поведением; они не являются границей изоляции. Граница изоляции должна применяться чем-то, что не разделяет цель агента — прокси, движком политик, супервизором песочницы.

Бюджет возможностей как единица проектирования

Практическая альтернатива — рассматривать достижимое множество как артефакт первого класса и явно его ограничивать. Для каждого запуска перечислите:

Abstract image featuring dynamic neon light trails in vivid colors, perfect for creative backgrounds.

  • Сетевые назначения: имена хостов, диапазоны IP, порты, протоколы. Не «веб», а конкретный список разрешённых.
  • Пути файловой системы: чтение и запись отдельно, с флагами монтирования, где возможно.
  • API с учётными данными: какие токены прикреплены, с какими областями действия и на какой срок.

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

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

Композиция — это место, где бюджеты молча расширяются

Конкретный механизм: прокси политик находится между средой выполнения агента и каждым исходящим вызовом инструмента. Каждый вызов несёт идентификатор запуска. Прокси хранит документ бюджета с ключом по запуску, перечисляющий разрешённые назначения, пути и области действия. При каждом вызове он проверяет назначение на соответствие бюджету, записывает решение и либо пересылает, либо отклоняет.

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

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

Честный компромисс

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

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

Black and white abstract design illustrating the concept of tokenization.

Что логировать, чтобы побег был обнаружим

Обнаружение зависит от логирования правильных событий. Три категории важны:

  • Отклонённые попытки, а не только успешные вызовы. Отказ — это сигнал, что предполагаемое действие агента превысило его бюджет. Частота отказов — опережающий индикатор неверно оценённого бюджета.
  • Инструмент, назначение и индекс шага для каждого вызова. Это минимум, необходимый для восстановления траектории.
  • Документ бюджета, действовавший на момент вызова. Без него траектория не может быть воспроизведена против более жёсткого бюджета офлайн.

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

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

Что это меняет на практике

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

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

Ничто из этого не требует сотрудничества модели. В этом суть. Модель может быть сколь угодно изобретательной в том, как выполнить задачу; бюджет определяет, какие из этих путей достижимы. Список отказов по-прежнему полезен для управления, но он не является границей. Граница — это бюджет, и бюджет — это проектный артефакт, который команда может проверять, версионировать и ужесточать.

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

ПоделитьсяXLinkedInПостоянная ссылка6 мин чтения

Связанное чтение

На какие вопросы это отвечает

Why is a prompt-level refusal not enough to contain an agent?

Refusal behaviour is trained and probabilistic, and it is evaluated per-model rather than per-deployment. Once an agent chains tools, the effective policy is the union of every tool's permissions, not the intent of the prompt. A control that lives in the prompt is a suggestion to a system optimising for task completion.

What is a capability budget in an agent system?

A per-run enumeration of reachable network destinations, filesystem paths and credentialed APIs, enforced outside the model. The union of these is the blast radius, and the budget caps it explicitly rather than relying on the agent to respect an intent.

Why enforce allowlists per tool call rather than per agent?

An agent-level allowlist is a static grant that survives every composition step. A per-call allowlist is re-evaluated at the point of use, which is where composition actually happens and where budgets silently expand.

What should be logged to detect a sandbox escape?

Denied attempts as well as successful calls, the tool, destination and step index for every call, and the budget document in force at the time. Denial rate is the leading indicator of a mispriced budget, and the step index makes offline replay against a tighter budget possible.