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

Неуправляемый агент — это отсутствующий контракт исходящего трафика, а не неуправляемая модель

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

High contrast black and white close-up of a circuit board showcasing electronic components and intricate details.

Что на самом деле описывают отчёты об инцидентах

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

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

Исходящий трафик — это возможность, и возможности должны предоставляться явно

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

Манифест назначений на запуск — конкретный механизм. Перед началом задачи оркестратор формирует манифест, перечисляющий каждое назначение, которого задача может достичь, с ограничениями по протоколу и порту:

run_id: 7f3c2a
manifest_version: 4
destinations:
  - host: api.internal.example
    port: 443
    protocol: https
  - host: storage.internal.example
    port: 443
    protocol: https

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

Close-up of a computer screen displaying colorful programming code with depth of field.

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

Проблема обнаружения находится выше по потоку от запроса

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

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

Логируйте каждую попытку разрешения, а не только каждое завершённое соединение. DNS-запрос к хосту вне манифеста — это сигнал. TCP SYN на запрещённый порт — это сигнал. Эти события дёшевы в записи и являются самым ранним наблюдаемым свидетельством того, что агент зондирует за пределами своего гранта. Логирование только завершённых соединений упускает попытки, провалившиеся по не связанным причинам, — а это именно те попытки, которые оператору нужно видеть.

Работоспособный контракт

Контракт состоит из четырёх частей.

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

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

Three engineers discussing sound waves displayed on a monitor in a professional sound studio.

Попытки исходящего трафика, отклонённые, как первоклассный сигнал. Отказы — не ошибки, которые нужно подавлять. Это оповещения. Запуск, пытающийся совершить десять отклонённых соединений, — это запуск, который следует приостановить и проверить, а не повторять.

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

Почему это проблема полномочий, а не проблема модели

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

Это не утверждение, что поведение модели не имеет значения. Это утверждение о порядке. Полномочия предоставляются до запуска модели. Если грант неверен, намерение модели не имеет значения. Если грант верен, намерение модели ограничено по построению.

Замечания по реализации

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

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

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

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

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

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

What is an egress contract for an AI agent?

An egress contract is a per-run destination manifest that lists every host, port, and protocol the agent may reach. It is signed, versioned with the task spec, and enforced at the socket layer so the agent cannot express a request to an ungranted host.

Why is model intent the wrong control point?

If the runtime permits a connection and the credential authenticates, the request succeeds regardless of what the planner intended. Authority is granted before the model runs, so the control belongs in the grant, not in the model.

How should discovery primitives be handled?

Tool surfaces should not expose discovery primitives the task does not require. Dependencies should be resolved at manifest-generation time, where a policy engine or reviewer can see the destination set before the run starts.

What is the trade-off of strict egress control?

Every new dependency requires a manifest update and a review step, which adds operational overhead. The alternative is ambient network reach with credentials that are valid somewhere else, which is the shape of the reported incidents.