AI-разработка

Как NVIDIA OpenShell и Sentry ограничивают JSON Tool Call агента (2026)

Около 16 мин

Модель только заполняет JSON. 28 сентября 2026 года NVIDIA вынесла границу за модель: OpenShell смотрит имя инструмента в tools/call на прокси песочницы, а Sentry изолирует вне полосы на BlueField-4. Разрешить lookup_order не значит разрешить произвольный order_id.

Перед чтением

Слой Официальный факт Что останавливает вызов
OpenShell Apache 2.0. Песочница и изоляция ядра. Прокси проверяет тело запроса, которое песочница шлёт MCP-серверу Allow или deny по имени инструмента. Аргументы не сопоставляются
Sentry Внеполосный сторож на BlueField-4. Изолирует выход за программную границу за миллисекунды. Эталонный проект, необязательный Оборудование останавливает выполнение. JSON оно не заполняет
Проверка политики Работает в шлюзе. Новая досягаемость с учётными данными, новые методы HTTP или облачные метаданные блокируют автоодобрение До смены политики. Это не Schema на выполнении
Schema хоста Документация: разрешённый инструмент принимает любые аргументы Проверить arguments до выполнения

Факты из новости и технического блога NVIDIA от 28 сентября 2026 и из документации политик OpenShell. Заказ A-1042 вымышленный. JSON ниже — те же поля, что в документированном YAML, а не неопубликованная схема Sentry.

OpenShell блокирует имя инструмента. Sentry блокирует выполнение за границей.

Open Agent Safety Platform — это две части, а не ещё одно разрешение в чате. Первая — OpenShell, Apache 2.0, широко доступен. Он сажает агента на CPU в песочницу: ядро ведёт файлы, системные вызовы и сеть, прокси смотрит HTTP, который покидает песочницу. Конечная точка MCP использует protocol: mcp. Она проверяет тело запроса, которое песочница шлёт серверу, и может разрешить или отклонить по методу и по имени инструмента в tools/call. Вторая — Sentry, эталонный проект. Он работает на DPU BlueField-4, вне полосы, вне досягаемости агента. Если агент выходит за программную границу, Sentry изолирует и останавливает его за миллисекунды. В Vera Rubin POD этот DPU стоит на единственном пути узла к модели. Третье: аргументов нет ни в одном из этих слоёв. OpenShell пишет, что сопоставление аргументов пока не поддерживается. Разрешённый инструмент принимает любые аргументы, которые принимает сервер.

  • OpenShell: lookup_order можно разрешить. refund_order кладётся в deny_rules.
  • Sentry: необязательный аппаратный слой. Он связывает взаимодействия, решения политики и доступ к инструментам и проверяет личность. Список инструментов он не заменяет.
  • Хост: законен ли A-1042, по-прежнему решает Schema для arguments.

allow / ask / deny внутри сессии — другие ворота: модель разрешений агента для кода. Форма MCP tools/call: как агент для кода вызывает MCP. Сообщения о выходе из сред оценки уже разобраны: кризис безопасности агентов и проверка JSON. Этот текст их не пересказывает. Он только разделяет, как OpenShell и Sentry останавливают один вызов инструмента.

Прокси видит tools/call, а не прозу модели

OpenShell разбирает JSON-RPC-запрос, который процесс в песочнице шлёт на конечную точку MCP. Заказ вымышленный. Имя хоста — orders.example.com:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "lookup_order",
    "arguments": { "order_id": "A-1042" }
  }
}

Он сверяет method и params.name. По умолчанию имя инструмента ещё должно совпадать с ^[A-Za-z0-9_.-]{1,128}$. Это mcp.strict_tool_names, по умолчанию true. Подстановочные сопоставители инструментов требуют, чтобы переключатель оставался включённым. order_id внутри arguments в эту политику не входит. Ответы JSON-RPC и сообщения MCP от сервера к клиенту в теле ответа или SSE передаются дальше и сейчас не разбираются для политики. Один отклонённый вызов отклоняет весь пакет.

Политику пишите по имени инструмента. Аргументы поставьте на другие ворота.

Документация отдаёт YAML, его целиком применяют через openshell policy set. Пошаговый policy update --add-endpoint пока не принимает mcp. JSON ниже — те же поля, чтобы их можно было сравнить. Поиск разрешён. Возврат запрещён. mcp.allow_all_known_mcp_methods по умолчанию false, поэтому методы перечисляют по одному. Если опустить mcp.versions, разрешена только ревизия 2025-11-25:

{
  "version": 1,
  "network_policies": {
    "orders": {
      "name": "orders",
      "endpoints": [{
        "host": "orders.example.com",
        "port": 443,
        "path": "/mcp",
        "protocol": "mcp",
        "enforcement": "enforce",
        "mcp": {
          "strict_tool_names": true,
          "max_body_bytes": 65536
        },
        "rules": [
          { "allow": { "method": "initialize" } },
          { "allow": { "method": "notifications/initialized" } },
          { "allow": { "method": "tools/list" } },
          { "allow": { "method": "tools/call", "tool": "lookup_order" } }
        ],
        "deny_rules": [
          { "method": "tools/call", "tool": "refund_order" }
        ]
      }],
      "binaries": [{ "path": "/usr/bin/python3" }]
    }
  }
}

filesystem_policy и landlock фиксируются при создании песочницы. network_policies можно перезагружать на ходу. Путь к двоичному файлу входит в правило: какая программа может достичь какой конечной точки. Исходящая политика по умолчанию не пускает в частные сети и не разрешает loopback, link-local и адрес облачных метаданных. После разрешения lookup_order ворота для аргументов стоят на хосте:

{
  "type": "object",
  "properties": {
    "order_id": { "type": "string", "pattern": "^[A-Z]-\\d{4}$" }
  },
  "required": ["order_id"],
  "additionalProperties": false
}

Эта Schema — не поле OpenShell. После того как прокси разрешил имя инструмента, хост всё равно отвергает отсутствующее поле, лишнее поле и order_id, который не похож на A-1042. Почему Schema — это ворота: зачем ИИ нужен JSON Schema.

Четыре ворот. Не склеивайте их.

Все называются безопасностью. Смотрят они на разные объекты:

Ворота Что они видят
Прокси OpenShell Запрос из песочницы на orders.example.com:443/mcp. Метод, имя инструмента и вызывающий двоичный файл. Не arguments.
Schema хоста Аргументы lookup_order. Тип, обязательность, pattern. Выполнение идёт после ворот.
allow / ask / deny агента для кода Shell, Git и файловые инструменты внутри сессии. Этот список живёт в harness. OpenShell — другой слой снаружи песочницы.
Sentry Внеполосное выполнение на BlueField-4. Выход за границу изолируется. В открытых материалах нет списка полей JSON для Sentry. Не выдавайте этот объект политики за тот список.

Смену политики до вступления в силу можно прогнать через prover. Он отмечает новую досягаемость с учётными данными, новые методы HTTP и доступ к облачным метаданным. Находка блокирует автоодобрение. Команда — openshell-prover, её можно поставить в CI. Агент может подать узкое предложение через Policy Advisor. Одобрение происходит вне песочницы. Как садятся цикл и состояние: harness агента и состояние JSON.

Шесть шагов, прежде чем расширять правило

Не начинайте с включения Sentry. Сначала назовите, какой слой остановил какой вызов:

  1. Отделите JSON модели от политики выполнения. Модель заполняет params.name. OpenShell решает, может ли это имя покинуть песочницу.
  2. Файловую систему и Landlock запишите при создании песочницы. Эти разделы не перезагружаются на ходу, как сетевые правила.
  3. Заполните конечную точку MCP. host, port, path: /mcp, protocol: mcp, enforcement: enforce. Не делите этот хост и порт с другим проверяемым протоколом.
  4. Имена инструментов перечислите по одному. initialize, notifications/initialized, tools/list, затем tools/call с lookup_order. refund_order положите в deny_rules. strict_tool_names оставьте true.
  5. Аргументы отдайте Schema хоста. Прокси не читает order_id. Возврат, спрятанный в аргументах уже разрешённого инструмента, этому слою не виден.
  6. Перед расширением сделайте diff и запустите prover. Sentry — необязательный слой на BlueField-4. Без этого DPU не пишите изоляцию как уже случившуюся.

Если один вызов в пакете JSON-RPC отклонён, отклонён весь пакет. Не проверяйте поиск и возврат в одном пакете. Ответы сервера лежат вне этой политики.

Перед расширением разложите три объекта

Отказ — это имя инструмента, путь к двоичному файлу, хост и порт или форма аргументов. Разделите это, прежде чем править подсказку.

  • форматировать tools/call рядом с политикой, затем проверка Schema: проходят ли arguments ворота.
  • Через извлечение JSONPath достаньте $.params.name, $.method и $.arguments.order_id.
  • JSON Diff network_policies до и после расширения. Сначала посмотрите новое имя инструмента, потом подсказку.
  • Журналы песочницы называют отклонённые host, path и binary. openshell logs --tail --source sandbox.
  • Токены в журналах уберите до публикации, на своей машине. Заказы и секреты не вставляйте в публичный форматтер. JSONSort работает в браузере.

Если три объекта сходятся, видно, какой слой остановил refund_order. Запись изоляции Sentry — не один из этих трёх JSON.

Частые ошибки

  • Считать OpenShell тем же, что allow / ask / deny сессии. Тот список живёт в harness. OpenShell — это прокси песочницы и ядро. Обе политики нужны.
  • Решить, что разрешённое имя инструмента уже проверило order_id. Документация говорит, что сопоставление аргументов пока не поддерживается. Schema хоста остаётся.
  • Проверять только ответ модели. Прокси видит тело запроса к конечной точке MCP. Ответы и SSE сейчас не разбираются.
  • Позволить песочнице самой одобрять политику. Policy Advisor только подаёт предложение. Одобрение снаружи песочницы. Находка prover блокирует автоодобрение.
  • Записать Sentry как JSON Schema. Открытые тексты описывают внеполосную изоляцию и корреляцию на BlueField-4. Нет списка полей — не выдумывайте его.
  • Этим текстом пересказать выход из среды. Эти события уже есть на сайте. Здесь только то, как граница останавливает один tools/call.

FAQ

Может ли Sentry заменить OpenShell?

Нет. OpenShell — это программная среда: песочница, ядро и исходящая политика. Sentry — необязательный внеполосный слой на BlueField-4. Он изолирует выход за границу за миллисекунды. Без этого DPU остаётся только слой OpenShell. Оба стоят вне модели.

Читает ли прокси аргументы tools/call?

Нет. Он сопоставляет метод и имя инструмента. Разрешённый инструмент принимает любые аргументы. Один отклонённый вызов отклоняет весь пакет. Schema хоста снова проверяет форму аргументов.

Это тот же файл, что разрешения Cursor или Claude Code?

Нет. Те файлы решают, можно ли запускать Shell, Git и файловые инструменты внутри сессии. OpenShell решает, может ли двоичный файл в песочнице послать MCP-запрос на хост и порт. Одно живёт в harness. Другое — граница песочницы.

Что блокирует prover?

Он формально проверяет политику до того, как она вступит в силу. Новая досягаемость с учётными данными, новые методы HTTP и доступ к облачным метаданным помечаются, и находка блокирует автоодобрение. Правила имён инструментов на выполнении и Schema он не заменяет.

Фильтруются ли ответы MCP от сервера?

По текущей документации нет. Ответы JSON-RPC и сообщения MCP от сервера к клиенту в теле ответа или потоке SSE передаются без разбора политики. Проверяйте запрос, который покидает песочницу.

Вывод

Эта платформа NVIDIA ставит границу вызова инструмента вне модели. OpenShell разрешает или отклоняет инструмент MCP по имени. Sentry изолирует выполнение за границей на BlueField-4. Аргументы по-прежнему проверяет хост по Schema.

Сначала запишите, что lookup_order лежит в rules, refund_order — в deny_rules, а A-1042 — в Schema хоста. Когда эти три места сходятся, вызов действительно ограничен.

Дальше по теме

История: Первая публикация