Développement IA

Comment NVIDIA OpenShell et Sentry limitent les appels d’outils JSON d’un agent (2026)

Environ 16 min

Le modèle ne remplit que du JSON. Le 28 septembre 2026, NVIDIA a placé la limite hors du modèle : OpenShell lit le nom d’outil de tools/call dans le proxy du bac à sable, et Sentry isole hors bande sur BlueField-4. Autoriser lookup_order n’autorise pas un order_id quelconque.

Avant de lire

Couche Fait officiel Ce qui bloque l’appel
OpenShell Apache 2.0. Bac à sable et isolation noyau. Le proxy inspecte le corps de requête que le bac à sable envoie à un serveur MCP Autoriser ou refuser selon le nom d’outil. Les arguments ne sont pas appariés
Sentry Veilleur hors bande sur BlueField-4. Isole en millisecondes une sortie de la limite logicielle. Conception de référence, optionnelle Le matériel arrête l’exécution. Il ne remplit pas de JSON
Preuve de politique Tourne dans la passerelle. Une nouvelle atteinte avec identifiants, de nouvelles méthodes HTTP ou les métadonnées cloud bloquent l’approbation automatique Avant un changement de politique. Pas le Schema d’exécution
Schema de l’hôte Les docs : un outil autorisé accepte n’importe quels arguments Vérifier les arguments avant l’exécution

Faits du communiqué et du blog technique NVIDIA du 28 septembre 2026, et des docs de politique OpenShell. La commande A-1042 est fictive. Le JSON ci-dessous reprend les champs du YAML documenté, pas un schéma filaire Sentry inédit.

OpenShell bloque le nom d’outil. Sentry bloque l’exécution au-delà de la limite.

La plateforme Open Agent Safety, ce sont deux pièces, pas une permission de chat de plus. La première est OpenShell, Apache 2.0, largement disponible. Elle place un agent sur CPU dans un bac à sable : le noyau régit fichiers, appels système et réseau, et le proxy inspecte le HTTP qui sort du bac. Un point MCP utilise protocol: mcp. Il inspecte le corps que le bac envoie au serveur et peut autoriser ou refuser selon la méthode et le nom d’outil de tools/call. La seconde est Sentry, une conception de référence. Elle tourne sur un DPU BlueField-4, hors bande, hors de portée de l’agent. Si l’agent quitte la limite logicielle, Sentry l’isole et l’arrête en millisecondes. Dans un POD Vera Rubin, ce DPU est sur le seul chemin du nœud vers le modèle. Troisièmement, les arguments ne sont dans aucune des deux couches. OpenShell écrit que l’appariement des arguments n’est pas encore pris en charge. Un outil autorisé accepte tout argument que le serveur accepte.

  • OpenShell : lookup_order peut être autorisé. refund_order va dans deny_rules.
  • Sentry : une couche matérielle optionnelle. Elle corrèle interactions, décisions de politique et accès aux outils, et vérifie l’identité. Elle ne remplace pas la liste d’outils.
  • L’hôte : savoir si A-1042 est licite reste une vérification Schema de arguments.

allow / ask / deny dans une session est une autre porte : le modèle de permissions de l’agent de code. La forme de tools/call MCP : comment un agent de code appelle MCP. Les sorties d’environnements d’évaluation sont déjà traitées : la crise de sécurité des agents et la validation JSON. Ce texte ne les raconte pas. Il sépare seulement comment OpenShell et Sentry arrêtent un appel d’outil.

Le proxy voit tools/call, pas la prose du modèle

OpenShell analyse la requête JSON-RPC que le processus du bac à sable envoie au point MCP. Commande fictive. Le nom d’hôte est orders.example.com :

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

Il vérifie method et params.name. Par défaut, le nom d’outil doit aussi correspondre à ^[A-Za-z0-9_.-]{1,128}$. C’est mcp.strict_tool_names, vrai par défaut. Les correspondances joker exigent que ce réglage reste actif. order_id dans arguments ne fait pas partie de cette politique. Les réponses JSON-RPC, et les messages MCP du serveur vers le client sur le corps de réponse ou le SSE, sont relayés sans analyse de politique. Un appel refusé refuse tout le lot.

Écrire la politique par nom d’outil. Mettre les arguments sur une autre porte.

Les docs livrent du YAML, appliqué en entier avec openshell policy set. La mise à jour incrémentale policy update --add-endpoint n’accepte pas encore mcp. Le JSON ci-dessous reprend les mêmes champs, pour pouvoir les comparer. La consultation est autorisée. Le remboursement est refusé. mcp.allow_all_known_mcp_methods vaut faux par défaut, donc chaque méthode est listée. Omettre mcp.versions n’autorise que la révision 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 et landlock se verrouillent à la création du bac. network_policies peut se recharger à chaud. Le chemin du binaire appartient à la règle : quel programme peut joindre quel point. La politique sortante n’autorise pas les réseaux privés par défaut, ni le bouclage, ni le lien local, ni l’adresse de métadonnées cloud. Une fois lookup_order autorisé, la porte des arguments est l’hôte :

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

Ce Schema n’est pas un champ OpenShell. Après que le proxy autorise le nom d’outil, l’hôte refuse encore un champ manquant, un champ en trop, et un order_id qui n’a pas la forme de A-1042. Pourquoi le Schema est une porte : pourquoi l’IA a besoin de JSON Schema.

Quatre portes. Ne les fusionnez pas.

On appelle tout cela de la sécurité. Elles regardent des objets différents :

Porte Ce qu’elle voit
Proxy OpenShell La requête du bac vers orders.example.com:443/mcp. Méthode, nom d’outil et binaire appelant. Pas arguments.
Schema de l’hôte Les arguments de lookup_order. Type, obligatoire, pattern. L’exécution vient après la porte.
allow / ask / deny de l’agent de code Shell, Git et outils de fichiers dans la session. Cette liste vit dans le harness. OpenShell est une autre couche hors du bac.
Sentry Exécution hors bande sur BlueField-4. Une sortie de limite est isolée. Les textes publics ne publient pas de liste de champs JSON Sentry. Ne prenez pas cet objet de politique pour cette liste.

Un changement de politique peut aussi passer le prouveur avant de prendre effet. Il signale une nouvelle atteinte avec identifiants, de nouvelles méthodes HTTP et l’accès aux métadonnées cloud. Une trouvaille bloque l’approbation automatique. La commande est openshell-prover, adaptée à la CI. Un agent peut soumettre une proposition étroite via Policy Advisor. L’approbation se fait hors du bac. Comment la boucle et l’état se posent : le harness d’agent et l’état JSON.

Six étapes avant d’élargir une règle

Ne commencez pas par activer Sentry. Nommez quelle couche a bloqué quel appel :

  1. Séparer le JSON du modèle et la politique d’exécution. Le modèle remplit params.name. OpenShell décide si ce nom peut quitter le bac.
  2. Écrire le système de fichiers et Landlock à la création. Ces sections ne se rechargent pas comme les règles réseau.
  3. Remplir le point MCP. host, port, path: /mcp, protocol: mcp, enforcement: enforce. Ne partagez pas cet hôte et ce port avec un autre protocole inspecté.
  4. Lister les noms d’outils un par un. initialize, notifications/initialized, tools/list, puis tools/call avec lookup_order. Mettez refund_order dans deny_rules. Laissez strict_tool_names à vrai.
  5. Donner les arguments à un Schema d’hôte. Le proxy ne lit pas order_id. Un remboursement glissé dans un outil déjà autorisé est invisible pour cette couche.
  6. Comparer avant d’élargir, et lancer le prouveur. Sentry est la couche optionnelle BlueField-4. Sans ce DPU, n’écrivez pas l’isolement comme déjà survenu.

Si un appel d’un lot JSON-RPC est refusé, tout le lot l’est. Ne testez pas une consultation et un remboursement dans le même lot. Les réponses du serveur sont hors de cette politique.

Avant d’élargir, étalez trois objets

Un refus est un nom d’outil, un chemin de binaire, un hôte et un port, ou une forme d’arguments. Séparez cela avant de modifier le prompt.

  • formater le tools/call à côté de la politique, puis validation Schema pour voir si arguments passe la porte.
  • Utilisez extraction JSONPath pour $.params.name, $.method et $.arguments.order_id.
  • JSON Diff network_policies avant et après l’élargissement. Regardez le nouveau nom d’outil avant de réécrire le prompt.
  • Les journaux du bac nomment l’hôte, le chemin et le binaire refusés. openshell logs --tail --source sandbox.
  • masquer d’abord les jetons des journaux. Ne collez pas de commandes ni de secrets dans un formateur public. JSONSort tourne dans le navigateur.

Si ces trois objets s’alignent, vous savez quelle couche a arrêté refund_order. Un enregistrement d’isolement Sentry n’est pas l’un de ces trois JSON.

Pièges fréquents

  • Prendre OpenShell pour le allow / ask / deny de session. Cette liste vit dans le harness. OpenShell est le proxy et le noyau du bac. Gardez les deux politiques.
  • Croire qu’un nom d’outil autorisé a vérifié order_id. Les docs disent que l’appariement des arguments n’est pas encore pris en charge. Le Schema de l’hôte reste.
  • N’inspecter que la réponse du modèle. Le proxy voit le corps envoyé au point MCP. Réponses et SSE ne sont pas analysés aujourd’hui.
  • Laisser le bac approuver sa propre politique. Policy Advisor ne soumet qu’une proposition. L’approbation est hors du bac. Une trouvaille du prouveur bloque l’approbation automatique.
  • Écrire Sentry comme un JSON Schema. Les textes publics décrivent un isolement hors bande et une corrélation sur BlueField-4. Sans liste de champs, n’en inventez pas.
  • Utiliser ce texte pour raconter une évasion. Ces événements sont déjà sur le site. Ici, il s’agit seulement de la façon dont une limite arrête un tools/call.

FAQ

Sentry peut-il remplacer OpenShell ?

Non. OpenShell est l’exécution logicielle : bac à sable, noyau et politique sortante. Sentry est la couche hors bande optionnelle sur BlueField-4. Elle isole une sortie de limite en millisecondes. Sans ce DPU, il ne reste que la couche OpenShell. Les deux sont hors du modèle.

Le proxy lit-il les arguments de tools/call ?

Non. Il apparie la méthode et le nom d’outil. Un outil autorisé accepte n’importe quels arguments. Un appel refusé refuse tout le lot. Le Schema de l’hôte revérifie la forme des arguments.

Est-ce le même fichier que les permissions de Cursor ou de Claude Code ?

Non. Ces fichiers décident si Shell, Git et les outils de fichiers peuvent tourner dans une session. OpenShell décide si un binaire du bac peut envoyer une requête MCP vers un hôte et un port. L’un vit dans le harness. L’autre est la limite du bac.

Que bloque le prouveur ?

Il vérifie formellement une politique avant qu’elle prenne effet. Une nouvelle atteinte avec identifiants, de nouvelles méthodes HTTP et l’accès aux métadonnées cloud sont signalés, et une trouvaille bloque l’approbation automatique. Il ne remplace ni les règles de noms d’outils à l’exécution ni le Schema.

Les réponses MCP du serveur sont-elles filtrées aussi ?

Pas dans les docs actuelles. Les réponses JSON-RPC, et les messages MCP du serveur vers le client sur un corps de réponse ou un flux SSE, sont relayés sans analyse de politique. Vérifiez la requête qui quitte le bac.

Conclusion

Cette plateforme NVIDIA place la limite de l’appel d’outil hors du modèle. OpenShell autorise ou refuse un outil MCP selon son nom. Sentry isole l’exécution au-delà de la limite sur BlueField-4. L’hôte vérifie encore les arguments avec un Schema.

Écrivez que lookup_order est dans rules, que refund_order est dans deny_rules, et que A-1042 est dans le Schema de l’hôte. Quand ces trois-là s’alignent, l’appel est réellement limité.

Pour aller plus loin

Historique : Première publication