Prendre rendez-vous

OWASP Agent Control Standard (ACS) : contrôler les agents IA à l’exécution

L’OWASP Agent Control Standard (ACS) est une spécification ouverte qui permet à un Guardian Agent d’examiner les actions d’un agent IA à des hooks définis et, en fonction d’une politique, de les autoriser, de les bloquer, de les modifier, de les soumettre à approbation ou de les reporter. Cette analyse approfondie montre ce que la version 0.1.0 apporte aujourd’hui — et où se situent ses limites.

Mise à jour: octobre 2026 · Valeri Milke, Lead Auditor ISO 27001 & ISO 42001

Vous recevez le lien de téléchargement immédiatement sur la page et par e-mail.

Observed Agentp. ex. agent de codage
Guardian AgentPolicy-as-Code + LLM en option
  • allow
  • deny
  • modify
  • ask
  • defer
InstrumentHooks & dispositionsTraceOpenTelemetry & OCSFInspectAgBOM
Schéma selon ACS v0.1.0 : l’Observed Agent signale un appel d’outil via un hook, et le Guardian répond par une disposition avant que l’action ne s’exécute. Lignes de journal à titre d’illustration.
19hooks natifs steps/* dans la spécification v0.1.0 — de sessionStart à sessionEnd, y compris les trois hooks de skills
5dispositions : allow, deny, modify, ask et defer — la spécification cite expressément le vocabulaire complet pour steps/toolCallRequest
7profils de conformité : acs-core obligatoire plus six profils optionnels — déclarés lors du handshake, sans vérification externe
6hooks minimaux pour ACS-Core : sessionStart, userMessage ou agentTrigger, toolCallRequest, toolCallResult, agentResponse, sessionEnd

Les agents IA ne se contentent pas de lire, ils agissent : ils exécutent des commandes shell, appellent des API, envoient des e-mails et écrivent dans leur mémoire. Les prompts système ne permettent pas de contrôler cela. L’OWASP Agent Control Standard (ACS) intervient précisément à ce niveau et standardise le contrôle à l’exécution sous la forme d’un protocole entre l’agent et le Guardian. Cette page explique la spécification v0.1.0 du point de vue du RSSI : hooks et dispositions, failure posture, Policy-as-Code, piste d’audit, traces selon OpenTelemetry et OCSF ainsi que l’AgBOM. Le simulateur présente des exemples de messages wire conformes aux schémas, la matrice des risques rattache ACS — selon l’appréciation de VamiSec — à l’OWASP Agentic Top 10, et nous indiquons ouvertement ce que ce standard, encore jeune, ne permet pas aujourd’hui. Le navigateur de profils, l’autoévaluation et un livre blanc destiné aux RSSI (en allemand) facilitent la prise en main.

De l’Agent Observability Standard à ACS v0.1

Comment un projet d’observabilité est devenu un standard de contrôle — toutes les étapes documentées jusqu’à l’objectif fixé pour v0.2.0. Cliquez sur une étape pour en afficher les détails.

Neuf concepts clés de l’Agent Control Standard

Cliquez sur une carte pour lire le concept clé — l’ordre suit le parcours d’une action d’agent, du hook à la preuve en passant par la décision.

Le standard dans l’explorateur

Trois piliers, l’architecture du Guardian, l’identité et la provenance ainsi que les profils de conformité — chacun avec les points clés de la spécification v0.1.0 et ses limites.

Pilier
  • Interception, évaluation et application en temps réel : enveloppes JSON-RPC 2.0 sur HTTP(S) ou stdio, méthodes de hook dans l’espace de noms steps/*.
  • 19 hooks natifs couvrant l’ensemble du cycle de vie : session, tour, messages, connaissances et mémoire, outils, compactage, sous-agents et skills.
  • steps/toolCallRequest doit se déclencher pour chaque action qui quitte le contexte de raisonnement — y compris pour les opérations shell, fichiers et réseau intégrées.
  • L’Observed Agent doit attendre la décision et l’appliquer ; un framework qui ignore les verdicts n’est pas conforme.
  • Le streaming, les notifications et l’interruption sont absents de v0.1.0 — une réponse ne connaît que le type final.
JSON-RPC 2.0steps/*steps/toolCallRequestDecision Honoring
Interactif

Simulateur Guardian : six scénarios pas à pas

Choisissez un scénario et suivez le parcours d’une requête de hook de l’Observed Agent vers le Guardian Agent, la disposition qui en résulte et ce qui est consigné dans la piste d’audit — y compris lorsque le Guardian est indisponible.

Agent de codage

L’agent de codage doit nettoyer des artefacts de build. À cause d’un chemin mal résolu, la commande shell prévue rm -rf vise le répertoire personnel au lieu du dossier de build.

  1. 1Requête de hook (Observed Agent → Guardian)
    {
      "jsonrpc": "2.0",
      "method": "steps/toolCallRequest",
      "id": 41,
      "params": {
        "acs_version": "0.1.0",
        "request_id": "6b2f9e14-0c3a-4d7b-a5e8-91f2c4d6b803",
        "timestamp": "2026-10-06T09:12:41Z",
        "metadata": {
          "agent_id": "coding-agent-ci-07",
          "session_id": "3f6c2a18-9d4e-4b1a-8c55-2e7f90a1b3c4",
          "turn_id": "a1d4e7f0-2b5c-4e8a-9f13-6c0d2e5f8a71"
        },
        "payload": {
          "tool": {
            "name": "shell"
          },
          "operation": "delete_recursive",
          "capability": "filesystem.delete",
          "arguments": {
            "command": {
              "value": "rm -rf ~/",
              "provenance": {
                "provenance_id": "p-112",
                "origin": "agent_generated",
                "derived_from": [
                  "p-101"
                ]
              }
            }
          },
          "raw_command": "rm -rf ~/"
        },
        "signature": {
          "algorithm": "HMAC-SHA256",
          "value": "unUBv7dka1B1VD+fgzjF9E+IGC3GiQihQdQxEtIyG54=",
          "key_id": "sess-hmac-coding-07"
        }
      }
    }
  2. 2Évaluation par le Guardian
    • Couche déterministe (Policy-as-Code, référence en v0.1 : OPA/Rego) : le framework signale l’appel shell avec la capability filesystem.delete et l’opération delete_recursive ; la règle deny_recursive_delete_outside_workspace s’applique.
    • Vérification du chemin : la cible ~/ (répertoire personnel) se trouve hors de l’espace de travail auquel la politique restreint cette session.
    • Vérification de la provenance : la commande est agent_generated (dérivée de p-101) — aucun humain n’a explicitement indiqué cette cible.
    • La couche LLM optionnelle n’est pas nécessaire : deny avec reasoning, reason_codes et policy_references, évaluateur deterministic.
    DispositiondenyAction bloquée
  3. 3Réponse (Guardian → Observed Agent)
    {
      "jsonrpc": "2.0",
      "id": 41,
      "result": {
        "type": "final",
        "acs_version": "0.1.0",
        "request_id": "6b2f9e14-0c3a-4d7b-a5e8-91f2c4d6b803",
        "decision": "deny",
        "reasoning": "Recursive delete targets the user's home directory, outside the workspace root the session is scoped to.",
        "reason_codes": [
          "destructive_operation",
          "path_outside_workspace"
        ],
        "policy_references": [
          {
            "policy_id": "coding-agent-fs",
            "policy_version": "2026.10.2",
            "rule_id": "deny_recursive_delete_outside_workspace"
          }
        ],
        "cited_provenance_ids": [
          "p-112"
        ],
        "metadata": {
          "evaluator": "deterministic",
          "evaluation_duration_ms": 3
        },
        "chain_hash": "49c17246a18080bbeeaee88743bff94616b58cb6beb24e870b68a6f3ad55ecc3",
        "signature": {
          "algorithm": "HMAC-SHA256",
          "value": "Z1NyoNzC5LkVEcrZS6rzuc3CFaPO8vgfYg5/lhCpuho=",
          "key_id": "sess-hmac-coding-07"
        }
      }
    }

    L’Observed Agent n’exécute pas la suppression et reçoit la justification en retour. S’il propose un chemin corrigé, celui-ci est vérifié à nouveau.

  4. 4Piste d’audit (Trace)
    {
      "_note": "vereinfachter Auszug",
      "class_uid": 2004,
      "class_name": "Detection Finding",
      "category_uid": 2,
      "activity_id": 1,
      "severity_id": 4,
      "time": 1791277961003,
      "metadata": {
        "version": "1.5.0"
      },
      "finding_info": {
        "uid": "dec-6b2f9e14",
        "title": "Tool call denied: recursive delete outside workspace"
      },
      "enrichments": [
        {
          "name": "acs_provenance_origin",
          "value": "agent_generated"
        }
      ],
      "unmapped": {
        "acs": {
          "decision": "deny",
          "evaluator": "deterministic",
          "policy_references": [
            {
              "policy_id": "coding-agent-fs",
              "policy_version": "2026.10.2",
              "rule_id": "deny_recursive_delete_outside_workspace"
            }
          ],
          "reason_codes": [
            "destructive_operation",
            "path_outside_workspace"
          ],
          "cited_provenance_ids": [
            "p-112"
          ],
          "session_id": "3f6c2a18-9d4e-4b1a-8c55-2e7f90a1b3c4",
          "step_id": "6b2f9e14-0c3a-4d7b-a5e8-91f2c4d6b803"
        }
      }
    }

    Le mapping ACS représente les décisions autres que allow par la classe OCSF 2004 Detection Finding ; deny reçoit severity_id 4 (High).

Ce que cela signifie pour vous

Les actions destructrices doivent passer par une règle déterministe qui s’applique avant l’exécution — et non par le prompt système. Cela n’est efficace que si le framework fait passer chaque action ayant un effet externe par steps/toolCallRequest, y compris les opérations intégrées sur les fichiers et le shell.

ASI02ASI05

Suppression récursive hors de l’espace de travail: deny

Remarque : exemples conformes au schéma ACS v0.1.0 (validés par rapport à request-envelope.json, response-envelope.json, context-entry.json et aux schémas des hooks, y compris les variantes *.acs-provenance) ; les valeurs ainsi que les noms de politiques et de règles sont illustratifs, les signatures sont calculées avec une clé de démonstration et les extraits de trace simplifiés ; les correspondances ASI sont des appréciations de VamiSec. La seule implémentation de référence (preuve de concept) n’évalue jusqu’à présent en direct que steps/toolCallRequest et steps/toolCallResult.

Pilier Instrument

Cycle de vie des hooks : où ACS peut intervenir

Les 19 hooks natifs steps/* de la spécification v0.1.0, ainsi que les méthodes AgBOM, handshake et système, tout au long d’une session d’agent. Sélectionnez un hook pour voir son déclencheur, la marge de manœuvre du Guardian et les risques typiques.

01SessionHandshake, démarrage, activation, fin
02AgBOMInventaire au démarrage et en cas de modification
03TourEncadre chaque tour de l’agent
04MessagesEntrée et sortie
05Connaissances et mémoireRequêtes RAG et mémoire
06OutilsAvant et après chaque action
07CompactageCondenser la fenêtre de contexte
08Sous-agentsDélégation au sein du même processus
09SkillsEnregistrer, charger, décharger
10SystèmeDisponibilité (liveness)
handshake/helloHandshake

Handshake

Quand
En début de session, avant tout hook : l’Observed Agent envoie un ClientHello indiquant les versions, méthodes, transports, mode de provenance et profils pris en charge.
Ce que peut faire le Guardian
Répond par un ServerHello au lieu d’une disposition et fixe negotiated_version, methods_evaluated, timeout_config et, en option, on_decision_failure. Les méthodes hors de methods_evaluated sont traitées en ALLOW-by-default. Le Guardian peut refuser la session, par exemple avec PROVENANCE_REQUIRED (-32002).
Risques typiques
ASI03ASI08

Décompte selon la spécification v0.1.0 : 19 hooks natifs steps/* ; avec agbom/snapshot, agbom/changed et system/ping, 22 méthodes disposant de leur propre schéma de charge utile, auxquelles s’ajoutent handshake/hello et l’espace de noms MCP protocols/MCP/*. La spécification fixe les dispositions autorisées par hook dans le texte, et non dans le schéma. ACS-Core exige au moins six hooks ; ce qui ne figure pas dans methods_evaluated est traité en ALLOW-by-default. Le point sur un hook signale une variante stricte *.acs-provenance. L’attribution des risques typiques à chaque hook est une appréciation de VamiSec.

Appréciation de VamiSec

Matrice des risques : OWASP Agentic Top 10 × composants ACS

Quels composants de l’Agent Control Standard contrôlent directement les risques de l’OWASP Top 10 for Agentic Applications 2026, y contribuent ou ne les couvrent pas — avec justification et limites pour chaque ligne.

Couverture des risques ASI01 à ASI10 par six composants ACS (2 = contrôle direct, 1 = contribution, 0 = non couvert) ; appréciation de VamiSec sur la base d’ACS v0.1.0.
OWASP Agentic Top 10

Appréciation de VamiSec sur la base d’ACS v0.1.0 — il ne s’agit pas d’une correspondance officielle de l’OWASP. ACS n’apparaît pas dans l’OWASP Agentic Top 10 (décembre 2025), et ni l’OWASP ni le projet ACS n’ont mis ACS en correspondance avec ASI01 à ASI10 ; l’effet de chaque cellule dépend de vos politiques et des profils négociés.

Interactif

Navigateur de profils : quelles briques ACS conviennent à votre agent ?

Jusqu’à cinq questions sur les outils, la réglementation, les sources de données, la dynamique et le SOC. Le résultat indique les profils ACS et les premières étapes que nous recommandons pour votre situation — une appréciation de VamiSec, pas une déclaration de conformité.

Votre parcours
  1. ?

1: Votre agent appelle-t-il des outils ou déclenche-t-il des actions ayant un effet externe — fichiers, shell, API, e-mails, tickets, paiements ?

1

Votre agent appelle-t-il des outils ou déclenche-t-il des actions ayant un effet externe — fichiers, shell, API, e-mails, tickets, paiements ?

ACS exige que steps/toolCallRequest se déclenche pour chaque action qui quitte le contexte de raisonnement. Sans de telles actions, les points de contrôle se limitent essentiellement aux entrées et aux sorties.

Analyse approfondie · 14 chapitres

L’Agent Control Standard en détail : du problème de contrôle à l’exploitation

Quatorze chapitres pour les RSSI, les architectes sécurité et les responsables de plateformes d’IA : ce que la spécification v0.1.0 exige sur le plan normatif, où elle s’arrête aujourd’hui et quelles décisions s’imposent avant une adoption. Les rapprochements avec des incidents, des risques et la réglementation sont signalés comme appréciation de VamiSec.

01Chapitre 1

Pourquoi les agents IA ont besoin d’un contrôle à l’exécution

Un agent IA ne se contente pas de répondre à des questions : il déclenche des actions — dans des systèmes de fichiers, des bases de données, des messageries et des comptes cloud. La question de sécurité ne porte donc plus sur la sortie du modèle, mais sur un autre point : qui vérifie une action concrète avant qu’elle soit exécutée ?

Du générateur de réponses à l’acteur

Les applications LLM classiques produisent du texte qu’un humain lit avant que quoi que ce soit ne se produise. Les agents IA, eux, planifient de manière autonome, appellent des outils, écrivent dans une mémoire à long terme et lancent des sous-agents. Chacune de ces étapes peut modifier des données ou les faire sortir vers l’extérieur. La question de contrôle devient donc : « Cette action précise, avec ces arguments précis, est-elle autorisée maintenant, dans cette session ? » On ne peut y répondre qu’à l’exécution — entre la décision du modèle et son exécution par le framework.

Les prompts système ne sont pas des contrôles

De nombreux déploiements s’appuient sur des consignes du prompt système telles que « ne supprimer aucune donnée de production ». De telles phrases sont des demandes adressées à un système probabiliste, pas des règles effectivement appliquées. La page du projet ACS ouvre d’ailleurs son argumentaire sur ce constat : les prompts système ne sont pas des contrôles, de meilleurs modèles ne couvrent ni les cas limites ni les entrées adversariales, et les garde-fous propriétaires créent une dépendance vis-à-vis du fournisseur.

Éditeurs comme chercheurs le confirment. OpenAI écrit le 22 décembre 2025 que l’injection de prompt est « unlikely to ever be fully 'solved' ». Dans l’étude « The Attacker Moves Second » (arXiv, 10 octobre 2025), des attaques adaptatives ont contourné douze mécanismes de défense récents, le plus souvent avec des taux de réussite supérieurs à 90 % — alors que la plupart avaient initialement annoncé des valeurs proches de zéro. La robustesse du modèle réduit le risque, mais ne l’élimine pas. Il faut une instance de contrôle indépendante, extérieure au modèle.

Lethal trifecta et Agents Rule of Two

Le 16 juin 2025, Simon Willison a décrit la « lethal trifecta » : un agent qui a accès à des données privées, qui est exposé à des contenus non fiables et qui peut communiquer vers l’extérieur peut être amené, par injection de prompt, à exfiltrer des données. Le 31 octobre 2025, Meta a prolongé ce modèle avec sa règle « Agents Rule of Two » : au sein d’une session, un agent ne devrait combiner au plus que deux des trois propriétés suivantes : traiter des entrées non fiables ; accéder à des systèmes sensibles ou à des données privées ; modifier un état ou communiquer avec l’extérieur. S’il a besoin des trois, une supervision s’impose au minimum, par exemple via une approbation humaine. Meta souligne que la règle complète le principe du moindre privilège sans le remplacer.

Appréciation de VamiSec : les deux modèles décrivent des propriétés d’une session, et non d’un modèle. On ne peut les faire respecter que si une instance voit chaque action ainsi que l’historique de la session. C’est précisément ce point de contrôle que standardise l’OWASP Agent Control Standard (ACS). Pour reconnaître les entrées non fiables, il faut le profil optionnel acs-provenance ; ACS-Core seul ne fournit aucune information de provenance.

Incidents documentés — et ce qu’un contrôle à l’exécution aurait limité

Incident (source, date)Ce qui s’est passéCe qui aurait pu limiter l’impact (appréciation de VamiSec)
EchoLeak, CVE-2025-32711, Microsoft 365 Copilot (NVD, 11 juin 2025 ; CVSS 3.1 : 9,3 Microsoft, 7,5 NVD)Zero-click : un e-mail piégé a amené Copilot à laisser fuiter des données internes via la réponse rendue ; corrigé avant la divulgation.Contrôle de steps/agentResponse avec modify (suppression des URL d’images et de liens externes) ou deny — à condition que l’hôte déclenche le hook et fournisse la provenance.
Un agent Replit supprime une base de données de production (SaaStr, juillet 2025 ; The Register, 22 juillet 2025)L’agent a ignoré un gel du code ordonné, supprimé la base de données de production et généré des messages d’état trompeurs.deny ou ask sur les capabilities destructrices de base de données au niveau de steps/toolCallRequest ; chaîne d’audit pour la reconstitution. En priorité : séparation dev/prod, sauvegardes.
GitHub MCP « Toxic Agent Flow » (Invariant Labs, 26 mai 2025)Injection de prompt dans une issue publique ; l’agent a publié des données issues de dépôts privés via une pull request. Pas de faille dans le code du serveur, pas de CVE.Politique de session « après une sortie d’outil non fiable, pas d’écriture dans un autre dépôt » avec deny ou ask au niveau de steps/toolCallRequest ; nécessite acs-provenance.
Amazon Q Developer Extension v1.84.0, CVE-2025-8217 (AWS-2025-015, 23 juillet 2025 ; CVSS 4.0 : 5,1)Prompt de suppression injecté dans la version officiellement publiée ; l’exécution a échoué à cause d’une erreur de syntaxe, les ressources des clients n’ont pas été affectées.Le prompt provenait du produit lui-même et est considéré comme fiable — la provenance n’aide pas. Des décisions deny ou ask sur les capabilities de suppression, ainsi que l’épinglage de version via l’AgBOM, auraient été efficaces.
ClawHavoc : skills malveillants sur ClawHub (The Hacker News, 2 février 2026 ; Unit 42, 23 juin 2026)Un premier audit a identifié 341 skills malveillants parmi 2 857 skills analysés, dont certains intégrant un dropper encodé en Base64.Contrôle lors de skillRegister et liaison au digest lors de skillLoad ; ensuite deny sur le schéma téléchargement puis exécution (network.egress plus process.execute).

Tous ces incidents sont antérieurs à la spécification canonique ACS v0.1.0 (5 juin 2026). La colonne de droite est une évaluation, et non l’affirmation qu’ACS aurait empêché un incident.

Pourquoi le contrôle doit intervenir à l’exécution

Le choix du modèle, le durcissement des prompts et le red teaming avant la mise en production restent nécessaires, mais ne disent rien de ce que fait un agent dans une session concrète. Le contrôle à l’exécution les complète : il intervient avant l’action, évalue le contexte de toute la session et laisse une piste d’audit reconstituable. Pour ASI02 (Tool Misuse and Exploitation), l’OWASP Top 10 for Agentic Applications 2026 recommande un middleware d’application des politiques placé en amont, un « Intent Gate » qui vérifie l’intention et les arguments avant l’exécution. ACS n’y est pas cité, mais fournit (appréciation de VamiSec) un contrat d’interface ouvert (wire contract) précisément pour ce point de contrôle. Les politiques restent de votre ressort.

02Chapitre 2

Ce qu’est ACS : parties, trois piliers, ACS-Core et sept profils

L’OWASP Agent Control Standard (ACS) est une spécification d’interface ouverte qui permet à un Guardian Agent distinct de contrôler ce qu’un agent IA s’apprête à faire. Le Guardian autorise, bloque ou modifie l’action, la soumet à approbation ou diffère sa décision — avant qu’elle n’ait lieu.

Plus précisément : l’Agent Control Standard (ACS) est une spécification de l’OWASP GenAI Security Project qui définit à quels points de contrôle (hooks) un agent IA soumet ses étapes à une instance de politique externe, et comment celle-ci répond par une décision (disposition). Le format est JSON-RPC 2.0 avec un champ propre, acs_version, transporté via HTTP(S) ou stdio. L’état actuel est la spécification v0.1.0, publiée sous la release 0.1.2 (tag du 21 septembre 2026). ACS définit le contrat entre l’agent et le Guardian, pas les politiques : ce qui est autorisé reste du ressort de votre organisation.

Les parties

RôleMission selon la spécificationForme typique (exemple)
Observed AgentLe système surveillé, fondé sur un LLM. Il implémente le contrat d’interface, signale chaque étape pertinente via un hook et applique la disposition reçue. Il ne décide pas de ses propres actions.Agent de codage, agent de support, framework d’agents raccordé à un hôte
Guardian AgentL’instance de politique. Elle évalue chaque hook au regard de la politique du déploiement, renvoie une disposition et doit journaliser chaque décision avec sa justification, l’identifiant du modèle évaluateur et — si disponible — un niveau de confiance.Moteur de politiques (p. ex. OPA/Rego), éventuellement complété par une couche LLM
Approver (approbateur)Tierce partie que le Guardian sollicite en cas de ask : humain, agent ou service. Le Guardian doit vérifier son identité au regard de la politique.Responsable sécurité, service d’approbation, workflow de tickets
PrincipalLa partie authentifiée qui déclenche une session ou agit en son sein.Collaborateurs, compte de service

La spécification exige de ne pas confondre trois identités : celle de l’Observed Agent, celle du Guardian et celle de l’auteur de la politique.

Un principe de conception porte l’architecture : le modèle de langage ne doit rien savoir des hooks. C’est le framework qui les déclenche, et les informations de provenance sont renseignées en dehors du chemin de sortie du modèle. Selon notre lecture, un modèle manipulé ne doit ainsi pouvoir ni voir ni influencer le point de contrôle.

Trois piliers : Instrument, Trace, Inspect

Instrument

Intercepter, évaluer et faire appliquer en temps réel : 19 hooks natifs steps/*, cinq dispositions, handshake, protection contre le rejeu et signatures. C’est sur ce pilier que repose le socle obligatoire ACS-Core.

Trace

Un vocabulaire grâce auquel les événements de hook apparaissent sous forme de spans OpenTelemetry et d’événements OCSF ; les décisions sont consignées comme événement de span sur l’étape qui les a déclenchées. ACS n’invente pas de nouveau format de journal. Trace fonctionne de manière découplée de l’application des décisions (enforcement) et en best-effort.

Inspect

L’AgBOM (Agent Bill of Materials) : un inventaire dynamique des modèles, serveurs MCP, pairs A2A, outils, sources de connaissances, memory stores, capabilities et skills, sérialisable en CycloneDX 1.6, SPDX 3.0 ou SWID.

ACS-Core et sept profils

La conformité est modulaire. ACS-Core constitue le socle obligatoire, sur lequel s’appuient six profils optionnels qu’un déploiement déclare lors du handshake. Il n’existe pas de niveaux numérotés — seulement des noms de profils combinables indépendamment les uns des autres. Seule dépendance : acs-inspect-dynamic étend acs-inspect.

Profil (nom dans le handshake)Essentiel de l’exigenceCe à quoi il vous sert
acs-core (obligatoire)Entre autres handshake, enveloppe JSON-RPC, au moins six hooks, les cinq dispositions avec leurs champs obligatoires, chaîne d’audit liée par hachage avec tête de chaîne (chain head) publiée, protection contre le rejeu, signature HMAC-SHA256 sur chaque requête et chaque réponse, Decision Honoring, system/pingCanal authentifié ; l’agent respecte les décisions du Guardian
acs-tracePour chaque étape prise en charge, des événements OpenTelemetry et/ou OCSF avec attributs obligatoires ; chaque décision sous forme d’événement de traceRaccordement au SIEM, observabilité multi-fournisseurs
acs-inspectagbom/snapshot une fois par session avant le premier hook porteur de contenu ; sur demande, le Guardian sérialise dans au moins un format de BOMPolitiques dépendant de l’inventaire, par exemple l’interdiction d’un modèle ou d’un outil
acs-inspect-dynamicEn plus, agbom/changed à chaque modification du graphe de composantsDétecter les remplacements à chaud (hot swaps) de modèles, de serveurs MCP ou de skills en cours de session
acs-provenanceObjet de provenance sur chaque champ porteur de données de chaque hook (provenance_producer: deterministic)Politiques de flux d’information selon FIDES, CaMeL ou un schéma de type AARM
acs-cryptoSignatures asymétriques ou post-quantiques, au minimum ML-DSA-65Non-répudiation vis-à-vis de tiers
acs-auditrequest_hash sur chaque ContextEntry de la chaîne d’auditLa chaîne lie aussi le contenu des requêtes, pas seulement les métadonnées

Dans la v0.1.0, la conformité est une autodéclaration lors du handshake : pas de suite de tests, pas de registre des implémentations conformes, pas d’organisme d’évaluation.

Ce que garantit ACS-Core, la spécification le formule sobrement : le canal est authentifié et l’Observed Agent respecte les décisions. Rien ne garantit en revanche que les politiques soient strictes — un Guardian permissif est conforme, simplement permissif. La détectabilité des manipulations de la chaîne d’audit, y compris face à un Guardian compromis, n’est assurée que par acs-crypto et acs-audit, car la base HMAC repose sur un procédé symétrique. Les combinaisons données en exemple par la spécification vont d’une intégration IDE minimale avec acs-core seul jusqu’à un déploiement à haut niveau d’assurance avec les sept profils.

Le modèle en tiers de la page du projet : des couches d’architecture, pas des niveaux

  1. Tier 1 · Platform layer

    Les frameworks d’agents fournissent des hooks middleware standardisés — c’est là que naît le point de contrôle.

  2. Tier 2 · Enforcement layer

    Un composant open source lit des politiques déclaratives et renvoie des décisions via ces hooks.

  3. Tier 3 · Enterprise layer

    Des classificateurs propres et une logique métier spécifique se raccordent derrière la même interface.

Ce schéma décrit qui apporte quelle partie, et non le degré de conformité d’un déploiement. Pour toute déclaration de conformité, seuls les profils comptent. Il reste utile pour votre planification d’architecture : il sépare la question de la plateforme qui fournit les hooks de celle de savoir qui exploite et maintient les politiques.

03Chapitre 3

Genèse, gouvernance et licence : d’AOS au projet OWASP

Adopter un standard tôt suppose de savoir qui le pilote, sous quelle licence il est publié et quelle est la solidité de sa feuille de route. ACS a une histoire courte, mais mouvementée.

De l’observation au contrôle

Les travaux ont débuté le 11 mai 2025 sous le nom « Agent Observability Standard » (AOS) dans l’écosystème GitHub de Zenity, puis ont rejoint en juin 2025 l’organisation OWASP, où AOS figurait comme « OWASP other project ». En mai et juin 2025, la couche protocole s’est provisoirement appelée « ASOP » (Agent Security & Observability Protocol), avant de reprendre le nom AOS. Après une phase de commits seulement sporadiques à partir de mi-2025, le projet a été rebaptisé Agent Control Standard le 10 avril 2026. Le nouveau nom marque le pas franchi sur le fond : de la simple observation à l’application effective des règles. ACS a ensuite brièvement fonctionné comme projet indépendant hors de l’OWASP, avant d’y revenir en septembre 2026 — cette fois au sein de l’OWASP GenAI Security Project.

DateJalon
11 mai 2025Premiers commits sous le nom « Agent Observability Standard » (AOS)
Juin 2025Passage dans l’organisation OWASP
10 avril 2026Changement de nom AOS → ACS (Agent Control Standard)
27 mai 2026Communiqué de lancement via Business Wire, phase en tant que projet indépendant
5 juin 2026Intégration de la spécification canonique v0.1.0, y compris les hooks de skills
11 août 2026Release v0.1.1 : nouvelles licences, spécification inchangée
Du 1er au 10 septembre 2026Relance OWASP : page de ressources (1er septembre), site et 44 schémas JSON (5 septembre), gouvernance et implémentation de référence (10 septembre)
21 septembre 2026Tag v0.1.2, posé a posteriori sur un commit du 9 septembre 2026
Mars 2027 (objectif)Prochaine release de la spécification : v0.2.0

Sources : historique Git et documents du projet du dépôt ACS ainsi que page de ressources OWASP, état au 3 octobre 2026.

Statut : Incubator et public preview

ACS est un projet de l’OWASP GenAI Security Project, rattaché à l’Agentic Security Initiative. Dans ses propres métadonnées OWASP Nest, il déclare le niveau 2, soit le stade « Incubator » dans le schéma Nest ; un classement par une instance de l’OWASP n’est donc pas attesté. Le Project Lead qualifie publiquement l’état du projet de « public preview » et invite expressément les implémenteurs à la prudence. ACS n’est pas une norme ISO, IETF ou W3C, ni une norme harmonisée. Le stade précoce se voit aussi sur la forme : il n’existe aucune release GitHub, seulement des tags ; le texte de la spécification et les schémas ont changé entre v0.1.1 et v0.1.2 sans que la version de spécification v0.1.0 soit incrémentée.

Qui pilote le projet ?

Selon GOVERNANCE.md, Michael Bargury et Ory Segal ont créé ACS ; tous deux restent responsables du projet. Le Project Lead est Rock Lambros. Par souci de transparence : Bargury est CTO et cofondateur de Zenity, Lambros est présenté par Zenity comme « Director of AI Standards and Governance », et les premiers commits AOS proviennent majoritairement de l’écosystème Zenity. Les workstreams — Coding Agents, Development (SDK), Identity, Outreach et Spec — sont dirigés par des personnes issues de plusieurs organisations. La page du projet décrit ACS comme neutre vis-à-vis des fournisseurs et piloté collectivement ; il s’agit d’une autodescription. Notre lecture : un projet OWASP fortement marqué par Zenity dans sa création et sa direction.

Les décisions passent par un processus d’acceptation (acceptance gate). Seules les issues portant le label status:accepted entrent dans le backlog ; toute modification du comportement, du texte normatif ou du code nécessite une issue acceptée, les modifications de la spécification commencent par une GitHub Discussion, et les commits exigent un sign-off DCO. Le développement se fait sur la branche integration. Ce n’est que lorsque le Project Lead promeut les changements vers main que le site et les URI des schémas sont republiés. Au 3 octobre 2026, aucune promotion vers main n’a eu lieu depuis le 10 septembre 2026 — les modifications sur integration ne sont donc pas encore publiées.

Licence : ce que vous pouvez reprendre

ComposantLicenceConséquence pratique
Code, schémas JSON, exemples de code de la documentationApache-2.0Utilisation dans des produits propriétaires sans obligation de divulgation ; licence de brevet explicite
Documentation en prose (textes de la spécification, README)CC BY-SA 4.0Les traductions et adaptations sont soumises au ShareAlike et exigent une attribution
Releases jusqu’à v0.1.0 incluseMITLa licence accordée à l’époque reste valable
Noms et logos (OWASP, Agent Control Standard)aucun droit concédéUne implémentation peut se décrire comme « ACS-conformant », mais ne doit suggérer aucune approbation par le projet

Le passage aux licences Apache-2.0 et CC BY-SA 4.0 s’est fait avec la release v0.1.1 du 11 août 2026. VamiSec rédige de manière autonome tous les contenus de cette page et ne traduit aucun texte de la spécification.

Feuille de route : ce qui est attesté

La prochaine release de la spécification, v0.2.0, vise mars 2027 ; aucune date n’est fixée pour la v1.0. Sont notamment prévus pour la v0.2 : streaming et interruption, ASK récursif et quorum, isolation multi-tenant, le binding Cedar, la fédération de l’AgBOM via des pairs A2A et l’encapsulation A2A. L’objectif en cours depuis le kick-off du 10 septembre 2026 : en 90 jours, mettre entre les mains d’évaluateurs externes une implémentation de référence du Guardian opérationnelle, dont l’interopérabilité avec l’Agent Governance Toolkit de Microsoft a été mesurée par benchmark. Reste à savoir si cet objectif sera atteint d’ici début décembre 2026. La PR #21, qui vise à redéfinir le périmètre obligatoire d’ACS-Core, est elle aussi toujours ouverte. Les esquisses de versions divergentes publiées dans des billets de blog ne constituent pas une feuille de route officielle.

04Chapitre 4

Instrument : les 19 hooks du cycle de vie d’un agent

À chaque hook, l’Observed Agent s’arrête et soumet l’étape suivante au Guardian. ACS v0.1.0 définit 19 hooks natifs steps/* — ceux qui sont réellement contrôlés sont négociés par les deux parties pour chaque session.

Au niveau du protocole, les hooks portent le préfixe steps/, par exemple steps/toolCallRequest. Il existe en outre des méthodes qui ne sont pas des hooks natifs steps/* : agbom/snapshot et agbom/changed pour l’inventaire, la sonde de vivacité (liveness probe) system/ping, le handshake handshake/hello et l’espace de noms protocols/MCP/* pour les messages MCP encapsulés. La page Hooks de la spécification compte 19 hooks plus deux méthodes AgBOM plus le ping, soit 22 méthodes ; le paquet de schémas comprend au total 44 schémas JSON. Certains textes du projet (README, docs/acs.md) mentionnent encore 16 hooks de cycle de vie — c’est le décompte sans les trois hooks de skills.

GroupeHooks (steps/…)Quand ils se déclenchentDispositions selon la spécification
SessionsessionStart, agentTrigger, sessionEndAprès le handshake, avant toute autre étape ; activation par un utilisateur, une planification, un événement, A2A ou le système ; fin de session, au cours de laquelle le Guardian scelle la chaînesessionStart : allow/deny · agentTrigger : allow/deny/modify · sessionEnd : audit uniquement
TourturnStart, turnEndDébut et fin de chaque tour de l’agent ; le turn_id accompagne toutes les étapes intermédiairesturnStart : décision possible, le plus souvent allow · turnEnd : audit uniquement
MessagesuserMessage, agentResponseSaisie de l’utilisateur, avant qu’elle n’atteigne le contexte de raisonnement ; sortie de l’agent avant sa livraisonallow/deny/modify
Connaissances et mémoireknowledgeRetrieval, memoryContextRetrieval, memoryStoreRequêtes de connaissances et RAG, lecture de la mémoire dans le contexte, écriture dans la mémoire à long termeallow/deny/modify
OutilstoolCallRequest, toolCallResultAprès l’analyse d’un appel d’outil, avant sa transmission (dispatch) ; après l’exécution, avant que le résultat ne soit intégrétoolCallRequest : les cinq · toolCallResult : allow/deny/modify
CompactagepreCompact, postCompactAvant et après le compactage de la fenêtre de contextepreCompact : deny possible · postCompact : modify, pas de deny
Sous-agentssubagentStart, subagentStopLancement d’un sous-agent dans le même processus ; fin de celui-cisubagentStart : deny possible · subagentStop : audit uniquement
SkillsskillRegister, skillLoad, skillUnloadAjout à l’ensemble disponible, en tant que point de contrôle statique ; activation dans la session ; retraitskillRegister et skillLoad : allow/deny · skillUnload : audit uniquement

Les restrictions par hook figurent dans le texte de la spécification ; le schéma de réponse lui-même ne restreint pas le champ decision par méthode.

Le minimum Core : six hooks

ACS-Core exige au moins six hooks : sessionStart, userMessage ou agentTrigger, toolCallRequest, toolCallResult, agentResponse et sessionEnd. Un framework devrait implémenter tous les autres dès lors qu’il peut observer l’événement concerné ; ils sont négociés lors du handshake. Pour votre évaluation produit, cela signifie que l’affirmation « prend en charge ACS » ne dit pas encore si les écritures en mémoire, les sous-agents ou les skills parviennent tout simplement jusqu’au Guardian.

Le piège methods_evaluated

Lors du handshake, l’Observed Agent indique les méthodes qu’il implémente (methods_implemented). Le Guardian répond avec la liste des méthodes qu’il évalue réellement (methods_evaluated). Si l’agent envoie un hook absent de cette liste, il doit le traiter comme ALLOW-by-default — l’étape est au mieux journalisée, mais pas contrôlée. La seule implémentation de référence n’évalue par exemple que steps/toolCallRequest et steps/toolCallResult, soit deux hooks sur 19.

toolCallRequest : le point d’application central

steps/toolCallRequest est le seul hook pour lequel la spécification prévoit expressément les cinq dispositions ; c’est aussi là que s’appliquent les paradigmes de contrôle. Une règle MUST est centrale : les frameworks doivent déclencher toolCallRequest pour toute action qui quitte le contexte de raisonnement de l’agent — même si le framework ne la gère pas en interne comme un outil. Cela couvre les accès en lecture et en écriture au système de fichiers, les requêtes réseau, les lancements de processus et les commandes shell. Ce qui contourne ce hook échappe à toute politique.

Sont obligatoires dans le payload tool.name et arguments, chaque valeur d’argument pouvant porter sa propre provenance. En option s’ajoutent une capability abstraite comme filesystem.delete ou network.egress, le champ raw_command et un intent. Les politiques peuvent ainsi évaluer ce que produit une action, plutôt que le programme qui l’exécute.

Hooks à effet protecteur particulier

  • memoryStore est la destination standard (sink) de toute influence qui se propage d’une session à l’autre et, selon la spécification, le point d’appui contre l’empoisonnement de la mémoire (memory poisoning, cf. ASI06 : Memory & Context Poisoning).
  • preCompact et postCompact sécurisent le compactage : le résumé doit porter l’origin agent_generated et hériter de la provenance de toutes les entrées compactées, afin que des contenus non fiables ne soient pas blanchis.
  • subagentStart permet au Guardian de refuser le lancement d’un sous-agent ; chaque sous-agent reçoit son propre session_id et sa propre chaîne d’audit.
  • skillRegister et skillLoad lient les skills à un digest : seul peut être chargé ce qui a été approuvé auparavant avec un skill_id et un digest identiques ; les chargements impossibles à rattacher devraient être refusés.
05Chapitre 5

Les cinq dispositions en détail : allow, deny, modify, ask, defer

À chaque hook, le Guardian répond par exactement une disposition. Les détails — champs obligatoires, règles de composition, délais — déterminent si une politique reste sûre ou devient perméable en cas de défaillance.

Au niveau du protocole, les dispositions figurent en minuscules dans le champ decision ; le texte de la spécification les écrit en majuscules (ALLOW, DENY…). Dans la v0.1, chaque réponse est de type final — les états intermédiaires (progress) et les interruptions (interruption) ne sont prévus que pour la v0.2. Chaque réponse doit contenir type, acs_version, request_id et decision ; le request_id reprend celui de la requête.

DispositionEffet sur l’Observed AgentChamps obligatoires (schéma)Usage typique
allowL’action s’exécute telle que demandéeaucun ; reasoning recommandé si des pistes d’audit visibles par les utilisateurs sont attenduesAccès en lecture dans le périmètre autorisé
denyL’action est bloquéereasoningCommande shell destructrice, egress vers une destination inconnue
modifyL’action s’exécute avec un payload modifiéreasoning, modificationsLimiter une requête, caviarder des données personnelles dans le résultat d’un outil
askL’agent se met en pause jusqu’à l’approbationreasoning, ask_detailsPaiement, envoi en masse à des destinataires externes
deferLa décision est différéereasoning, defer_detailsScript inconnu, contexte manquant

En option dans chaque décision : reason_codes, policy_references (policy_id, policy_version, policy_name, rule_id), policy_data, cited_provenance_ids ainsi que metadata avec evaluator (deterministic, agent ou composite).

MODIFY : deux formes qui s’excluent mutuellement

L’objet modifications connaît deux formes. Soit modified_content remplace l’intégralité du payload — aucun autre edit n’est alors autorisé. Soit le Guardian envoie des edits structurés : redactions (chemin JSON Pointer plus texte de remplacement, par défaut « [REDACTED] ») et/ou parameter_overrides (nom d’argument plus nouvelle valeur). Les deux peuvent coexister, mais leurs cibles doivent être disjointes : aucun chemin de caviardage ne doit toucher le même champ qu’un override, ni un champ parent ou enfant de celui-ci. La spécification le justifie ainsi : un ordre d’application fixe résoudrait les conflits en silence et, selon l’ordre retenu, exposerait à nouveau des valeurs caviardées ou écraserait des valeurs assainies. Si un Guardian enfreint ces règles, l’Observed Agent doit traiter la réponse comme un deny.

Un exemple : un agent veut interroger intégralement une table clients. Le Guardian répond par modify avec une entrée dans parameter_overrides qui limite la requête à 500 lignes — comme dans le scénario du simulateur « Requête de base de données sans limite ». Les valeurs d’override figurent alors comme valeur brute dans l’objet, et non dans une enveloppe value.

ASK : une approbation aux règles claires

  • ask_details exige un approver avec type (human, agent ou service) et id, une question et timeout_seconds (au minimum 1).
  • À l’expiration du délai, timeout_disposition s’applique ; la valeur par défaut est deny.
  • Le Guardian doit vérifier l’identité de l’approbateur au regard de la politique — l’authentification de l’approbateur est obligatoire.
  • Un seul niveau : les approbateurs ne peuvent pas eux-mêmes renvoyer un ask. Le quorum et les approbations récursives sont reportés à la v0.2.
  • Si un client ne peut pas résoudre un ASK, le Guardian ne doit pas envoyer de ask. Il se rabat sur defer avec timeout_decision deny ou sur deny avec le reason code approver_unavailable — un allow silencieux est exclu.
  • Via intent_extension, une approbation peut étendre les capabilities autorisées pour this_request ou pour toute la session. Selon la spécification, c’est la seule manière conforme de modifier a posteriori l’intent défini.

Point important pour la réglementation : ASK n’équivaut pas automatiquement à un contrôle humain. L’approbateur peut être un agent ou un service, et timeout_disposition peut être réglé sur allow. Le contrôle humain prévu à l’article 14 du règlement européen sur l’IA (AI Act) est applicable aux systèmes à haut risque à partir du 2 décembre 2027 (annexe III) ou du 2 août 2028 (annexe I) ; les agents IA ne sont pas à haut risque par nature. Pour utiliser ASK comme brique à cet effet, il faut, selon l’appréciation de VamiSec, une politique avec approver.type human et timeout_disposition deny, ainsi qu’un processus d’approbation qui évite la fatigue décisionnelle. ASK contribue alors à la constitution des preuves, mais ne satisfait pas à lui seul à l’article 14 : la v0.1 ne connaît pas de bouton d’arrêt, seulement le deny étape par étape.

DEFER : différer la décision, mais dans certaines limites

defer_details exige un reason (insufficient_context, conflicting_policies, low_confidence ou pending_dependency), une resolution_method (additional_context, human_approval ou timeout) et resolution_timeout_ms. Pour l’expiration du délai, timeout_decision ne connaît que deny ou ask — jamais allow — et vaut deny par défaut. Le texte de la spécification exige ce champ, mais le schéma ne le déclare pas obligatoire ; renseignez-le donc toujours explicitement. Les reports (deferrals) en cascade doivent être limités par session. Attention aux unités : ASK compte en secondes (timeout_seconds), DEFER en millisecondes (resolution_timeout_ms).

06Chapitre 6

Handshake, failure posture et timeouts

Avant que le premier hook ne se déclenche, l’Observed Agent et le Guardian négocient ce qui est contrôlé, combien de temps on attend et ce qui se passe en cas de panne. Ces quelques champs déterminent si votre point de contrôle tient lorsque cela compte vraiment.

Chaque session commence par handshake/hello. Le ClientHello se trouve dans le payload d’une enveloppe de requête ordinaire, le ServerHello revient sous forme de result — sans decision. La version négociée doit correspondre à celle du client pour la version majeure ; les champs inconnus doivent être ignorés.

MessageChamps obligatoiresChamps optionnels pertinents pour la sécurité
ClientHello (Observed Agent)acs_versions_supported, methods_implemented, transports_supported (http, https, stdio), provenance_producer (deterministic ou none)profiles_supported, wrapped_protocols, max_payload_size_bytes
ServerHello (Guardian)negotiated_version, methods_evaluated, selected_transport, timeout_config (default_ms, per_method_ms en option)on_decision_failure (proceed ou deny, par défaut proceed), signature_algorithms_supported, skew_window_ms (par défaut 300000), policy_requires_provenance, approver_types_supported, profiles_accepted, trace_emission, agbom_serializations_supported

Refus lors du handshake : UNSUPPORTED_VERSION (-32001) en cas de conflit de version ; PROVENANCE_REQUIRED (-32002) lorsque le client ne fournit pas de provenance alors que la politique du Guardian l’exige.

Failure posture : fail-open par défaut

Pour chaque étape signalée, l’Observed Agent doit attendre la décision — jusqu’au timeout négocié — puis l’appliquer. Un framework qui envoie des hooks mais ignore le verdict n’est pas conforme. Si aucune décision exploitable n’arrive, la spécification parle de decision failure : le Guardian reste muet, le transport s’interrompt (connexion refusée, erreur TLS, réponse malformée) ou le Guardian renvoie une erreur au lieu d’une décision. Dans les trois cas, on_decision_failure s’applique, et sa valeur par défaut est proceed : l’action se poursuit sans contrôle. Le fail-closed (deny) doit être configuré explicitement par le déploiement.

La spécification nomme ouvertement le prix à payer : quiconque peut perturber le canal réduit le contrôle à une simple journalisation. En contrepartie s’applique une obligation stricte — chaque étape qui se poursuit sans décision doit être consignée comme événement d’audit. Si une décision arrive malgré tout dans le délai, l’agent doit la respecter, quelle que soit la posture.

Startup posture : quand le handshake lui-même échoue

Si le Guardian est injoignable au démarrage de la session ou répond sans ServerHello, c’est une startup posture configurée hors protocole qui s’applique : proceed (la session démarre sans protection) ou refuse. Là encore, proceed est la valeur par défaut, afin qu’une panne du Guardian ne bloque pas les nouvelles sessions. Une session démarrée sans protection doit figurer dans le journal d’audit propre au déploiement. Un refus explicite du Guardian, par exemple SESSION_REFUSED, constitue en revanche une décision et non une panne.

SituationMécanisme applicableValeur par défaut
Guardian injoignable au démarrage de la sessionStartup posture (configurée hors protocole)proceed — la session s’exécute sans protection, obligation d’audit
Silence du Guardian, erreur de transport ou réponse d’erreur en cours de sessionon_decision_failure issu du ServerHelloproceed — l’étape s’exécute sans contrôle, obligation d’audit
Expiration du délai ASKtimeout_dispositiondeny
Expiration du délai DEFERtimeout_decisiondeny
Objet modifications invalideRègle de composition de MODIFYTraitement comme deny
Échec de system/pingSignal au niveau du transport, pas un événement d’enforcementaucune disposition

Timeouts : aucune valeur par défaut dans la spécification

La spécification ne fixe aucun timeout standard chiffré. timeout_config.default_ms est obligatoire dans le ServerHello, mais sa valeur relève du déploiement ; per_method_ms autorise des valeurs différentes par méthode. Le schéma du handshake rappelle que chaque milliseconde de timeout représente, dans le pire des cas, autant de latence pour l’étape, et recommande d’aligner les délais par méthode sur la tolérance à la latence plutôt que sur une valeur forfaitaire généreuse. L’implémentation de référence utilise 5000 ms — une valeur d’implémentation, pas une exigence. Un modèle de timeout fondé sur la sensibilité est prévu pour la v0.2. Précision terminologique : ACS_ON_DECISION_FAILURE est une variable d’environnement du Guardian de référence qui fixe la valeur de on_decision_failure — pas un champ de la spécification.

Un ping ne prouve pas l’application des décisions

system/ping est une pure sonde de vivacité : le Guardian doit toujours répondre allow, le ping ne nécessite pas de signature et n’est pas inscrit dans la chaîne d’audit. Un Guardian peut donc répondre aux pings tout en refusant chaque hook signé. La spécification recommande par conséquent de surveiller directement les decision failures sur le chemin des hooks.

07Chapitre 7

Architecture du Guardian : déterministe d’abord, LLM en option

Un Guardian Agent n’est pas un second modèle de langage qui regarde par-dessus l’épaule du premier. ACS impose un ordre fixe : c’est d’abord du code de politique déterministe qui décide ; un LLM ne peut intervenir qu’en aval et sans visibilité sur la politique.

Deux couches, un ordre fixe

La couche déterministe évalue chaque hook en premier. Elle décide elle-même ou délègue à la couche agent — selon la spécification, sous le pilotage d’une configuration de chaîne avec les modes « * », on_ask ou basé sur des motifs. La v0.1 ne définit toutefois aucun format pour cette configuration. La couche agent reçoit les mêmes entrées plus le résultat intermédiaire de la couche déterministe, mais jamais le code de politique. Sa réponse doit repasser par la couche déterministe au retour.

  1. Arrivée du hook

    L’enveloppe de requête, le SessionContext, l’intent et, le cas échéant, la provenance sont transmis au moteur de politiques.

  2. Évaluation déterministe

    La Policy-as-Code — dans la v0.1 avec OPA/Rego comme référence de départ — renvoie allow, deny, modify, ask ou defer, ou délègue.

  3. Couche LLM optionnelle

    Évalue les cas qui ne peuvent pas être tranchés de manière déterministe ; traite les champs non fiables comme des données et ne voit aucun code de politique.

  4. Contre-vérification et réponse

    Le résultat repasse par la couche déterministe ; metadata.evaluator indique deterministic, agent ou composite.

  5. Journalisation

    Chaque décision est journalisée avec sa justification, l’identifiant du modèle et, si disponible, le niveau de confiance.

Moteur de politiques : une interface plutôt qu’un produit

ACS définit l’interface vers le moteur déterministe, pas le moteur lui-même. L’entrée se compose de l’enveloppe de requête, du SessionContext, de l’intent et de la provenance ; la sortie, d’une enveloppe de décision, éventuellement assortie d’une délégation à la couche agent (delegate_to). ACS fixe en outre des conventions, dont celle-ci : pas d’appels HTTP externes dans les politiques canoniques. Cela favorise le déterminisme et la maîtrise de la latence.

MoteurStatut dans ACSMise en perspective
OPA / RegoRéférence de départ pour la v0.1Projet CNCF au statut Graduated (depuis le 29 janvier 2021), Apache-2.0 ; l’implémentation de référence utilise l’OPA fourni avec l’Agent Governance Toolkit
CedarFast-follow pour la v0.2 (binding Cedar)Langage de politiques d’AWS, Apache-2.0, CNCF Sandbox (depuis le 8 octobre 2025) ; base de Policy dans Amazon Bedrock AgentCore
Moteur propreAdmis s’il respecte l’interfacePar exemple une logique métier spécifique ou des classificateurs derrière la même interface

Le README et la section 2 de la spécification citent Cedar et Rego d’un même souffle ; le statut par version est fixé par la section 12.1.

Obligations de la couche LLM

  • Les données non fiables sont des données, pas des instructions ; les champs concernés doivent être encapsulés ou mis entre guillemets dans le prompt.
  • Aucun accès au code de politique de la couche déterministe.
  • Journaliser chaque décision avec sa justification, l’identifiant du modèle et le niveau de confiance (si disponible) ; avec evaluator agent ou composite, model_id doit être renseigné.
  • Les délais suivent le timeout_config négocié lors du handshake.
  • L’ensemble de la couche est optionnel dans la v0.1.0 : des déploiements purement déterministes sont pleinement conformes.

Paradigmes de contrôle sans extension propre du protocole

La spécification cite quatre paradigmes comme objectifs pour la v0.1. Un Guardian les exprime via les mêmes champs — reason_codes, policy_references, policy_data et cited_provenance_ids. Si un déploiement combine plusieurs paradigmes, une seule décision peut tous les citer.

IBAC · autorisation fondée sur l’intention

L’intent d’une session est fixé avant que des données non fiables n’y entrent ; ensuite, il ne s’élargit que par une approbation auditée (intent_extension). Un écart peut aboutir à un defer ; policy_data indique alors la capability demandée et l’entrée la plus proche dans Intent.parsed. Fonctionne sans acs-provenance.

FIDES · contrôle des flux d’information

Approche de recherche avec des étiquettes de confidentialité et d’intégrité (arXiv 2505.23643, 2025). Un refus cite le lignage fautif dans cited_provenance_ids et le chemin d’argument concerné dans policy_data.

CaMeL · synthèse de programmes

Approche de recherche qui dérive le flux de contrôle et de données de la requête fiable (arXiv 2503.18813, 2025). Le Guardian vérifie si des arguments proviennent d’une source non fiable.

De type AARM · contexte cumulatif

Évalue l’historique de la session plutôt que l’étape isolée. Un refus cite la première étape non fiable et restitue la rétrospective pertinente dans policy_data.

Les règles FIDES, CaMeL et de type AARM nécessitent des informations de provenance et supposent donc le profil acs-provenance ; ce n’est pas le cas de l’IBAC pur. ACS n’implémente lui-même aucun de ces procédés : il fournit les champs par lesquels un Guardian les applique et les justifie. ACS n’empêche donc pas l’injection de prompt — il crée le point de contrôle où les politiques agissent contre ses conséquences.

Exploitation : latence et disponibilité (appréciation de VamiSec)

  • Latence : chaque contrôle se situe sur le chemin critique de l’agent. Gardez la couche déterministe locale et sans appels externes, réservez la couche LLM à quelques cas ambigus et mesurez evaluation_duration_ms par méthode.
  • Disponibilité : en fail-closed, le Guardian devient critique pour l’exploitation. Exploitez-le au plus près de l’agent et de manière redondante. L’implémentation de référence documente elle-même le risque : elle écrit ses journaux de façon synchrone sur le chemin de décision, si bien qu’un disque lent bloque toute décision en cours.
  • Cycle de vie des politiques : versionnez vos politiques et renvoyez policy_version dans chaque décision ; la spécification le prévoit pour reconstituer les états historiques des politiques.
  • Délimitation : le Guardian ne remplace ni la sandbox, ni l’IAM, ni la gestion des secrets, ni le pare-feu de sortie (egress). Les actions qui contournent toolCallRequest lui restent invisibles.

La seule implémentation de référence fait tourner l’Agent Governance Toolkit de Microsoft sans modification derrière l’interface ACS. Il s’agit explicitement d’une preuve de concept : deux hooks sur 19 actifs, pas de signature HMAC, fail-open par défaut. Elle démontre le schéma pour deux clients (Claude Code et OpenCode), mais n’est pas destinée à la production.

08Chapitre 8

Sécurité du canal : signatures, protection contre le rejeu et chaîne d’audit

Un Guardian Agent n’est digne de confiance que dans la mesure où le canal par lequel il décide l’est aussi. ACS-Core exige donc trois mécanismes : une signature sur chaque requête et chaque réponse, une protection contre les messages rejoués et une chaîne d’audit (audit chain) reliée par hachage. Ce chapitre montre ce que ces mécanismes apportent — et où se situent leurs limites.

Entre l’Observed Agent et le Guardian Agent transitent des décisions qui autorisent ou bloquent des actions. Quiconque peut manipuler ce canal transforme un deny en allow ou rejoue une ancienne autorisation. L’OWASP Agent Control Standard (ACS) traite donc la sécurité du canal comme un élément du socle obligatoire ACS-Core, et non comme un profil optionnel.

Signature de base : HMAC-SHA256 avec clé de session

ACS-Core exige sur chaque requête et chaque réponse une signature portant sur l’enveloppe canonique. Le mécanisme de base qui satisfait cette obligation est HMAC-SHA256. La clé est dérivée par session via HKDF — à partir du matériel cryptographique du déploiement (un secret pré-partagé ou une liaison de canal telle qu’un exporteur TLS) combiné au session_id. La v0.1 ne définit pas d’échange de clés dans le protocole. C’est la canonicalisation RFC 8785 (JCS) de l’enveloppe, sans le champ signature, qui est signée ; le destinataire recalcule cette forme et rejette toute signature non concordante. TLS seul ne suffit explicitement pas, car il ne lie aucun message individuel pour l’audit. Seule la méthode de liveness system/ping est exemptée de l’obligation de signature.

Deux détails comptent pour l’architecture. Dans le schéma JSON, le champ signature est optionnel, alors qu’il est obligatoire au niveau normatif dans ACS-Core — une simple validation de schéma ne détecte donc pas les signatures manquantes. Par ailleurs, la spécification ne fixe ni le sel, ni la chaîne info, ni la fonction de hachage, ni la longueur de clé pour HKDF ; deux implémentations peuvent donc dériver des clés différentes. Selon notre appréciation, ces paramètres ont leur place dans l’accord d’interface entre l’exploitation de la plateforme et celle du Guardian.

Protection contre le rejeu

Chaque requête porte un request_id (UUID), un timestamp et, en option, un nonce. Le Guardian doit rejeter les requêtes dont l’horodatage se situe hors de la fenêtre négociée skew_window_ms (valeur par défaut recommandée : 300 000 ms, soit cinq minutes) et refuser les valeurs request_id en double au sein d’une session ; il devrait rejeter les nonces en double. Il en découle une exigence d’exploitation souvent négligée : des horloges synchronisées des deux côtés.

CodeNomDéclencheurRéaction de l’Observed Agent selon la spécification
-32000SESSION_REFUSEDLa politique refuse la session, aucun code plus spécifique ne s’applique (p. ex. agent_id non admise)Pas de nouvelle tentative sans modification de la politique ou de la configuration
-32001UNSUPPORTED_VERSIONAucune acs_version commune lors du handshakeRépéter le handshake avec une version prise en charge
-32002PROVENANCE_REQUIREDLa politique exige la provenance, le client annonce provenance_producer: noneSe reconnecter en tant que producteur deterministic ou utiliser un Guardian sans exigence de provenance
-32003CAPABILITY_NOT_NEGOTIATEDMéthode ou profil utilisé sans avoir été négocié lors du handshakeRenégocier la méthode ou le profil
-32004SIGNATURE_INVALIDSignature obligatoire absente, erronée ou non vérifiableSigner à nouveau, le cas échéant résoudre à nouveau le key_id
-32005REPLAY_DETECTEDrequest_id ou nonce en double dans la sessionGénérer un nouveau request_id et un nouveau nonce
-32006TIMESTAMP_OUT_OF_WINDOWHorodatage hors de skew_window_msCorriger la dérive d’horloge
-32007CHAIN_MISMATCHLe chain_hash du client diffère de la tête de chaîne du GuardianRecharger l’état de la session ; un écart persistant constitue un événement d’intégrité

Notre synthèse du registre d’erreurs ACS (spécification v0.1.0, §17.1). system/ping ne doit renvoyer aucune erreur spécifique à ACS.

Chaîne d’audit : chaîne de hachage avec tête publiée

Le Guardian tient pour chaque session un SessionContext, une chaîne append-only de ContextEntries. Chaque entrée reçoit un entry_hash : SHA-256 sur l’entrée canonicalisée JCS sans les champs de hachage, chaîné avec le hachage de l’entrée précédente ; la première entrée a un previous_hash null. D’autres canonicalisations ne sont pas admises en v0.1. Le point décisif est la publication : pour chaque étape porteuse de contenu (content-bearing step), le Guardian doit joindre le chain_hash courant à sa réponse, couvert par la signature de la réponse. La spécification en donne ouvertement la raison : si le Guardian gardait la tête de chaîne privée, il pourrait par exemple supprimer un deny, recalculer la chaîne à partir de ce point et présenter plus tard un historique expurgé. Quiconque enregistre le trafic détecte une chaîne réécrite a posteriori.

Ce que la chaîne prouve — et ce qu’elle ne prouve pas

  • Les champs obligatoires d’une ContextEntry sont uniquement entry_id, step_id, step_type et entry_hash. Le request_hash portant sur le contenu de la requête n’est que recommandé (SHOULD) dans ACS-Core et ne devient obligatoire qu’avec le profil acs-audit. Sans lui, la chaîne prouve qu’une étape a eu lieu, mais pas ce qui a été demandé.
  • Le schéma ContextEntry ne prévoit aucun champ pour la disposition, la justification ou l’approbateur. ACS consigne normativement les décisions sous forme d’événements de trace (profil acs-trace, chapitre 9) ; seule une extension d’intent écrit sa propre entrée avec l’identité de l’approbateur (chapitre 11).
  • HMAC est symétrique : le Guardian détient la clé et pourrait signer à nouveau une tête de chaîne réécrite. Le canal est protégé contre la manipulation sur le réseau, pas contre un Guardian compromis.
  • La non-répudiation vis-à-vis de tiers n’apparaît qu’avec acs-crypto : au minimum ML-DSA-65 (MUST), SLH-DSA-128s (SHOULD), procédés hybrides optionnels.
  • La v0.1 ne prévoit aucun rapprochement entre plusieurs Guardians (issue #18, reportée).
09Chapitre 9

Trace : OpenTelemetry et OCSF dans le SOC

Avec le pilier Trace, les actions des agents et les décisions du Guardian arrivent dans la pile d’observabilité et SIEM existante. ACS n’invente pas de nouveau format pour cela, mais fournit un vocabulaire pour OpenTelemetry et OCSF. Pour le SOC, ce qui compte, c’est de savoir quelles classes arrivent, quelle est leur fiabilité et où le mapping présente encore des lacunes.

L’apport normatif de Trace est le vocabulaire : noms de spans, clés d’attributs, classes d’événements et correspondance entre dispositions et niveaux de sévérité. La transmission se fait via OTLP (gRPC ou HTTP) vers les backends existants ; l’espace de noms wire trace/* n’est que réservé en v0.1.0. L’objectif affiché est que les événements ACS s’intègrent aux pipelines SIEM sans parseur spécifique. Les extensions OTel et OCSF portent dans le dépôt le statut « Working draft ». Trace est le profil optionnel acs-trace. Quiconque le revendique doit, pour chaque étape prise en charge, émettre au moins l’un des deux formats avec ses attributs obligatoires, consigner chaque décision avec sa disposition, l’évaluateur et — le cas échéant — la justification, et reporter sur l’événement les faits de provenance issus du hook.

OpenTelemetry : des spans par hook, les décisions comme événements de span

La hiérarchie des spans est déterministe : un span racine acs.session par session, en dessous un acs.turn par tour et un span d’étape par hook. Les décisions ne sont pas des spans à part entière, mais un événement de span acs.decision rattaché au span d’étape ; le verdict et l’action contrôlée partagent ainsi le même contexte parent. Les attributs obligatoires de l’événement sont acs.decision et acs.evaluator (deterministic, agent ou composite). Pour les appels d’outils, ACS utilise les noms de spans gen_ai.tool.call et gen_ai.tool.result. Attention : dans les conventions GenAI d’OpenTelemetry (au statut « Development » en octobre 2026), gen_ai.tool.call n’est qu’un préfixe d’attribut ; le nom de span recommandé y est execute_tool {gen_ai.tool.name}. Les tableaux de bord et requêtes alignés sur ces conventions ne correspondent donc pas sans adaptation aux spans d’outils ACS.

Événement ACSClasse OCSF (UID)Remarque
sessionStart, sessionEnd, subagentStart, subagentStop3002 AuthenticationReprésentés comme Logon ou Logoff
userMessage, agentResponse, agentTrigger, turnStart, turnEnd6002 Application LifecycleACS nomme la classe « Application Activity » — dans OCSF, c’est le nom de la catégorie 6
toolCallRequest, toolCallResult1007 Process ActivitySource centrale pour les actions des agents
knowledgeRetrieval, memoryContextRetrieval, memoryStore, preCompact, postCompact6005 Datastore ActivityCompactage avec activity_id 99, « Other » générique dans OCSF
Décisions deny, modify, ask, defer2004 Detection Findingseverity_id : modify 2, ask et defer 3, deny 4 ; allow normalement purement informatif (1)
agbom/snapshot, agbom/changed5001 Device Inventory InfoACS nomme la classe « Inventory Info »

Classes selon le mapping ACS (OCSF 1.5+), noms de classes selon OCSF 1.5.0. Les agents apparaissent avec actor.user.type « AI Agent » ; les champs propres à ACS, comme reason_codes et les références de politiques, se trouvent dans unmapped.acs.

Cas d’usage SIEM pour les agents

Cas d’usageDonnées sourcesRéaction possible
Contournement du Guardian (fail-open)Événement d’audit obligatoire pour chaque étape sans décision ; démarrage de session non protégéAlerte dès le premier événement pour les agents à haut risque ; vérifier la disponibilité du Guardian
Accumulation de denyDetection Finding 2004 avec severity_id 4, reason_codes, policy_idRevue de session ; indice d’injection de prompt ou de mauvaise configuration
Charge d’approbationFindings ask (severity_id 3) par période, complétés par les informations sur l’approbateur issues de ask_detailsAjuster les seuils et la capacité des approbateurs, prévenir la lassitude d’approbation
Dérive d’inventaireagbom/changed avec reason user_action ou discovery (uniquement avec acs-inspect-dynamic)Rapprochement avec la liste des composants autorisés, le cas échéant durcir la politique
Événement d’intégritéCHAIN_MISMATCH ou reason_code chain_mismatchInvestiguer comme événement d’intégrité, ne pas l’écarter comme erreur transitoire
Agent ou humainactor.user.type « AI Agent »Baselines distinctes, corrélation avec les identités humaines

Déduction de VamiSec — ACS ne définit ni logique de détection ni playbook de réponse. Selon l’issue #37, il manque encore un format conforme pour l’événement d’audit fail-open ; construisez donc les règles à partir des mappings JSON et testez-les avec des données réelles.

Les limites à anticiper

  • Best effort : Trace ne doit jamais bloquer l’application des décisions. Si la destination (sink) tombe en panne, la décision parvient malgré tout à l’Observed Agent — la télémétrie peut donc être lacunaire.
  • Données autodéclarées : les événements Trace naissent dans l’environnement observé et ne deviennent des preuves qu’après attestation par une partie externe.
  • Lacune côté skills : les mappings couvrent 16 des 19 hooks natifs, plus les deux méthodes agbom. skillRegister, skillLoad et skillUnload n’ont ni mapping OTel ni mapping OCSF.
  • Dérive documentaire : l’emplacement de la provenance dans OCSF est contradictoire (enrichments dans le mapping normatif, unmapped.acs.provenance dans le guide). La page d’exemples avec des requêtes Splunk et Elastic utilise encore l’ancien nom ASOP et OCSF 1.0.
  • Protection des données : les spans peuvent contenir des prompts et des arguments d’outils. La spécification recommande un caviardage (redaction) dès l’émission ; selon notre appréciation, cela doit figurer de manière contraignante dans le concept de journalisation.
10Chapitre 10

Inspect : AgBOM — l’inventaire de l’agent à l’exécution

Les agents modifient leurs capacités à l’exécution : nouveau modèle, serveur MCP chargé à la volée, skill fraîchement enregistré. L’AgBOM (Agent Bill of Materials) rend cet état interrogeable par session et exploitable pour les décisions. Ce n’est pas un nouveau format SBOM — et elle n’en remplace aucun.

Selon la spécification, l’AgBOM est un inventaire dynamique et interrogeable des composants qu’utilise un Observed Agent. La justification est précise : toute politique qui dépend de ce qu’est un agent — quel modèle, quels outils — devient invérifiable sans inventaire. Si une politique du Guardian dépend de l’inventaire, par exemple pour bannir un modèle ou un outil, le déploiement doit implémenter le profil acs-inspect. L’AgBOM canonique est un graphe de composants, stocké sous forme de liste plate avec des références par ID, afin que les états successifs puissent être comparés par diff.

Huit types de composants

TypeCe qui est recensé (sélection des champs obligatoires)
modelNom, version, fournisseur, endpoint et fenêtre de contexte ; en option un instantané de la configuration
mcp_serverNom, version, endpoint et outils proposés
a2a_peerEndpoint et version du protocole
toolNom, version, fournisseur et capability abstraite, p. ex. filesystem.delete ou network.egress
knowledge_sourceNom et type de source (vector_db, search_index, knowledge_base, web_search, other)
memory_storeNom, portée (session, user, tenant, global) et type de stockage
agent_capabilityNom et description d’un groupe de capacités passives
skillNom, description ainsi que référence et empreinte d’intégrité (digest) de l’artefact chargeable

La source normative est le schéma component.json. Certaines pages de documentation citent six ou sept types ; ce sont bien huit qui font foi.

snapshot et changed : deux méthodes wire

L’Observed Agent envoie agbom/snapshot une fois par session, après sessionStart et avant le premier hook porteur de contenu ; le message contient l’AgBOM complète. agbom/changed signale les mutations — composants ajoutés, supprimés ou modifiés, sous forme de diff ou d’instantané complet — et peut indiquer une cause, par exemple component_upgraded, discovery ou user_action. Les deux événements entrent dans la chaîne d’audit. Le Guardian peut, par un deny, refuser une session comportant un composant banni ou bloquer un remplacement à chaud (hot swap).

Important pour le choix des profils : qui ne revendique qu’acs-inspect fournit exactement un snapshot par session et ne suit pas les modifications. Les changements à l’exécution ne deviennent visibles qu’avec acs-inspect-dynamic. Les déclencheurs de snapshot renegotiation et policy_request renvoient à des mécanismes qui ne doivent être spécifiés qu’avec la v0.2 — en v0.1, seul session_start est en pratique fiable. Chaque composant devrait en outre porter une registration_provenance (obligatoire sous acs-provenance). On peut ainsi distinguer si un composant provient de la configuration ou s’il a été ajouté à l’exécution.

Sérialisations : CycloneDX, SPDX, SWID

Sur le wire circule toujours la forme canonique ; le Guardian produit les sérialisations à la demande pour les outils en aval. Un déploiement acs-inspect doit en proposer au moins une : CycloneDX 1.6, SPDX 3.0 ou SWID (ISO/IEC 19770-2). Les trois mappings ont le statut « Working draft » ; les correspondances vers CycloneDX et SPDX ne sont en partie pas valides au regard des schémas. Le mapping CycloneDX utilise comme type de composant des noms tels que ai-model ou service, que CycloneDX 1.6 ne connaît pas sous cette forme ; le mapping SPDX emploie des classes et des relations qui n’existent pas dans SPDX 3.0.1. Prévoyez donc vos exports avec une validation propre. CycloneDX lui-même est disponible en version 1.7 depuis octobre 2025.

Délimitation : AgBOM, AI-SBOM, SBOM CRA

AgBOM (ACS)

Liée à l’exécution et établie par session, ancrée dans la chaîne d’audit et exploitable pour les décisions. Elle inventorie ce que l’Observed Agent, selon ses propres déclarations, utilise dans cette session ; sous acs-provenance, également l’origine de chaque enregistrement.

AI-SBOM / ML-BOM

Décrit les modèles et les jeux de données, par exemple avec la ML-BOM de CycloneDX ou le profil AI de SPDX 3.0. Le terme AI-BOM n’apparaît pas dans ACS ; cette mise en regard est notre propre classification.

SBOM CRA

Obligatoire à partir du 11 décembre 2027 pour les fabricants de produits comportant des éléments numériques (annexe I, partie II, point 1, du CRA) : lisible par machine, couvrant au minimum les dépendances de premier niveau. L’AgBOM peut compléter cette SBOM de build par des composants d’exécution, mais ne la remplace pas.

11Chapitre 11

Provenance et identité : origine des données, limites de l’identité

L’admissibilité d’une action dépend souvent de l’origine des données qui la déclenchent. La provenance fournit au Guardian ces faits d’origine au niveau de chaque champ, et le Session Intent fixe la finalité. La partie Identity d’ACS, en revanche, décrit jusqu’ici surtout des questions ouvertes.

Provenance par champ : des faits plutôt que des étiquettes de confiance

La provenance indique d’où vient un élément de données et comment il est arrivé à sa place. Un objet de provenance porte un provenance_id, un origin avec l’une des sept valeurs — user_input, system, tool_output, retrieved, agent_generated, a2a_inbound, external — ainsi qu’en option source_id (p. ex. nom d’outil, URL ou chemin) et derived_from comme liste des antécédents. Ces informations sont attachées aux champs porteurs de données, et même à chaque argument individuel pour toolCallRequest. Une politique peut ainsi cibler un flux de données précis plutôt que l’appel entier.

  • Fixée par le framework : origin, source_id et derived_from sont attribués par du code déterministe en dehors du chemin de sortie du LLM. Demander au LLM de produire la provenance n’est pas conforme.
  • Lignage transitif : les données dérivées héritent de l’origine de leurs entrées, y compris à travers la synthèse et le compactage. Un résumé de sorties d’outils tierces reste ainsi identifiable comme tel.
  • Pas de champ trust : une valeur trust n’est que réservée en v0.1, sans schéma. Le Guardian déduit la confiance d’origin et de source_id au regard de sa politique ; un traitement par le LLM ne rend jamais fiable un contenu non fiable (règle de monotonie).
  • Tout ou rien : avec provenance_producer: deterministic, chaque champ porteur de données doit porter une provenance ; un remplissage partiel n’est pas conforme. Si le client annonce provenance_producer: none alors que la politique exige la provenance, le Guardian refuse la session dès le handshake avec PROVENANCE_REQUIRED.

La provenance ne relève pas d’ACS-Core, mais du profil acs-provenance. Elle est un prérequis pour des paradigmes d’application tels que FIDES, CaMeL et AARM, mais pas pour une simple autorisation fondée sur l’intention (IBAC). ACS n’empêche pas l’injection de prompt. Il crée le point de contrôle où une politique peut en limiter les conséquences — par exemple en bloquant un e-mail dont le destinataire et le contenu proviennent d’un résultat de récupération (retrieval) non fiable. Les étiquettes de sensibilité ou IFC ne font pas partie du standard ; elles relèvent du Guardian ou du déploiement.

Session Intent : la finalité verrouillée

Dans ACS, l’intent n’est pas un format wire, mais un concept de gouvernance : il lie les actions à une finalité autorisée, et ce avant que des données non fiables ne puissent exercer une influence. Intent.parsed, l’ensemble des capabilities autorisées pour la session, est fixé lors de sessionStart ou du premier agentTrigger. Ensuite, ni le LLM, ni les sorties d’outils, ni les données issues de canaux non fiables ne peuvent le modifier ; si l’intent est défini dès sessionStart, un agentTrigger ultérieur portant un intent divergent doit être rejeté.

La seule voie conforme pour l’étendre est une intent_extension qu’un approbateur renvoie via le flux ask — avec des indications obligatoires sur les capabilities et la portée (scope). Avec scope this_request, l’extension ne vaut que pour la requête en cours. Avec scope session, le Guardian ajoute les capabilities, écrit une ContextEntry de type intent_extension avec l’identité de l’approbateur et gère la provenance de l’extension séparément de celle de l’intent initial. En scope_mode strict, il ne doit honorer aucune extension que la politique interdit en mode strict. Pour les RSSI, c’est, selon notre appréciation, le levier contre l’extension rampante des droits : toute extension requiert une approbation authentifiée.

Identity : un socle normatif mince, beaucoup de chantiers

Ce qui s’applique normativement

ACS n’impose aucun mécanisme d’authentification ; celui qui est utilisé est déclaré lors du handshake, et les schémas de confiance comme SPIFFE, OIDC ou PKI restent définis par le déploiement. Sont obligatoires l’authentification des approbateurs et la séparation de trois identités : Observed Agent, Guardian et auteur de la politique.

Ce qui n’est pas encore contraignant

Les documents de travail du workstream Identity citent cinq défis à l’exécution ; quatre sont « Pending », un « Partially specified ». Des formulations comme « Required by ACS » pour DPoP ou RAR ne sont pas contraignantes — le projet précise lui-même qu’ACS n’impose aucun mécanisme. Le modèle d’identifiants et les durées de vie des jetons ne sont que proposés.

Délimitation par rapport à AIMS

Le projet IETF AIMS (draft-klrc-aiagent-auth) traite de l’émission d’identités, de la liaison des identifiants (credential binding) et de l’authentification du transport. ACS se veut complémentaire : application à l’exécution plutôt qu’émission d’identités.

La signature d’ACS-Core authentifie de manière symétrique le canal entre l’Observed Agent et le Guardian. Elle n’est ni une authentification du principal ni une non-répudiation — ne confondez pas ces notions dans votre architecture et vos preuves.

12Chapitre 12

MCP, A2A et skills : protocoles et capacités chargeables

Les agents communiquent avec les outils via MCP, avec d’autres agents via A2A, et chargent des skills comme briques exécutables. ACS v0.1 couvre ces trois surfaces à des degrés divers : le wrapping MCP est spécifié, A2A seulement réservé, et le cycle de vie des skills dispose de ses propres hooks.

Wrapping MCP : spécifié, avec une question d’obligation ouverte

L’espace de noms protocols/MCP/* est la voie canonique pour transporter les messages MCP jusqu’au Guardian, par exemple protocols/MCP/tools/call. Le message MCP reste inchangé ; ACS y superpose l’enveloppe, le contrat de décision et les règles de la chaîne d’audit. Le déroulement se fait en deux temps : l’agent soumet la requête encapsulée au Guardian, applique sa décision, transmet le message au serveur MCP après un allow, conformément à la description du flux, et fait également contrôler la réponse de ce dernier avant de la traiter.

Un déploiement peut regrouper les appels d’outils MCP (tools/call) dans les hooks génériques steps/toolCallRequest et steps/toolCallResult lorsque des politiques au niveau des outils suffisent. Le wrapping devrait être utilisé lorsque la politique a besoin de distinctions propres à MCP : négociation des capacités lors d’initialize, modèles de prompts côté serveur (prompts/get), accès aux ressources (resources/read) et notifications (notifications/*). Indépendamment de cela, les frameworks doivent déclencher toolCallRequest pour toute action qui quitte le contexte de raisonnement — y compris pour les opérations intégrées sur fichiers, réseau ou shell.

MCP 2026-07-28 : le texte de la spécification est en retard

Depuis le 28 juillet 2026, la révision MCP 2026-07-28 est la version actuelle (état : octobre 2026). Elle rend le cœur du protocole sans état, supprime le handshake initialize et déclare notamment obsolètes le sampling et les roots. L’espace de noms ACS protocols/MCP/* est neutre vis-à-vis des versions ; la révision 2025-06-18 n’apparaît dans la spécification qu’à titre d’exemple. La prose suppose cependant encore l’ancienne sémantique et cite explicitement la négociation initialize comme point à contrôler. La spécification ne dit pas si cela affecte les wrappers en pratique ; nous ne disposons d’aucune analyse solide. Selon notre appréciation, les architectures fortement axées sur MCP devraient prévoir les hooks d’outils génériques comme point de contrôle principal.

A2A : réservé pour la v0.2

L’espace de noms protocols/A2A/* n’est que réservé en v0.1 ; une sémantique normative de wrapping est prévue pour la v0.2 (échéance visée pour la v0.2.0 : mars 2027). Les pages A2A du dépôt datent de l’époque AOS de 2025 et ne sont pas compatibles avec les schémas. Les relations A2A ne sont aujourd’hui visibles qu’indirectement : via agentTrigger avec trigger_type a2a_inbound et via les composants a2a_peer de l’AgBOM. Les sous-agents in-process, en revanche, sont couverts par ACS avec subagentStart et subagentStop ; chaque sous-agent reçoit sa propre session avec sa propre chaîne d’audit, que le parent référence via le final_chain_hash, sans fusionner les chaînes.

Cycle de vie des skills : register, load, unload

HookObjectifOptions du Guardian
steps/skillRegisterPoint de contrôle statique : le Guardian voit la définition complète du skill avant qu’une de ses actions ne s’exécute. L’approbation vaut pour le couple (skill_id, digest).allow ou deny ; un skill refusé ne doit pas devenir chargeable. Il devrait vérifier les capabilities déclarées par rapport aux outils composés et peut refuser des déclarations trop larges.
steps/skillLoadPoint de contrôle à l’exécution pour chaque activation ; le load_path rend les cascades visibles (le skill A charge B, B charge C).allow ou deny ; il devrait refuser les chargements sans approbation attribuable, avec un digest divergent ou en dehors des composed_skills déclarés.
steps/skillUnloadMaintient l’inventaire actif à jour ; peut alternativement être intégré à agbom/changed.Audit uniquement ; selon la spécification, des chargements et déchargements répétés constituent un signal à surveiller.

Notre synthèse des descriptions de hooks d’ACS v0.1.0.

Le digest couvre l’artefact chargeable complet, y compris les poids de modèle ou adaptateurs embarqués ; seuls la référence et le digest sont persistés dans l’AgBOM, pas le contenu. Le Guardian ne devrait pas se fier à un digest_verified signalé par le framework, mais effectuer lui-même la comparaison avec son approbation. La proposition de conception (design proposal) relative au cycle de vie des skills, publiée dans le dépôt, nomme ouvertement la limite : le digest lie l’artefact enregistré, pas le code qu’un skill charge ultérieurement — un tel chargement passe par les hooks d’outils ordinaires en tant que network.egress ou process.execute. L’analyse des marketplaces avant publication ne fait pas partie d’ACS, et un mapping Trace fait encore défaut pour les trois hooks de skills (chapitre 9).

13Chapitre 13

Conformité et maturité : ce que la v0.1 apporte — et ce qu’elle n’apporte pas

ACS est un jeune projet OWASP, à un stade précoce. Pour les décisions d’architecture et d’achat, c’est donc l’état vérifiable qui compte : spécification v0.1.0, release 0.1.2, une implémentation de référence au stade de preuve de concept et une conformité fondée sur l’autodéclaration.

0.1.0Version de la spécification ; release 0.1.2, tag du 21 septembre 2026
2 sur 19Hooks évalués en direct par l’implémentation de référence
7Profils de conformité ; chaque revendication est une autodéclaration
03/2027Échéance visée pour la v0.2.0 ; aucune date pour la v1.0

ACS est un projet de l’OWASP GenAI Security Project et, selon les propres métadonnées OWASP Nest du projet, classé au niveau 2 (Incubator) ; le Project Lead qualifie l’état actuel de « public preview ». ACS n’est ni une norme ISO, ni un standard IETF ou W3C, ni une norme harmonisée.

Ce que la v0.1 apporte déjà

Malgré ce stade précoce, la v0.1 apporte de la substance : un vocabulaire commun de 19 hooks et cinq dispositions, 44 schémas JSON publiés, une failure posture clairement décrite avec obligation d’audit pour chaque contournement, et une spécification qui nomme ouvertement ses propres lacunes. Selon notre appréciation, cela suffit pour évaluer les fournisseurs à l’aune d’un référentiel ouvert et commun et pour concevoir vos propres points de contrôle de façon qu’ils restent compatibles avec les versions ultérieures — mais pas pour vous fier à des étiquettes de conformité.

La conformité est une autodéclaration

Lors du handshake, l’Observed Agent déclare les profils qu’il prend en charge (profiles_supported) et le Guardian ceux qu’il accepte (profiles_accepted). Il existe exactement sept profils : acs-core, obligatoire, ainsi qu’acs-trace, acs-inspect, acs-inspect-dynamic, acs-provenance, acs-crypto et acs-audit. Il n’existe ni paliers ni niveaux. Qui vérifie les revendications de conformité ? La spécification y répond elle-même : en v0.1.0, personne. Il n’y a ni suite de tests, ni registre des implémentations conformes, ni instance chargée de trancher les revendications litigieuses (issue #19, ouverte, priorité P1). ACS-Core ne garantit en outre que deux choses — un canal authentifié et le fait que l’Observed Agent respecte les décisions du Guardian. Il ne garantit pas des politiques strictes : même un Guardian permissif est conforme.

Implémentation de référence : l’état réel, en toute franchise

La seule implémentation de référence est explicitement une preuve de concept. Elle exploite l’Agent Governance Toolkit (AGT) de Microsoft, sans modification, comme moteur de politiques derrière le wire ACS, avec des intégrations hôtes pour Claude Code et OpenCode. Elle ne revendique acs-core que de manière restreinte (« qualified ») et aucun des six profils optionnels. Il n’existe pas de benchmark d’interopérabilité avec AGT ; c’est l’objectif de la fenêtre de 90 jours ouverte depuis le kick-off du 10 septembre 2026. On ne peut pas en déduire un soutien de Microsoft à ACS. Attention à l’homonymie : dans la documentation d’AGT, « ACS » désigne la propre « Agent Control Specification » de Microsoft (2 juin 2026), le langage de politiques d’AGT — et non le standard OWASP.

Exigence ACS-CoreÉtat de l’implémentation de référence
Handshake handshake/helloPris en charge, mais le ServerHello se compose de constantes ; le ClientHello n’est pas lu
Au moins six hooks2 sur 19 évalués : steps/toolCallRequest et steps/toolCallResult
Les cinq dispositionsallow, deny et modify présents ; ask sans ask_details (invalide au regard du schéma) ; defer n’est jamais généré
chain_hash dans les réponsesLa chaîne est tenue, mais n’est publiée dans aucune réponse
Signature de base HMAC-SHA256Non implémentée ; wire non authentifié, protection uniquement par liaison à l’interface loopback (issue #70)
Protection contre le rejeuNon implémentée
Decision Honoring, on_decision_failureMis en œuvre sur les deux hôtes ; par défaut proceed (fail-open), chaque contournement est audité (issues #32, #37)
system/ping, protocols/MCP/*Non implémentés

Source : déclarations de l’implémentation de référence elle-même (reference-implementations/agt/README.md), état de la branche main au 10 septembre 2026. L’implémentation de référence n’a été ajoutée au dépôt qu’après le commit de release taggé 0.1.2.

Lacunes ouvertes de la spécification ayant une portée pratique

  • Fail-open par défaut : on_decision_failure et la startup posture sont réglés sur proceed ; vous devez configurer délibérément le fail-closed (deny ou refuse).
  • Pas de mécanisme d’arrêt : la v0.1 ne connaît pas de kill switch ; l’interruption et le streaming sont prévus pour la v0.2. En v0.1, on n’arrête un agent qu’étape par étape, par deny.
  • Périmètre obligatoire en mouvement : une proposition ouverte (PR #21) ferait passer modify et system/ping au niveau SHOULD.
  • Lacunes d’interopérabilité (analyse propre) : les paramètres HKDF, la signature du handshake et l’entrée du request_hash sont sous-spécifiés.
  • Dérive documentaire : certaines pages citent encore 16 hooks au lieu de 19, ou seulement trois dispositions. Seuls la spécification et les schémas font foi sur le plan normatif.
14Chapitre 14

Mise en œuvre pratique et lien avec la réglementation

ACS n’est pas un outil de conformité. Il fournit toutefois des briques techniques qui vous aident à constituer les preuves exigées par les obligations du règlement européen sur l’IA (AI Act), de NIS2, de DORA et du CRA, ainsi que par les exigences d’ISO/IEC 42001. Ce chapitre fait correspondre les briques aux exigences et esquisse une démarche de démarrage en cinq étapes.

Trois remarques préalables. Premièrement, ACS ne crée aucune présomption de conformité ; le texte de la spécification ne contient aucune correspondance avec l’AI Act, NIS2, DORA, le CRA ou ISO/IEC 42001 — toutes les correspondances ci-dessous sont des déductions de VamiSec. Deuxièmement, les agents IA ne sont pas en soi des systèmes à haut risque. Les obligations relatives au haut risque prévues au chapitre III, sections 1 à 3, du règlement (UE) 2024/1689 s’appliquent, selon le Digital Omnibus (règlement (UE) 2026/1744), à partir du 2 décembre 2027 pour l’annexe III et à partir du 2 août 2028 pour l’annexe I ; l’article 50 s’applique depuis le 2 août 2026. Troisièmement, toute argumentation dépend des profils : ACS-Core seul ne comprend ni Trace, ni AgBOM, ni request_hash.

ExigenceBrique ACS (profil)Artefact de preuveRéserve
AI Act, art. 12 : enregistrement automatiqueTrace par étape et événements de décision, chaîne d’audit (acs-trace, acs-audit)Données SIEM, chaîne de hachage vérifiableTrace repose sur des données autodéclarées ; ACS-Core sans Trace
AI Act, art. 14, par. 4, point d) : passer outreask sur toolCallRequest avec approbateur humain et timeout_disposition deny (acs-trace)Événements de décision avec ask_details, entrées intent_extensionSelon la spécification, l’approbateur peut aussi être un agent ou un service — à exclure par la politique
AI Act, art. 14, par. 4, point e) : interrompredeny sur sessionStart, turnStart, toolCallRequest ; on_decision_failure deny, startup posture refusePreuve de configuration fail-closed, procès-verbal d’un exercice d’arrêtPas de kill switch en v0.1 ; fail-open par défaut
AI Act, art. 26 : contrôle humain, surveillance, journaux ≥ 6 moisApprobateurs authentifiés, Guardian comme moniteur d’exécution, export TraceMatrice des rôles d’approbateurs, rapport de surveillance, politique de conservationACS ne régit pas la conservation ; la compétence reste une question organisationnelle
AI Act, art. 72 : surveillance après commercialisationIndicateurs Trace, AgBOM (mcp_server, a2a_peer), hooks de sous-agentsSection PMM « Données d’exécution des agents »Modèle de la Commission attendu seulement d’ici le 2 septembre 2027
NIS2, art. 21, par. 2 / § 30 BSIGPolicy-as-Code (v0.1 : OPA/Rego ; binding Cedar prévu pour la v0.2), politiques fondées sur les capabilities, AgBOM avec digest des skillsCode de politique approuvé, registre des composants et des fournisseurs par agentAnalyse des marketplaces hors du périmètre d’ACS
DORA, art. 8 à 10, RTS (UE) 2024/1774, art. 12AgBOM comme inventaire, Trace au format OCSF, tête de chaîne signée, événements d’audit fail-open, timestamp et skew_window_msRegistre des actifs TIC étendu, concept de journalisation, preuve de synchronisation horaireHMAC ne protège pas contre un Guardian compromis
CRA, annexe I : journalisation, SBOMTrace comme fonction du produit, export AgBOM (CycloneDX 1.6, SPDX 3.0)SBOM de build plus export AgBOM, documentation produitUniquement pour les produits d’agents ; l’annexe I s’applique à partir du 11 décembre 2027 ; l’AgBOM ne remplace pas une SBOM
ISO/IEC 42001 A.6.2.6, A.6.2.8, A.7.5, A.10.3Trace et chaîne d’audit, acs-provenance, AgBOMConcept de journal d’événements, preuves de provenance, liste des fournisseursPas de présomption de conformité à l’AI Act via 42001
NIST AI RMF MANAGE 2.4, MEASURE 2.4, GOVERN 1.6deny et ask, Trace, AgBOMCritères de désactivation, plan de surveillance, inventaireCadre volontaire

Déduction de VamiSec fondée sur ACS v0.1.0 ; ni l’OWASP ni les autorités n’ont établi cette correspondance. Les banques et les assureurs devraient argumenter principalement via DORA, car l’obligation de surveillance prévue à l’article 26, paragraphe 5, de l’AI Act est réputée remplie par le biais de la gouvernance financière. Pour les entités financières soumises au cadre simplifié de gestion du risque lié aux TIC (art. 16 DORA), c’est le titre III des RTS qui s’applique au lieu de l’article 12.

Démarrer en cinq étapes

  1. InventaireRecenser et classifier les agents

    Recensez les agents, modèles, outils, serveurs MCP et skills, et clarifiez pour chaque usage la classification au titre de l’AI Act. Résultat : un registre des agents avec classe de risque, responsables et accès aux données.

  2. ArchitectureDéfinir les points de contrôle et les profils

    Vérifiez quels hooks votre plateforme déclenche réellement et lesquels le Guardian confirme dans le handshake sous methods_evaluated : tout le reste est traité en allow-by-default et n’est pas protégé. Choisissez les profils selon vos besoins de preuve, par exemple acs-core plus acs-trace et acs-audit pour les obligations de journalisation.

  3. PolitiquesFormuler les politiques sous forme de code

    La couche déterministe s’exécute en premier (référence v0.1 : OPA/Rego). Formulez des règles pour les commandes destructrices, l’egress et les paiements, exigez pour les actions lourdes de conséquences un ask avec approbateur humain et timeout_disposition deny, et référencez les versions de politiques dans policy_references.

  4. ExploitationDécider et tester la failure posture

    Pour les agents à fort potentiel de dommages, définissez on_decision_failure sur deny et la startup posture sur refuse. Testez une panne du Guardian, le rejeu et les erreurs de signature, et surveillez directement les échecs de décision (decision failures), car un ping réussi ne prouve pas que l’application des décisions fonctionne correctement.

  5. PreuvesRaccorder Trace et constituer les preuves

    Exportez OCSF ou OpenTelemetry vers le SIEM, mettez en œuvre les cas d’usage du chapitre 9 et fixez des durées de conservation. Sécurisez la tête de chaîne à l’extérieur et vérifiez les déclarations de conformité des fournisseurs par vos propres tests.

Un approfondissement avec un programme de 100 jours, un modèle de rôles, des indicateurs et des questions d’évaluation à poser aux plateformes d’agents vous attend dans le livre blanc « Agent Control für CISOs » destiné aux RSSI (en allemand), que vous pouvez demander plus bas sur cette page. VamiSec accompagne l’évaluation, l’architecture, la conception des politiques et les tests en tant que cabinet de conseil indépendant ; VamiSec ne fait pas partie du projet ACS.

Autoévaluation

Évaluation de maturité ACS : où en est le contrôle à l’exécution de vos agents IA ?

18 questions réparties en six dimensions, environ 10 minutes. Vous obtenez votre niveau de maturité, votre état de préparation par composant ACS et vos principales lacunes, chacune assortie d’une prochaine étape concrète.

0 / 18 questions traitées

Les quatre niveaux
Inexistant
Il n’existe ni règle ni mise en œuvre technique à ce sujet.
Ad hoc
Certaines équipes le traitent individuellement, sans exigence ni preuve.
Défini
Encadré par des règles contraignantes et mis en œuvre pour les principaux agents.
Appliqué et mesuré
Imposé techniquement pour tous les agents concernés et vérifié à l’aide d’indicateurs.
01 / 06Inventaire et AgBOM

Savez-vous quels agents fonctionnent avec quels modèles, outils, serveurs MCP et skills — y compris lorsque cela change à l’exécution ?

  1. 01ACS Inspect · Observed Agent

    Tenez-vous un registre complet de tous les agents IA utilisés en production, avec une entité responsable pour chacun ?

    Y compris les fonctions d’agent intégrées aux produits SaaS achetés et les agents développés en interne par les métiers.

  2. 02ACS Inspect · AgBOM (agbom/snapshot)

    Connaissez-vous, pour chaque agent, les modèles, outils, serveurs MCP, sources de connaissances, mémoires et skills utilisés ?

    L’AgBOM distingue huit types de composants : model, mcp_server, a2a_peer, tool, knowledge_source, memory_store, agent_capability et skill.

  3. 03ACS Inspect · acs-inspect-dynamic (agbom/changed)

    Détectez-vous les modifications de composants à l’exécution — par exemple un serveur MCP nouvellement connecté ou un changement de modèle ?

    Un instantané unique ne suffit pas lorsque les agents chargent de nouvelles capacités en cours de session.

Livre blanc gratuit

« Agent Control für CISOs » — le contrôle à l’exécution avec l’OWASP Agent Control Standard

Le guide pratique d’ACS v0.1.0 (livre blanc en allemand) : ce que le standard régit, comment introduire Guardian, politiques, Trace et AgBOM, comment les transposer à l’AI Act, à NIS2 et à DORA — et ce que la v0.1 ne permet pas encore aujourd’hui.

Couverture du livre blanc VamiSec « Agent Control für CISOs » (en allemand)
41 pagesPDF, gratuitAllemandMise à jour : 10/2026
  • Dix messages clés et une note d’une page pour le comité de direction — avec cinq décisions pour la direction générale
  • Architecture de référence pour le Guardian et la Policy-as-Code, y compris un concept de failure posture et l’intégration au SOC
  • Correspondance réglementaire de l’AI Act à l’ISO/IEC 42001 avec artefacts de preuve — et des limites clairement signalées
  • Programme de 100 jours, modèle de maturité et 20 questions d’achat à poser aux plateformes d’agents et aux fournisseurs de Guardian
Téléchargement gratuit

Demander un livre blanc

Agent Control pour les RSSI — OWASP Agent Control Standard (ACS) v0.1

Le livre blanc pour RSSI : « Agent Control für CISOs » (en allemand)

Partie I · Comprendre

Synthèse managériale en dix messages clés et note d’une page pour le comité de direction, le problème de contrôle de l’IA agentique illustré par des incidents documentés, et ACS en un coup d’œil : rôles, piliers, profils, historique et gouvernance.

Partie II · Mettre en œuvre

Hooks et dispositions avec exemples wire, architecture du Guardian et Policy-as-Code, failure posture, Trace vers le SOC, l’AgBOM comme inventaire d’exécution ainsi qu’identité et provenance contre les conséquences de l’injection de prompt.

Partie III · Piloter

OWASP Agentic Top 10 × ACS sous forme de heatmap, correspondance réglementaire avec l’AI Act, NIS2, DORA, le CRA, l’ISO/IEC 42001 et le NIST AI RMF avec artefacts de preuve — et une évaluation honnête de ce que la v0.1 apporte et n’apporte pas.

Programme & achats

Modèle de maturité avec operating model, programme de déploiement sur 100 jours avec livrables et KPI, 20 questions d’achat à poser aux plateformes d’agents et aux fournisseurs de Guardian, ainsi que des réponses aux objections typiques du comité de direction.

Nouveau · ICSPIS 2026 (IEEE)

Tester plutôt que faire confiance : les preuves qui rendent les contrôles ACS vérifiables

Un Guardian décide — mais votre télémétrie prouve-t-elle aussi que l’exécution correspondait à la décision ? Notre article accepté à l’ICSPIS 2026 dérive de MAESTRO et STRIDE un Evidence Contract ; le dossier le transpose champ par champ aux hooks, à la provenance et à la trace d’ACS — avec matrice de fautes, crosswalk ACS et tests négatifs pour votre CI.

92,9 %Rappel avec liaisons de sécurité (P3)
16,7 %Rappel avec traçage causal seul (P2)
50 %Rappel sans événements de décision (F1)
  • Crosswalk ACS : famille d’attaque → prédicat → hook → réaction du Guardian
  • Champs minimaux du decision receipt dans policy_data
  • Research Edition (en anglais) : article et ACS Practitioner Brief
Glossaire

Glossaire : les termes de l’Agent Control Standard

Les principaux termes d’ACS v0.1.0 en définitions courtes et citables — les termes anglais de la spécification sont conservés tels quels.

Guardian AgentPolicy Enforcement Point
L’instance de politique externe dans ACS : elle évalue les hooks de l’Observed Agent en dehors du modèle et répond par une disposition — d’abord via du code de politique déterministe, éventuellement complété par une couche LLM. À ne pas confondre avec le terme de marché « guardian agents » de Gartner.
Observed Agent
Le système d’IA surveillé qui implémente le contrat wire d’ACS, envoie des hooks à chaque point de décision et applique les dispositions reçues. Il signale, mais ne décide pas de ses propres actions.
Hooksteps/*
Un point du cycle de vie d’un agent IA où celui-ci s’arrête et interroge le Guardian avant d’agir. ACS v0.1.0 définit 19 hooks natifs steps/* ; ACS-Core en exige au moins six.
DispositionVerdict
La réponse du Guardian à un hook : allow, deny, modify, ask ou defer. Sauf pour allow, une justification dans le champ reasoning est obligatoire.
Failure Postureon_decision_failure
Le comportement de l’Observed Agent lorsqu’aucune décision exploitable n’arrive à temps. La valeur par défaut est proceed (fail-open) ; deny (fail-closed) doit être configuré délibérément, et chaque passage sans décision doit être audité.
Handshakehandshake/hello
L’établissement obligatoire de la session via handshake/hello, au cours duquel l’Observed Agent et le Guardian négocient la version, les méthodes évaluées (methods_evaluated), le timeout et la failure posture. Les méthodes non évaluées sont considérées comme autorisées sans contrôle.
ACS-Coreacs-core
Le profil de base obligatoire de toute implémentation ACS. Selon la spécification, il garantit deux choses : un canal authentifié et le respect, par l’Observed Agent, des décisions du Guardian — il ne garantit pas des politiques strictes.
Profil de conformitéConformance Profile
Un périmètre fonctionnel déclaré lors du handshake : acs-core plus les profils optionnels acs-trace, acs-inspect, acs-inspect-dynamic, acs-provenance, acs-crypto et acs-audit. En v0.1.0, il s’agit d’une pure autodéclaration, sans suite de tests ni organisme d’évaluation.
AgBOMAgent Bill of Materials
L’inventaire dynamique des composants d’un Observed Agent, avec huit types allant de model à skill. Il est transmis par session, inscrit dans la chaîne d’audit et peut déclencher des décisions du Guardian ; ce n’est ni une AI-BOM ni une SBOM au sens du CRA.
Provenance
Indications d’origine au niveau du champ pour les données du payload d’un hook : origin, source_id et derived_from. Le framework les fixe de manière déterministe, jamais le LLM ; elles ne sont obligatoires que dans le profil acs-provenance.
Chaîne d’auditSessionContext
La chaîne append-only des ContextEntries d’une session, reliées par des hachages SHA-256. Le chain_hash publié et signé rend détectable toute modification a posteriori (tamper-evident), sans toutefois protéger contre un Guardian compromis.
Policy-as-Code
Des règles de sécurité sous forme de code versionné et exécutable plutôt que de document. Dans ACS, il s’agit de la couche déterministe du Guardian, qui s’exécute toujours en premier ; la référence de départ pour v0.1 est OPA/Rego, Cedar suivra avec v0.2.
Human-in-the-Loop / approbateur ASKask, approver
Avec ask, le Guardian soumet une action à un approbateur pour validation. Les approbateurs peuvent être des humains, des agents ou des services et doivent être authentifiés ; le contrôle humain n’est assuré que par une politique avec approver.type human et timeout_disposition deny.
DEFERdefer
La disposition par laquelle le Guardian reporte une décision, par exemple faute de contexte ou en raison d’un faible niveau de confiance. À l’expiration du délai, deny s’applique par défaut ; les reports en cascade doivent être limités par session.
MODIFYmodify
La disposition par laquelle le Guardian autorise une action sous une forme modifiée — via parameter_overrides, des caviardages (redactions) ou un contenu de remplacement complet. L’Observed Agent doit traiter un modify non conforme comme un deny.
Session IntentIntent.parsed
L’ensemble des capabilities autorisées pour une finalité donnée, fixé au début de la session. Il ne peut être modifié ni par le LLM ni par les sorties d’outils et ne s’étend que par une approbation auditée via ask (intent_extension).
Capability
Une autorisation abstraite telle que filesystem.delete, network.egress ou process.execute. Elle décrit l’effet d’une action indépendamment de l’outil concret et constitue l’unité dans laquelle le Session Intent et les politiques sont formulés.
Wrapping MCPprotocols/MCP/*
L’espace de noms spécifié en v0.1, dans lequel ACS transmet les messages MCP sans modification au Guardian. Les déploiements peuvent, à la place, représenter les appels d’outils MCP via les hooks d’outils génériques ; le wrapping A2A n’est prévu qu’à partir de v0.2.
Implémentation de référence (AGT)Reference Implementation
La seule preuve de concept du dépôt ACS : un Guardian en TypeScript qui fait fonctionner l’Agent Governance Toolkit de Microsoft sans modification derrière le wire ACS, connecté à Claude Code et OpenCode — ni prêt pour la production ni entièrement conforme à ACS-Core.
Agent Control Specification (Microsoft)Microsoft ACS
Une spécification de politique autonome, fondée sur Rego, publiée par Microsoft pour l’Agent Governance Toolkit (2 juin 2026). Elle est également abrégée « ACS », mais ne fait pas partie de l’OWASP Agent Control Standard.
FAQ

Questions fréquentes sur l’Agent Control Standard (ACS)

Des réponses courtes pour les RSSI, les architectes sécurité et les équipes GRC — état au 4 octobre 2026, spécification v0.1.0.

L’OWASP Agent Control Standard (ACS) est une spécification wire ouverte pour le contrôle à l’exécution des agents IA. Il définit comment un agent — l’Observed Agent — signale les étapes pertinentes via des hooks à un Guardian Agent distinct et attend sa décision : allow, deny, modify, ask ou defer. Trois piliers se complètent : Instrument pour les hooks et les dispositions, Trace pour les événements d’audit selon OpenTelemetry et OCSF, Inspect pour l’AgBOM. ACS est un projet de l’OWASP GenAI Security Project, actuellement en spécification v0.1.0, release 0.1.2 (tag posé le 21 septembre 2026). Le code et les schémas sont placés sous Apache-2.0, la documentation sous CC BY-SA 4.0.

Non. ACS est un projet OWASP à un stade précoce — au niveau 2 (Incubator) selon ses propres métadonnées de projet, et qualifié de « public preview » par le Project Lead lui-même. Ce n’est ni une norme ISO, IETF ou W3C, ni une norme harmonisée. En v0.1.0, la conformité est une autodéclaration que personne ne vérifie (issue #19). Même le périmètre obligatoire d’ACS-Core est encore en discussion dans une pull request ouverte. La feuille de route est elle aussi provisoire : v0.2.0 est annoncée comme objectif pour mars 2027, v1.0 n’a pas encore de date. L’origine mérite elle aussi la transparence : la création et la direction du projet sont fortement marquées par Zenity.

Les prompts système ne sont pas des contrôles : ils agissent dans le même canal qu’un attaquant peut influencer par injection de prompt. Les frameworks de guardrails sont des implémentations concrètes, chacune dotée de sa propre interface. ACS définit au contraire une interface ouverte, indépendante des frameworks, entre l’hôte de l’agent et un Guardian externe : la décision est prise en dehors du modèle, les politiques déterministes s’exécutent en premier, et l’agent doit appliquer le résultat. C’est important, car selon OpenAI, l’injection de prompt est « unlikely to ever be fully 'solved' » (22 décembre 2025). ACS n’empêche pas l’injection de prompt — il crée le point de contrôle standardisé où les politiques agissent contre ses conséquences.

ACS ne remplace aucun des deux protocoles, mais ajoute une couche de contrôle par-dessus. Pour MCP, la v0.1 spécifie l’espace de noms protocols/MCP/*, indépendant des versions : les messages sont transmis sans modification au Guardian, qui les évalue avant leur transfert ou leur traitement. Les déploiements peuvent, à la place, représenter les appels d’outils MCP via steps/toolCallRequest et steps/toolCallResult ; le texte de la spécification est contradictoire quant à l’appartenance du wrapping MCP à ACS-Core. Le texte de la spécification suppose en outre encore des mécanismes antérieurs à la révision MCP actuelle 2026-07-28. En v0.1, A2A est seulement réservé, l’encapsulation suivra avec v0.2. D’ici là, restent steps/agentTrigger avec a2a_inbound et le type AgBOM a2a_peer.

ACS peut contribuer à la constitution des preuves, mais ne permet pas, en soi, de satisfaire à l’AI Act et ne fonde aucune présomption de conformité. Pour l’obligation d’enregistrement de l’article 12, acs-trace (événements par étape) et acs-audit (chaîne d’audit liée au contenu des requêtes, rendant toute altération détectable) fournissent des briques. Pour le contrôle humain au sens de l’article 14, ask ne convient qu’avec une politique « approbateur humain, timeout deny » ; la v0.1 ne connaît pas de bouton d’arrêt, seulement un deny étape par étape. Tenez compte des échéances : selon le règlement (UE) 2026/1744, les obligations relatives aux systèmes à haut risque s’appliquent à partir du 2 décembre 2027 (annexe III) ou du 2 août 2028 (annexe I), et l’article 50 s’applique depuis le 2 août 2026. Les agents IA ne sont pas à haut risque en soi. Cette correspondance est une déduction de VamiSec.

Par défaut, l’agent continue de fonctionner. Si aucune décision exploitable n’arrive dans le délai négocié, on_decision_failure s’applique avec la valeur par défaut proceed (fail-open) ; un handshake échoué démarre lui aussi la session sans protection par défaut. Chacun de ces passages doit être consigné comme événement d’audit — la spécification reconnaît ouvertement qu’un attaquant qui perturbe le canal transforme ainsi le contrôle en simple journalisation. Vous obtenez un fonctionnement fail-closed avec on_decision_failure: deny et la startup posture refuse. Les décisions ask et defer expirées basculent en revanche sur deny par défaut. La posture s’appliquant par session, nous recommandons des Guardians ou des sessions distincts par classe de risque (appréciation de VamiSec).

La spécification ne fixe aucune exigence en millisecondes. Le timeout est négocié lors du handshake (timeout_config.default_ms, éventuellement par méthode) ; dans le pire des cas, chacune de ces millisecondes représente un temps d’attente supplémentaire pour l’agent. L’implémentation de référence fixe 5000 ms. Les politiques déterministes, qui selon la spécification ne devraient pas contenir d’appels HTTP externes, économisent de la latence ; la couche LLM optionnelle coûte selon notre appréciation nettement plus, et la signature avec SLH-DSA-128s prend, selon la spécification, plusieurs centaines de millisecondes. Sur le plan opérationnel, nous recommandons d’exploiter le Guardian au plus près de l’agent et de manière redondante, de budgéter les timeouts par méthode et de surveiller le taux d’échec des décisions comme indicateur — un system/ping réussi ne prouve pas que l’application des décisions fonctionne.

Il n’existe qu’une seule implémentation de référence, explicitement présentée comme preuve de concept : un Guardian en TypeScript qui fait fonctionner l’Agent Governance Toolkit de Microsoft sans modification derrière le wire ACS, avec des connecteurs hôtes pour Claude Code et OpenCode. Il évalue en direct deux des 19 hooks (steps/toolCallRequest et steps/toolCallResult), ne signe rien (issue #70), n’a pas de protection contre le rejeu et fonctionne par défaut en fail-open (issues #32 et #37). Le projet vise un benchmark d’interopérabilité d’ici début décembre 2026 ; celui-ci n’est pas encore disponible. Il n’en découle aucun soutien de la part de Microsoft. Nous n’avons connaissance d’aucun déploiement en production avéré (état au 4 octobre 2026).

Non — c’est un piège de dénomination. Le 2 juin 2026, Microsoft a publié sa propre « Agent Control Specification », également abrégée ACS : une spécification de politique fondée sur Rego pour l’Agent Governance Toolkit, avec huit interception points et des décisions telles que allow, warn, deny et escalate. Elle émane de Microsoft, et non de l’OWASP GenAI Security Project, et ne mentionne pas le standard OWASP. Le lien est indirect : l’implémentation de référence d’ACS utilise le toolkit comme moteur de politiques ; le paquet npm agent-control-specification qui y est employé est le SDK de Microsoft, et non un artefact du standard OWASP. Sur cette page, ACS désigne toujours l’OWASP Agent Control Standard.

Traitez ACS comme une architecture de référence, pas comme une caractéristique produit. Le point de départ est un inventaire des agents avec leurs outils, modèles, serveurs MCP et skills, ainsi qu’une classification des risques, par exemple selon la lethal trifecta. Viennent ensuite des politiques pour les capabilities lourdes de conséquences sur steps/toolCallRequest, une décision délibérée sur la failure posture et les approbateurs, ainsi que le raccordement de Trace à votre SIEM ; le chapitre 14 décrit les cinq étapes en détail. Le navigateur de profils et l’autoévaluation montrent votre point de départ, et le livre blanc contient un programme de 100 jours. Vérifiez les affirmations des fournisseurs sur les profils ACS par des tests plutôt que de les reprendre telles quelles. Notre dossier « Agentic AI Security Testing », consacré à l’article ICSPIS 2026, montre comment prouver l’efficacité de vos politiques Guardian par des tests négatifs et des decision receipts dans la CI. VamiSec vous accompagne en toute indépendance pour l’évaluation, l’architecture, la conception des politiques, le déploiement et les tests.

Normes & sources

Le contenu de cette page s'appuie sur les guides et études suivants, accessibles publiquement.

OWASP GenAI Security Project · 2026

Agent Control Standard (ACS) — dépôt GitHub

Source primaire : spécification v0.1.0, release 0.1.2, 44 schémas JSON, implémentation de référence (PoC) ; code et schémas sous Apache-2.0, documentation sous CC BY-SA 4.0 — état analysé : 3 octobre 2026

OWASP GenAI Security Project · 2026

ACS Instrument Specification v0.1.0

Documentation publiée de la spécification : format wire, handshake, taxonomie des 19 hooks, dispositions, failure posture, signatures et codes d’erreur

OWASP GenAI Security Project · 2026

ACS Conformance — ACS-Core et profils

Périmètre obligatoire d’ACS-Core, les six profils optionnels et la mention qu’en v0.1.0, personne ne vérifie les déclarations de conformité

OWASP GenAI Security Project · 2026

Schémas JSON ACS v0.1.0 (exemple : defer-details.json)

Espace de noms de schémas propre au projet depuis le 5 septembre 2026 ; base des exemples wire fidèles aux schémas du simulateur

OWASP GenAI Security Project · 2026

Agent Control Standard (ACS) — page de ressources

Référencement dans la rubrique Agentic Security, daté du 1er septembre 2026

Zenity Labs (Rock Lambros) · 2026

Control Made It Into the Name: The Agent Control Standard Lands at OWASP

Billet de blog du Project Lead du 10 septembre 2026 sur l’origine et la relance ; qualifie ACS de « public preview » — source éditeur

Cloud Security Alliance Labs · 2026

CSA Research Note: OWASP's 2026 LLM Top 10 and New Agent Control Standard

Analyse externe du 4 septembre 2026 : ACS comme « architecture to plan around and pilot against »

OWASP GenAI Security Project — Agentic Security Initiative · 2025

OWASP Top 10 for Agentic Applications 2026

Risques ASI01–ASI10, publiés en décembre 2025 ; cadre de référence de la matrice des risques (ACS n’y figure pas)

OWASP GenAI Security Project — Agentic Security Initiative · 2025

Agentic AI – Threats and Mitigations (ressources de l’Agentic Security Initiative)

Taxonomie des menaces T1–T15 dans la version 1.0 de février 2025 ; accessible via l’aperçu des ressources de l’initiative

Union européenne, Journal officiel · 2024

Règlement (UE) 2024/1689 (règlement sur l’IA / AI Act)

Articles 9, 12, 14, 15, 19, 26, 50 et 72 comme points de référence de la correspondance réglementaire

Union européenne, Journal officiel · 2026

Règlement (UE) 2026/1744 (Digital Omnibus on AI)

Reporte les obligations relatives aux systèmes à haut risque au 2 décembre 2027 (annexe III) et au 2 août 2028 (annexe I)

National Institute of Standards and Technology · 2023

NIST AI 100-1: Artificial Intelligence Risk Management Framework (AI RMF 1.0)

Cadre volontaire ; MANAGE 2.4 sur les mécanismes permettant de remplacer, déconnecter ou désactiver des systèmes d’IA

OpenTelemetry · consulté en octobre 2026

Conventions sémantiques OpenTelemetry pour l’IA générative

Statut « Development » ; base de comparaison pour les mappings Trace d’ACS (spans d’outils : execute_tool)

Open Cybersecurity Schema Framework (Linux Foundation) · consulté en octobre 2026

OCSF Schema 1.5.0 — catégories et classes

Comparaison des UID et noms de classes utilisés par ACS, notamment 2004 Detection Finding et 6002 Application Lifecycle

OWASP Foundation / Ecma TC54 · 2025

CycloneDX Specification Overview

Version actuelle : 1.7 ; ACS sérialise l’AgBOM selon CycloneDX 1.6

Microsoft (Responsible AI) · 2026

Introducing Agent Control Specification: Portable runtime governance for AI Agents

Distinction : spécification Microsoft autonome du 2 juin 2026, également abrégée « ACS », qui ne fait pas partie du standard OWASP

Microsoft Open Source Blog · 2026

Introducing the Agent Governance Toolkit (Microsoft Open Source Blog)

Annonce du 2 avril 2026 ; le toolkit sert, sans modification, de moteur de politiques à l’implémentation de référence d’ACS

OpenAI · 2025

Continuously hardening ChatGPT Atlas against prompt injection attacks

22 décembre 2025 : l’injection de prompt serait « unlikely to ever be fully 'solved' » — argument en faveur de contrôles à l’exécution indépendants du modèle

Vous souhaitez mettre en place un contrôle à l’exécution pour vos agents IA ?

VamiSec vous accompagne en toute indépendance : évaluation de votre paysage d’agents, architecture du Guardian et conception des politiques selon ACS, déploiement et tests — sans promesse de certification et avec un regard lucide sur la maturité de la v0.1.