Свобода внутри границ
Агент выбирает путь к цели. Детерминированная политика ограничивает его действия, сохраняя возможность исследовать и пробовать.
Локальная песочница, которая проверяет команды, вызовы инструментов и историю действий по правилам Dogwood.
ОС удерживает агента внутри песочницы, а единственный выход через слой политик позволяет проверять смысл его действий и условия, при которых они разрешены.
Агент выбирает путь к цели. Детерминированная политика ограничивает его действия, сохраняя возможность исследовать и пробовать.
Dogwood выражает условия во времени: тесты должны пройти перед push, а число вызовов API не должно выйти за квоту.
Box объединяет изоляцию ОС и проверки в пользовательском пространстве. Для облака с несколькими арендаторами автор рекомендует ещё и MicroVM на сессию.
Box использует механизмы ядра, чтобы направить взаимодействия с системой и инструментами в отдельный слой политик. Этот слой понимает программы, языки и протоколы.
Схема из статьи · нажмите для увеличенияЯдро заставляет обращаться к слою политик. Dogwood решает, разрешено ли конкретное действие.
При запрете агент получает ошибку, а внешний ресурс остаётся недоступным для этого действия.
Box работает с прямыми инструментами и сгенерированным кодом и, по статье, не привязан к модели, облаку или Strands Harness SDK.
Семантическая политика видит, какой инструмент вызывается и с какими аргументами. Временная политика связывает текущий запрос с событиями, которые уже произошли.
В примере автора push требует успешного npm test в каталоге ~/my-project за последние 15 минут. После этого теста не должно быть git add.
forbid (principal, action == Box::Action::"shell:spawn", resource)
when { context.input.program == "git" && context.input has arg1 && context.input.arg1 == "push" }
unless temporal {
(!Box::Action::"shell:spawn"::response{ input.program: "git", input.arg1: "add" }
since within 15m
Box::Action::"shell:spawn"::response{ input.program: "npm", input.arg1: "test", input.arg_count: 1, input.cwd: "~/my-project", output.status: 0 })
};forbid задаёт запрет для shell:spawn, а условие when выделяет программу git с первым аргументом push.
unless temporal снимает этот запрет при нужной истории: успешный ответ npm test в заданном каталоге, окно 15m и отсутствие ответа git add после теста.
Первое правило использует ::response: ему нужен результат теста, включая output.status: 0.
Ниже квота использует ::request: счётчик учитывает обращения к MCP независимо от того, завершились ли они успешно.
git switch может нарушить обещание, что отправляется именно проверенный код. Для полной защиты нужно учесть остальные допустимые действия и способы изменить состояние репозитория.Второе правило запрещает обращение к AWS MCP-серверу, если история уже содержит 60 запросов tools/call за последний час. Проверка считает запросы, а не успешные ответы.
forbid (principal, action == Box::Action::"mcp:call", resource)
when { context.input.server == "aws" && context.input.method == "tools/call" }
when temporal {
exists (n: Long). (
(count for (t: Timepoint). where (
formerly within 1h (
Box::Action::"mcp:call"::request{ input.server: "aws", input.method: "tools/call" } && tp(t)
)
)) == n
&& n >= 60
)
};Такие ограничения подходят для платных API и общей квоты нескольких агентов. Ещё один пример из статьи: разрешить платежи с общим лимитом $100 в день. Код этого правила автор не приводит.
Dogwood требует освоения: автор признаёт сложность чтения и написания правил. Улучшение их удобства заявлено как направление дальнейшей работы.
Чем ближе проверка к инструменту, тем больше контекста действия она получает. Нижние уровни дают сильную границу изоляции, но видят более грубые операции.
| Уровень | Что видит | Сильная сторона | Ограничение |
|---|---|---|---|
| MicroVM / Firecracker | Виртуальные диски и сетевые устройства | Малая доверенная база; сильная изоляция | В сети обычно TLS-шифротекст; операции диска выглядят как байты и смещения |
| Системные вызовы | Открытие файла, запись, подключение к хосту | Удобно ограничивать пути и права доступа | TLS всё ещё скрывает содержимое; интерфейсы ядра растут |
| Эмуляция syscalls / gVisor | Системные вызовы через эмулируемое ядро | Эффективный подход к изоляции | Смысл MCP-вызовов по-прежнему трудно контролировать |
| Слой политик Box | Shell, Python, MCP, файлы, сеть | Проверяет смысл и историю действий | Требует доверия к интерпретаторам и перехватчикам протоколов |
Список разрешённых syscalls нужно расширять, когда приложения начинают использовать новые функции ядра. Список запретов также требует обновлений и даёт более слабую защиту.
Автор отмечает сложность фильтрации и риск TOCTOU при модификации вызовов в Linux: состояние может измениться между проверкой и использованием.
В доверенную вычислительную базу Box входят сложные компоненты: интерпретаторы и перехватчики протоколов. Ошибки в них могут позволить обойти политику.
Код написан на Rust. Команда использует тестирование, fuzzing и валидацию и планирует упрощать модель безопасности.
Это меры снижения риска. Автор не обещает отсутствия ошибок или обходов.
Выходы проверяет Dogwood
Для облака с несколькими арендаторами автор рекомендует отдельную MicroVM для каждой сессии. Самый простой предложенный вариант: запустить Box внутри агента в AgentCore Runtime. Аналогичную архитектуру, по статье, можно построить на EC2, Lambda или Fargate.
В сочетании с AgentCore локальные правила Box дают подробный контроль, AgentCore Policy проверяет вызовы инструментов, а MicroVM разделяет сессии.
Практические шаги по мотивам статьи. Отмечайте выполненное; состояние сохраняется до перезагрузки страницы.
Box продолжает линию AgentCore Runtime → AgentCore Policy → Dogwood → Dogwood Local Engine. В статье он представлен как открытая локальная реализация семантического контроля, в том числе для агентов, которые вызывают инструменты через сгенерированный код.