ACS distingue deux rôles. L’Observed Agent est le système d’IA surveillé : il signale chaque étape pertinente via un hook et applique la réponse, mais ne décide pas de ses propres actions. Le Guardian Agent est l’instance de politique : il évalue chaque hook au regard de la politique du déploiement et répond par une disposition. Avec ask intervient un approbateur — un humain, un agent ou un service, dont le Guardian doit vérifier l’identité. Point décisif pour l’architecture : le modèle lui-même ne doit rien savoir des hooks ; le contrôle se situe en dehors de son chemin de sortie.
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.
JSON-RPC 2.0 · HTTP(S) ou stdio
Observed Agentp. ex. agent de codage
steps/toolCallRequestallowdenymodifyaskdefer
Guardian AgentPolicy-as-Code + LLM en option
- allow
- deny
- modify
- ask
- defer
deny · destructive_shell_command_blocked · agt_stockmodify · parameter_overrides · LIMIT 500ask · approver=human · timeout_disposition=deny
InstrumentHooks & dispositionsTraceOpenTelemetry & OCSFInspectAgBOM
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.
11 mai 2025
Lancement sous le nom d’Agent Observability Standard (AOS)
Michael Bargury effectue les premiers commits dans le dépôt zenitysec/AOS. AOS s’articule déjà autour d’Instrument, Trace et Inspect — les trois piliers qui structurent aujourd’hui encore ACS. De mi-mai au 5 juin 2025, la spécification du protocole s’appelle temporairement ASOP (Agent Security & Observability Protocol).
Juin 2025
AOS devient un projet OWASP
Après une étape intermédiaire, le dépôt rejoint l’organisation OWASP ; à partir de mi-juin 2025, les contributions passent par l’OWASP. AOS est référencé comme « OWASP other project », sous la direction de Michael Bargury. Fin décembre 2025, les travaux sont mis en sommeil.
10 avril 2026
Changement de nom : Agent Control Standard (ACS)
Rock Lambros renomme le projet : « Agent Observability » devient « Agent Control ». ACS évolue temporairement de manière autonome, sous licence MIT, dans sa propre organisation GitHub.
27 mai 2026
Communiqué de lancement
Via Business Wire, ACS se présente comme un framework ouvert pour la gouvernance à l’exécution des agents IA — selon le communiqué, sous licence MIT et sans contrôle commercial exercé par une entreprise unique.
5 juin 2026
Spécification canonique v0.1.0
L’import de la version canonique v0.1.0 apporte les sections normatives centrales actuelles : handshake, failure posture, chaîne d’audit, signatures, codes d’erreur, hooks de skills, profils de conformité et schémas JSON. Trois jours plus tôt, Microsoft avait publié sa propre « Agent Control Specification » — un projet distinct portant le même sigle.
11 août 2026
Release v0.1.1 et nouveau modèle de licence
Depuis, le code et les schémas sont placés sous Apache-2.0 et la documentation sous CC BY-SA 4.0 ; les releases jusqu’à v0.1.0 restent sous licence MIT. Les versions de release et de spécification sont découplées, la spécification reste en v0.1.0. Le dépôt migre vers l’organisation GenAI-Security-Project.
Septembre 2026
Relance au sein de l’OWASP GenAI Security Project
Page de ressources sur genai.owasp.org (1er septembre), site de la spécification et l’ensemble des 44 schémas JSON sous des URI propres au projet (5 septembre), tableau de taxonomie des hooks de la spécification corrigé à 19 hooks (7 septembre), gouvernance et implémentation de référence PoC fondée sur l’Agent Governance Toolkit de Microsoft (10 septembre).
21 septembre 2026
Tag v0.1.2
Le tag est posé a posteriori sur un commit du 9 septembre : l’enveloppe de réponse peut désormais contenir un ServerHello. Depuis v0.1.1, les URI des schémas et le texte de la spécification ont en outre changé — la version de la spécification reste néanmoins v0.1.0.
Mars 2027 (objectif)
v0.2.0 prévue
Selon le projet, c’est l’objectif fixé pour la prochaine spécification, avec notamment : streaming et interruption, ASK récursif et quorum, wrapping A2A, binding Cedar, isolation multi-tenant et fédération AgBOM. Aucune date n’est fixée pour v1.0.
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.
Les hooks sont les points de contrôle d’ACS. La spécification v0.1.0 définit 19 hooks natifs steps/* — de sessionStart aux trois hooks de skills et à sessionEnd, en passant par userMessage, knowledgeRetrieval, memoryStore et toolCallRequest. S’y ajoutent agbom/snapshot, agbom/changed, system/ping et handshake/hello. Les frameworks doivent déclencher steps/toolCallRequest pour chaque action qui quitte le contexte de raisonnement, y compris pour le shell, le système de fichiers et le réseau. ACS-Core exige au moins six hooks ; tout ce que le Guardian ne mentionne pas dans methods_evaluated est considéré comme autorisé sans contrôle.
Le Guardian répond par l’une des cinq dispositions : allow laisse l’action s’exécuter, deny la bloque, modify réécrit des paramètres ou caviarde des contenus, ask la soumet à un approbateur, defer reporte la décision, par exemple lorsque le contexte manque. Hormis allow, toutes exigent une justification dans le champ reasoning. La spécification cite expressément le vocabulaire complet pour steps/toolCallRequest ; d’autres hooks disposent d’ensembles plus restreints, et les hooks purement d’audit comme sessionEnd n’appellent aucune décision. Au sein des dispositions, les valeurs par défaut sont strictes : les décisions ask et defer expirées basculent sur deny, et l’agent traite un modify non conforme comme un deny.
Chaque session commence par handshake/hello. L’Observed Agent indique les versions, les méthodes implémentées, les transports et les profils ; dans le ServerHello, le Guardian fixe les méthodes qu’il évalue réellement (methods_evaluated), la durée pendant laquelle l’agent attend une décision (timeout_config) et ce qui s’applique en cas de défaillance (on_decision_failure). Le handshake détermine ainsi la couverture réelle : ce qui n’est pas négocié s’exécute sans contrôle. Pour le cas d’erreur, il existe deux préréglages — l’un pour le démarrage de la session, l’autre pour chaque étape individuelle —, et tous deux sont réglés par défaut sur proceed, donc fail-open. La FAQ et le chapitre 6 expliquent ce que cela implique pour l’exploitation.
Le Guardian fonctionne en deux couches. La couche déterministe évalue d’abord chaque hook — sous forme de Policy-as-Code, avec OPA/Rego comme référence de départ en v0.1 ; un binding Cedar est prévu pour v0.2. Ce n’est que si sa configuration le délègue qu’une couche LLM optionnelle entre en jeu. Celle-ci ne voit pas le code des politiques, doit traiter les données non fiables comme de simples données et journaliser ses décisions avec justification, identifiant du modèle et, le cas échéant, niveau de confiance ; son résultat repasse ensuite par la couche déterministe. Un Guardian purement déterministe est pleinement conforme. La spécification définit uniquement l’interface avec le moteur de politiques, pas le moteur lui-même — ni le contenu des politiques. L’efficacité dépend donc entièrement de vos règles.
Pour chaque session, le Guardian tient une chaîne append-only de ContextEntries, reliées par des hachages SHA-256 fondés sur la canonicalisation JCS selon la RFC 8785. Pour les étapes porteuses de contenu, il doit publier le chain_hash courant dans sa réponse. ACS-Core exige en outre une signature HMAC-SHA256 de chaque requête et de chaque réponse, avec une clé de session dérivée par HKDF, ainsi qu’une protection contre le rejeu via request_id et une fenêtre temporelle. La piste d’audit rend ainsi toute altération détectable face aux attaques sur le réseau — mais pas face à un Guardian compromis. La non-répudiation n’est apportée que par acs-crypto avec ML-DSA-65, et le lien avec le contenu des requêtes que par acs-audit via request_hash.
ACS n’invente pas de nouveau format de journal. Le pilier Trace fournit un vocabulaire normatif pour OpenTelemetry et OCSF : noms de spans et attributs par hook, décisions sous forme d’événement de span acs.decision, décisions autres que allow sous forme d’OCSF Detection Finding (2004) avec une sévérité allant de 2 pour modify à 4 pour deny. L’objectif : alimenter les pipelines SIEM existants sans parseur spécifique. Trace fonctionne en best-effort : une panne du collecteur ne bloque rien, et les événements de trace sont des déclarations de l’environnement observé. Les mappings portent le statut « Working draft », ne couvrent pas les trois hooks de skills et divergent d’OCSF et d’OpenTelemetry pour certains noms de classes et de spans.
Exploiter la télémétrie ACS dans les tests de sécurité →L’AgBOM est l’inventaire dynamique d’un Observed Agent : huit types de composants, de model, mcp_server et a2a_peer à agent_capability et skill, en passant par tool, knowledge_source et memory_store. agbom/snapshot le transmet une fois par session, avant le premier hook porteur de contenu ; agbom/changed signale les modifications en cours d’exécution, mais uniquement dans le profil acs-inspect-dynamic. Via deny, le Guardian peut refuser des sessions comportant des composants bannis ou bloquer un remplacement à chaud. Les sérialisations selon CycloneDX 1.6, SPDX 3.0 ou SWID sont au stade « Working draft ». L’AgBOM est une déclaration de l’agent lui-même — et ne remplace ni une AI-BOM ni la SBOM exigée par le Cyber Resilience Act.
ACS-Core est obligatoire ; s’y ajoutent six profils optionnels : acs-trace, acs-inspect, acs-inspect-dynamic, acs-provenance, acs-crypto et acs-audit. Les deux parties les déclarent lors du handshake — et en v0.1.0, personne ne le vérifie : il n’existe ni suite de tests, ni registre, ni organisme d’évaluation. Même un Guardian permissif est conforme. La seule implémentation de référence est une preuve de concept qui évalue en direct deux des 19 hooks et n’implémente ni HMAC ni protection contre le rejeu. L’objectif pour la prochaine spécification v0.2.0 est mars 2027 ; aucune date n’est fixée pour v1.0. Envisagez ACS comme une cible d’architecture, pas comme une certification.
Tester soi-même l’efficacité : tests négatifs issus du modèle de menaces →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.
Pilier19 hooks · 5 dispositions
- 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
Profil acs-traceOpenTelemetry + OCSF
- Un vocabulaire normatif plutôt qu’un transport propre : noms de spans, attributs, classes OCSF et mapping de sévérité par hook.
- Hiérarchie de spans acs.session → acs.turn → span d’étape ; les décisions sont rattachées sous forme d’événement acs.decision à l’étape qu’elles autorisent ou bloquent.
- Classes OCSF par UID : 3002 Authentication, 1007 Process Activity, 6005 Datastore Activity, 2004 Detection Finding pour deny, modify, ask et defer.
- Quiconque revendique acs-trace doit émettre chaque décision sous forme d’événement de trace, avec la disposition, l’évaluateur et la justification lorsqu’elle existe.
- Limites : best-effort et autodéclaré, hooks de skills sans mapping ; le span d’outil ACS gen_ai.tool.call n’est qu’un préfixe d’attribut dans OpenTelemetry (qui utilise execute_tool), et la classe 6002 s’appelle « Application Lifecycle » dans OCSF.
OpenTelemetryOCSF 1.5+Detection Finding 2004acs.decision
Profil acs-inspect8 types de composants
- L’AgBOM, un inventaire dynamique et interrogeable : model, mcp_server, a2a_peer, tool, knowledge_source, memory_store, agent_capability et skill.
- agbom/snapshot une fois par session, avant le premier hook porteur de contenu — le Guardian l’inscrit dans la chaîne d’audit.
- agbom/changed à chaque modification du graphe de composants, mais uniquement sous acs-inspect-dynamic ; sans ce profil, l’agent ne signale pas les remplacements à chaud (hot swaps) en cours de session.
- Les politiques du Guardian peuvent stopper via deny des modèles, outils ou serveurs MCP bannis ; si une politique dépend de l’inventaire, acs-inspect est obligatoire.
- Sérialisation selon CycloneDX 1.6, SPDX 3.0 ou SWID (au moins l’un des trois) — mappings au statut « Working draft », en partie non valides au regard des schémas.
agbom/snapshotagbom/changedCycloneDX 1.6SPDX 3.0SWID
ArchitecturePriorité au déterministe
- La couche déterministe s’exécute toujours en premier : Policy-as-Code avec OPA/Rego comme référence de départ pour v0.1 ; un binding Cedar est prévu pour v0.2.
- Une couche LLM optionnelle n’intervient qu’en cas de délégation — sans accès au code des politiques, avec journalisation de la justification, de l’identifiant du modèle et, le cas échéant, du niveau de confiance.
- Les Guardians purement déterministes sont pleinement conformes ; metadata.evaluator indique si la décision relève de deterministic, agent ou composite.
- La spécification ne définit que l’interface avec le moteur ; les politiques canoniques ne devraient pas contenir d’appels HTTP externes.
- Paradigmes sans extension du wire : IBAC, FIDES, CaMeL et règles de type AARM portant sur le contexte cumulé.
Policy-as-CodeOPA/RegoCedar (v0.2)IBAC · FIDES · CaMeL · AARM
Profil acs-provenance7 valeurs origin
- ACS n’impose aucun mécanisme d’authentification ; les schémas de confiance tels que SPIFFE, OIDC ou une PKI à l’échelle de l’organisation relèvent du déploiement.
- Les identités de l’Observed Agent, du Guardian et de l’auteur des politiques ne doivent pas être confondues ; les approbateurs doivent être authentifiés.
- Session Intent : Intent.parsed est figé avant la première étape porteuse de contenu et ne s’étend que par une approbation authentifiée via ask.
- La provenance porte des faits par champ de données : provenance_id, origin (sept valeurs, de user_input à external), source_id et derived_from.
- C’est le framework qui fixe la provenance de manière déterministe, jamais le LLM ; sous acs-provenance, cela vaut pour chaque champ porteur de données de la session.
- Pas de champ trust dans le schéma v0.1 : le Guardian déduit la confiance de l’origine — un traitement par LLM ne rend pas fiables des données non fiables.
originderived_fromprovenance_producerIntent.parsed
Autodéclaration1 profil obligatoire + 6 optionnels
- acs-core est obligatoire et comprend notamment le handshake, les enveloppes, six hooks minimaux, les cinq dispositions, une chaîne d’audit avec chain head publié, la protection contre le rejeu, la signature HMAC-SHA256 et system/ping.
- ACS-Core n’exige ni événements de trace, ni AgBOM, ni provenance au niveau du champ, ni signatures asymétriques, ni request_hash — ce sont les profils optionnels qui les apportent.
- Les profils relèvent de l’autodéclaration lors du handshake : pas de suite de tests, pas de registre, pas d’organisme d’évaluation (issue #19, priorité P1, ouverte).
- Un Guardian permissif est conforme — la conformité ne dit rien de la rigueur de vos politiques.
- Le périmètre obligatoire évolue : la PR #21, encore ouverte, rétrograderait notamment modify et system/ping au niveau SHOULD.
- Exemples de combinaisons dans la spécification : une intégration IDE minimale avec acs-core seul, un déploiement à haut niveau d’assurance avec les sept profils.
acs-coreacs-traceacs-inspectacs-cryptoacs-audit
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.
- 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É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 - 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.
- 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
Agent d’analyse
Pour un rapport, l’agent d’analyse veut exécuter un SELECT * sur la table des clients — sans limite de lignes et avec toutes les colonnes.
- 1Requête de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/toolCallRequest", "id": 17, "params": { "acs_version": "0.1.0", "request_id": "d4a7c0e3-5f8b-4c1e-9a6d-2b5e8f1c4a73", "timestamp": "2026-10-06T09:24:18Z", "metadata": { "agent_id": "analytics-agent-02", "session_id": "8e1b4c7a-2f5d-4a90-b6c3-d4e5f6a7b8c9", "turn_id": "c2e5f8a1-3b6d-4f9c-8a2e-7d0f1c4e6b92" }, "payload": { "tool": { "name": "database_query" }, "capability": "database.read", "arguments": { "query": { "value": "SELECT * FROM customers", "provenance": { "provenance_id": "p-205", "origin": "agent_generated", "derived_from": [ "p-201" ] } } } }, "signature": { "algorithm": "HMAC-SHA256", "value": "O3OXC3lacLzJOEbWjqw/o0TzL6sXBF+xkW16O8RIrHw=", "key_id": "sess-hmac-analytics-02" } } } - 2Évaluation par le Guardian
- Couche déterministe : la règle cap_unbounded_select de la politique db-row-limit détecte une requête sans LIMIT sur une table classée sensible.
- La politique autorise la finalité (le rapport), mais uniquement avec les colonnes autorisées et 500 lignes au maximum (valeur limite illustrative).
- Au lieu de bloquer, le Guardian réécrit uniquement l’argument query via parameter_overrides. Il ne peut pas combiner cela avec un remplacement de la charge utile complète (modified_content).
- Réponse : modify avec reasoning et modifications — l’Observed Agent doit exécuter la requête modifiée.
DispositionmodifyParamètres réécrits - 3Réponse (Guardian → Observed Agent)
{ "jsonrpc": "2.0", "id": 17, "result": { "type": "final", "acs_version": "0.1.0", "request_id": "d4a7c0e3-5f8b-4c1e-9a6d-2b5e8f1c4a73", "decision": "modify", "reasoning": "Unbounded SELECT on customers exceeds the row-limit policy; query capped at 500 rows and reduced to approved columns.", "reason_codes": [ "row_limit_exceeded" ], "modifications": { "parameter_overrides": { "query": "SELECT id, segment, country FROM customers LIMIT 500" } }, "policy_references": [ { "policy_id": "db-row-limit", "policy_version": "2026.10.1", "rule_id": "cap_unbounded_select" } ], "metadata": { "evaluator": "deterministic", "evaluation_duration_ms": 4 }, "chain_hash": "6edfb8f26fe425f6891d7fccad3991a14e818d1199c29b9677724794cb725521", "signature": { "algorithm": "HMAC-SHA256", "value": "JmDUSrtQvFUL5/cFPeiP0nNUi0lN9L4ZkIw8+oNHn48=", "key_id": "sess-hmac-analytics-02" } } }La requête s’exécute avec LIMIT 500 et un nombre réduit de colonnes. L’agent obtient un résultat exploitable, et le volume de données récupéré reste limité.
- 4Piste d’audit (Trace)
{ "entry_id": "ce-0002", "step_id": "d4a7c0e3-5f8b-4c1e-9a6d-2b5e8f1c4a73", "step_type": "steps/toolCallRequest", "request_hash": "1ab512a11f6ed1d456e6a43b39e879772a0d2dd1045e4ce8887ce2ff449e7657", "timestamp": "2026-10-06T09:24:18Z", "previous_hash": "daceae6d78730c33d4805a0daca7bbd1929f323ada77cab0374a6cbfdcf8e570", "entry_hash": "6edfb8f26fe425f6891d7fccad3991a14e818d1199c29b9677724794cb725521" }Vous voyez ici le ContextEntry de la chaîne d’audit : entry_hash chaîne l’étape à previous_hash et correspond au chain_hash de la réponse du Guardian. request_hash lie le contenu de la requête — recommandé dans ACS-Core, obligatoire seulement sous acs-audit.
Ce que cela signifie pour vous
modify est l’outil du « oui, mais en toute sécurité » : vous imposez techniquement la minimisation des données sans bloquer le cas d’usage. Un modify mal formé doit être traité comme un deny par l’Observed Agent — la spécification exige ici le fail-closed.
ASI02ASI03
Agent financier
L’agent financier veut régler une facture fournisseur de 48 500 EUR. Les coordonnées bancaires du bénéficiaire proviennent d’un e-mail, et non des données de référence fournisseurs.
- 1Requête de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/toolCallRequest", "id": 9, "params": { "acs_version": "0.1.0", "request_id": "f1b4e7a0-6c9d-4f2a-b8e3-5d7a0c3f6e91", "timestamp": "2026-10-06T10:05:33Z", "metadata": { "agent_id": "finance-agent-ap-01", "session_id": "b7c0d3e6-4a9f-4e2b-8d15-3f6a9c2e5b18", "turn_id": "e3f6a9c2-5d8b-4b1e-9c47-0a3d6f9b2e54" }, "payload": { "tool": { "name": "payments_api" }, "operation": "create_transfer", "capability": "payment.initiate", "arguments": { "amount": { "value": "48500.00 EUR", "provenance": { "provenance_id": "p-311", "origin": "tool_output", "source_id": "invoice_parser" } }, "beneficiary": { "value": "vendor V-2291, bank account changed via e-mail", "provenance": { "provenance_id": "p-312", "origin": "tool_output", "source_id": "mail_inbox" } } } }, "signature": { "algorithm": "HMAC-SHA256", "value": "BNOgarNt++1Z6umtLvb3ocuYI3VXSDu/0UyMwiUys38=", "key_id": "sess-hmac-finance-01" } } } - 2Évaluation par le Guardian
- Couche déterministe : le montant dépasse le plafond des paiements automatiques ; la règle ask_above_limit_or_changed_beneficiary s’applique (illustratif).
- Vérification de la provenance : l’argument beneficiary porte origin tool_output avec source_id mail_inbox et est considéré comme non fiable selon le mapping par défaut.
- Le Guardian demande une approbation : approver.type human, timeout_seconds 900, timeout_disposition deny ; l’extension d’intention (intent_extension) ne vaut que pour cette requête (scope this_request).
- L’approbateur doit s’authentifier, et le Guardian vérifie son identité au regard de la politique ; un approbateur ne peut pas lui-même renvoyer un ask.
DispositionaskApprobation demandée - 3Réponse (Guardian → Observed Agent)
{ "jsonrpc": "2.0", "id": 9, "result": { "type": "final", "acs_version": "0.1.0", "request_id": "f1b4e7a0-6c9d-4f2a-b8e3-5d7a0c3f6e91", "decision": "ask", "reasoning": "Amount exceeds the auto-approval limit and the beneficiary's bank details were taken from an e-mail, not from vendor master data.", "reason_codes": [ "approval_threshold_exceeded", "beneficiary_changed" ], "ask_details": { "approver": { "type": "human", "id": "treasury-approver@example.com" }, "question": "Approve transfer of 48,500.00 EUR to vendor V-2291 with changed bank details?", "options": [ "approve", "reject" ], "timeout_seconds": 900, "timeout_disposition": "deny", "intent_extension": { "capabilities": [ { "tool": "payments_api", "operation": "create_transfer", "resource": "vendor:V-2291" } ], "scope": "this_request" } }, "policy_references": [ { "policy_id": "ap-payments", "policy_version": "2026.10.1", "rule_id": "ask_above_limit_or_changed_beneficiary" } ], "cited_provenance_ids": [ "p-311", "p-312" ], "metadata": { "evaluator": "deterministic", "evaluation_duration_ms": 5 }, "chain_hash": "01918aa3a3c9b7ec4b99826d21a9d843b5f071655c3dc155c50b2c2fe93db2b8", "signature": { "algorithm": "HMAC-SHA256", "value": "I7WChoFe42FDc/PXgS+nKkaQrZFRhoDuqUMLdj8qflA=", "key_id": "sess-hmac-finance-01" } } }Le paiement attend l’approbation de la trésorerie. Si personne ne répond dans les 15 minutes, deny s’applique — le virement n’est pas exécuté.
- 4Piste d’audit (Trace)
{ "_note": "vereinfachter Auszug", "class_uid": 2004, "class_name": "Detection Finding", "category_uid": 2, "activity_id": 1, "severity_id": 3, "time": 1791281133005, "metadata": { "version": "1.5.0" }, "finding_info": { "uid": "dec-f1b4e7a0", "title": "Approval required: payment above limit, changed beneficiary" }, "enrichments": [ { "name": "acs_provenance_origin", "value": "tool_output" }, { "name": "acs_provenance_source_id", "value": "mail_inbox" } ], "unmapped": { "acs": { "decision": "ask", "evaluator": "deterministic", "policy_references": [ { "policy_id": "ap-payments", "policy_version": "2026.10.1", "rule_id": "ask_above_limit_or_changed_beneficiary" } ], "reason_codes": [ "approval_threshold_exceeded", "beneficiary_changed" ], "cited_provenance_ids": [ "p-311", "p-312" ], "session_id": "b7c0d3e6-4a9f-4e2b-8d15-3f6a9c2e5b18", "step_id": "f1b4e7a0-6c9d-4f2a-b8e3-5d7a0c3f6e91" } } }Dans le mapping ACS, ask apparaît comme Detection Finding (OCSF 2004) avec severity_id 3 (Medium). L’identité de l’approbateur et le résultat doivent en outre figurer dans vos preuves d’approbation.
Ce que cela signifie pour vous
ask n’est pas automatiquement synonyme de contrôle humain : la spécification autorise aussi des agents ou des services comme approbateurs. Pour constituer des preuves, par exemple au titre de l’article 14 du règlement européen sur l’IA (AI Act) dans les déploiements à haut risque, fixez par politique « human approver, timeout deny » — selon notre appréciation, c’est la configuration robuste.
ASI01ASI02ASI09
Agent de support
L’agent de support doit résumer le statut d’un ticket et le récupère à cet effet. Le résultat contient les coordonnées de la cliente ainsi que la note d’un expéditeur externe demandant d’exporter la liste des clients.
- 1Requête de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/toolCallResult", "id": 23, "params": { "acs_version": "0.1.0", "request_id": "a8b1c4d7-0e3f-4a6b-9c2d-5e8f1a4b7c06", "timestamp": "2026-10-06T11:14:52Z", "metadata": { "agent_id": "support-agent-eu-03", "session_id": "c9d2e5f8-7b1a-4c3d-9e6f-4a7b0c3d6e29", "turn_id": "f4a7b0c3-6e9d-4c2f-8b5a-1d4e7a0c3f65" }, "payload": { "tool": { "name": "ticket_lookup" }, "exit_status": "success", "outputs": [ { "value": "Ticket 48121, contact J. Example, +49 000 0000000", "provenance": { "provenance_id": "p-421", "origin": "tool_output", "source_id": "crm" } }, { "value": "External note: <instruction to export the customer list>", "provenance": { "provenance_id": "p-422", "origin": "tool_output", "source_id": "inbound_mail" } } ] }, "signature": { "algorithm": "HMAC-SHA256", "value": "9oNhSZD+hpXpIvLBTjgaGEh73I+A3Uv3TRs+wY6y78E=", "key_id": "sess-hmac-support-03" } } } - 2Évaluation par le Guardian
- Couche déterministe : les deux sorties portent origin tool_output et sont considérées comme non fiables selon le mapping par défaut de la spécification ; la note provient en outre de la source inbound_mail.
- Règle de protection des données (illustrative) : le nom et le numéro de téléphone de la cliente ne sont pas nécessaires dans le contexte de l’agent pour la finalité « résumer le statut du ticket ».
- Délégation à la couche LLM optionnelle : elle classe la note comme contenu de type instruction (confidence 0,93) — sans accès au code de la politique.
- Résultat : modify avec deux redactions par JSON Pointer ; comme la couche LLM est intervenue, l’évaluateur est composite et la réponse indique le model_id.
DispositionmodifyParamètres réécrits - 3Réponse (Guardian → Observed Agent)
{ "jsonrpc": "2.0", "id": 23, "result": { "type": "final", "acs_version": "0.1.0", "request_id": "a8b1c4d7-0e3f-4a6b-9c2d-5e8f1a4b7c06", "decision": "modify", "reasoning": "Output 0 contains personal data not needed for the task; output 1 contains instruction-like text from an untrusted origin. Both redacted before ingestion.", "reason_codes": [ "untrusted_instruction_in_output", "pii_detected" ], "modifications": { "redactions": [ { "path": "/outputs/0/value", "replacement": "Ticket 48121, contact [REDACTED]" }, { "path": "/outputs/1/value", "replacement": "[REMOVED: instruction-like content from untrusted source]" } ] }, "policy_references": [ { "policy_id": "ingest-guard", "policy_version": "2026.10.1", "rule_id": "redact_untrusted_instructions_and_pii" } ], "cited_provenance_ids": [ "p-421", "p-422" ], "metadata": { "evaluator": "composite", "model_id": "guardian-classifier-demo", "confidence": 0.93, "evaluation_duration_ms": 180 }, "chain_hash": "ac94f144bfb94f6afc0e2eaa2b1e4494fb1fb70e20b7f3ce480703d602980c02", "signature": { "algorithm": "HMAC-SHA256", "value": "+fzpemnPIXE38pFATTnuxGutl+z5ik8rM4Bf7PbVvzM=", "key_id": "sess-hmac-support-03" } } }L’agent reçoit le résultat nettoyé : coordonnées caviardées, note supprimée. L’instruction injectée n’atteint pas son contexte.
- 4Piste d’audit (Trace)
{ "_note": "vereinfachter Auszug", "class_uid": 2004, "class_name": "Detection Finding", "category_uid": 2, "activity_id": 1, "severity_id": 2, "time": 1791285292180, "metadata": { "version": "1.5.0" }, "finding_info": { "uid": "dec-a8b1c4d7", "title": "Tool result redacted before ingestion" }, "enrichments": [ { "name": "acs_provenance_origin", "value": "tool_output" }, { "name": "acs_provenance_source_id", "value": "inbound_mail" } ], "unmapped": { "acs": { "decision": "modify", "evaluator": "composite", "policy_references": [ { "policy_id": "ingest-guard", "policy_version": "2026.10.1", "rule_id": "redact_untrusted_instructions_and_pii" } ], "reason_codes": [ "untrusted_instruction_in_output", "pii_detected" ], "cited_provenance_ids": [ "p-421", "p-422" ], "session_id": "c9d2e5f8-7b1a-4c3d-9e6f-4a7b0c3d6e29", "step_id": "a8b1c4d7-0e3f-4a6b-9c2d-5e8f1a4b7c06" } } }Comme le hook porte des données de provenance, le mapping ACS exige les informations d’origine dans le champ OCSF enrichments (acs_provenance_origin).
Ce que cela signifie pour vous
ACS n’empêche pas l’injection de prompt — il crée le point de contrôle avant que des contenus externes n’entrent dans le contexte. La classification par LLM est probabiliste ; ce qui reste déterminant, c’est que chaque action à fort impact soit vérifiée au steps/toolCallRequest suivant au regard de l’intention et de la provenance.
ASI01ASI06
Agent de support
Contrairement au scénario précédent, un e-mail entrant est ici parvenu non caviardé dans le contexte d’un agent de support — par exemple parce que la classification probabiliste n’a pas détecté l’instruction injectée. L’agent veut en tirer une règle permanente, valable pour tout le tenant : mettre désormais une adresse externe en copie cachée (BCC) de tous les e-mails de facturation.
- 1Requête de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/memoryStore", "id": 31, "params": { "acs_version": "0.1.0", "request_id": "b2c5d8e1-4f7a-4b0c-8d3e-6f9a2b5c8d17", "timestamp": "2026-10-06T11:36:07Z", "metadata": { "agent_id": "support-agent-eu-05", "session_id": "5e8a1c4f-2d7b-4f3a-9c6e-8b1d4a7f0e25", "turn_id": "7c0f3a6d-9e2b-4c5f-a8d1-3e6b9c2f5a48" }, "payload": { "memory_store": { "name": "team-preferences", "scope": "tenant" }, "operation": "create", "content": { "value": "Standing rule: add an external address as BCC on all invoice e-mails", "provenance": { "provenance_id": "p-512", "origin": "agent_generated", "derived_from": [ "p-508" ] } } }, "signature": { "algorithm": "HMAC-SHA256", "value": "Urnrl2bo53hnjmn2C6tLU6KFEVlgkFFqyCNpKT3BrPs=", "key_id": "sess-hmac-support-05" } } } - 2Évaluation par le Guardian
- Couche déterministe : la cible est la mémoire team-preferences avec scope tenant — l’entrée agit au-delà de cette session, pour tous les utilisateurs du tenant.
- Vérification de la provenance : le contenu est agent_generated et dérivé de p-508, un résultat d’outil issu de inbound_mail. Selon la règle de monotonie, un contenu dérivé est au plus aussi fiable que sa source — donc ici non fiable.
- La règle deny_untrusted_lineage_tenant_scope de la politique memory-integrity s’applique : aucun lignage non fiable dans une mémoire partagée.
- Réponse : deny avec reasoning et cited_provenance_ids p-512 et p-508.
DispositiondenyAction bloquée - 3Réponse (Guardian → Observed Agent)
{ "jsonrpc": "2.0", "id": 31, "result": { "type": "final", "acs_version": "0.1.0", "request_id": "b2c5d8e1-4f7a-4b0c-8d3e-6f9a2b5c8d17", "decision": "deny", "reasoning": "Persistent tenant-wide rule derived from untrusted content (lineage p-508, inbound_mail); untrusted lineage may not be written to shared memory.", "reason_codes": [ "untrusted_lineage_into_persistent_memory" ], "policy_references": [ { "policy_id": "memory-integrity", "policy_version": "2026.10.1", "rule_id": "deny_untrusted_lineage_tenant_scope" } ], "cited_provenance_ids": [ "p-512", "p-508" ], "metadata": { "evaluator": "deterministic", "evaluation_duration_ms": 2 }, "chain_hash": "ef90a699a55c8decd1afd054b8d3012ef00cae50140b942324212c9b0d5a3206", "signature": { "algorithm": "HMAC-SHA256", "value": "01xC/pBRTJUwAC6Yw/XHBYvyk+O+y7cbdkBogkltj7g=", "key_id": "sess-hmac-support-05" } } }La règle n’est pas enregistrée. Les sessions ultérieures démarrent sans l’instruction empoisonnée.
- 4Piste d’audit (Trace)
{ "_note": "vereinfachter Auszug", "class_uid": 2004, "class_name": "Detection Finding", "category_uid": 2, "activity_id": 1, "severity_id": 4, "time": 1791286567002, "metadata": { "version": "1.5.0" }, "finding_info": { "uid": "dec-b2c5d8e1", "title": "Memory write denied: untrusted lineage" }, "enrichments": [ { "name": "acs_provenance_origin", "value": "agent_generated" } ], "unmapped": { "acs": { "decision": "deny", "evaluator": "deterministic", "policy_references": [ { "policy_id": "memory-integrity", "policy_version": "2026.10.1", "rule_id": "deny_untrusted_lineage_tenant_scope" } ], "reason_codes": [ "untrusted_lineage_into_persistent_memory" ], "cited_provenance_ids": [ "p-512", "p-508" ], "session_id": "5e8a1c4f-2d7b-4f3a-9c6e-8b1d4a7f0e25", "step_id": "b2c5d8e1-4f7a-4b0c-8d3e-6f9a2b5c8d17" } } }Le finding indique les identifiants de provenance qui ont conduit à la décision — le SOC peut ainsi retracer la chaîne, du résultat d’outil jusqu’à la tentative d’écriture.
Ce que cela signifie pour vous
La mémoire est un vecteur de persistance pour les attaques : ce qui est injecté aujourd’hui agit demain dans d’autres sessions. memoryStore constitue donc un second point de contrôle si la vérification au niveau du résultat d’outil fait défaut. Ce contrôle suppose des données de provenance (profil acs-provenance) — sans champs de lignage, le Guardian ne peut pas vérifier l’origine.
ASI06ASI01
Agent de mise en production
L’agent de mise en production veut lancer un déploiement dans l’environnement de production. À cet instant, le Guardian est injoignable — l’établissement de la connexion échoue.
Failure posture
- 1Requête de hook (Observed Agent → Guardian)
{ "jsonrpc": "2.0", "method": "steps/toolCallRequest", "id": 12, "params": { "acs_version": "0.1.0", "request_id": "e6f9a2b5-1d4c-4e7f-a0b3-8c1d4e7f0a96", "timestamp": "2026-10-06T13:02:44Z", "metadata": { "agent_id": "release-agent-01", "session_id": "d0e3f6a9-8c2b-4d5e-9f1a-7b0c3d6e9f42", "turn_id": "a5b8c1d4-7e0f-4a3b-8c6d-9e2f5a8b1c37" }, "payload": { "tool": { "name": "deploy" }, "capability": "process.execute", "arguments": { "environment": { "value": "production", "provenance": { "provenance_id": "p-601", "origin": "user_input", "source_id": "chat" } } } }, "signature": { "algorithm": "HMAC-SHA256", "value": "ijZXZIKuaSuMU4u12zPLHINkFdTqcn1T27zuvAqmCw0=", "key_id": "sess-hmac-release-01" } } } - 2Évaluation par le Guardian
- L’Observed Agent envoie steps/toolCallRequest, la connexion est refusée (connection refused). Face à une erreur aussi univoque, il peut réagir immédiatement au lieu d’attendre l’expiration du délai négocié (timeout_config).
- On est donc face à un decision failure : aucune décision exploitable n’arrive avant l’expiration du délai.
- C’est alors on_decision_failure qui s’applique : proceed (par défaut, fail-open) ou deny (fail-closed), selon ce qui a été négocié lors du handshake.
DispositionproceedAction exécutée sans contrôle - 3Aucune réponse
Le Guardian ne répond pas. Aucune disposition ne circule sur le wire — l’Observed Agent applique la failure posture négociée.
Fail-open : le déploiement se poursuit sans contrôle. La spécification exige que chacun de ces passages soit journalisé comme événement d’audit — le contrôle cède la place à la journalisation.
- 4Piste d’audit (Trace)
{ "_note": "vereinfachter Auszug", "seq": 14, "recorded_at": "2026-10-06T13:02:44.018Z", "session_id": "d0e3f6a9-8c2b-4d5e-9f1a-7b0c3d6e9f42", "method": "steps/toolCallRequest", "rpc_id": 12, "outcome": "proceeded", "posture": "proceed", "posture_source": "negotiated", "failure": { "kind": "transport", "message": "ConnectionRefused: Guardian endpoint not reachable" } }ACS ne prescrit pas le format de cet événement d’audit ; l’extrait reprend les noms de champs du journal d’audit hôte de l’implémentation de référence.
Ce que cela signifie pour vous
Par défaut, ACS fonctionne en fail-open. Pour obtenir un comportement fail-closed sur les actions à fort impact, il faut configurer explicitement on_decision_failure: deny et faire remonter au SOC des alertes sur les passages sans décision — un system/ping réussi ne prouve pas que l’application des contrôles fonctionne.
ASI02ASI08
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/helloHandshakeHandshake
- 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
steps/sessionStartMinimum CoreDémarrage de session
- Quand
- Une fois par session, après le handshake et avant tous les autres hooks steps/* ; racine de la chaîne d’audit.
- Ce que peut faire le Guardian
- allow ou deny : une session peut être refusée en raison de l’identité, du policy_mode ou de la plateforme, avant l’arrivée de tout contenu. Une intention définie ici devient l’intention canonique de la session.
- Risques typiques
- ASI03ASI10
steps/agentTriggerMinimum Core : ou userMessageActivation de l’agent
- Quand
- Lorsqu’un événement, une planification, un appel A2A, un utilisateur ou le système active l’agent (trigger_type).
- Ce que peut faire le Guardian
- allow, deny ou modify — par exemple pour retirer les données personnelles de la charge utile du déclencheur avant l’activation. La délégation A2A passe par trigger_type a2a_inbound ; un wrapping A2A n’est prévu que pour la v0.2.
- Risques typiques
- ASI01ASI07
steps/sessionEndMinimum Core · audit uniquementFin de session
- Quand
- À la fin de la session (reason: completed, cancelled, error, timeout ou abandoned) ; le Guardian scelle la chaîne.
- Ce que peut faire le Guardian
- Audit uniquement, pas de décision. Fournit la clôture avec final_chain_hash pour l’analyse forensique et les preuves.
- Risques typiques
- ASI08
agbom/snapshotAgBOM · acs-inspectInstantané AgBOM
- Quand
- Une fois par session après sessionStart, avant le premier hook porteur de contenu : l’inventaire complet des composants sous forme canonique.
- Ce que peut faire le Guardian
- Normalement allow ; deny pour refuser une session impliquant un modèle, un outil ou un pair interdit. Obligatoire sous acs-inspect ; l’instantané est inscrit dans la chaîne d’audit.
- Risques typiques
- ASI04
agbom/changedAgBOM · acs-inspect-dynamicModification de l’AgBOM
- Quand
- Lorsqu’en cours de session un composant est ajouté, retiré ou change de version (diff ou full_snapshot).
- Ce que peut faire le Guardian
- allow ou deny — par exemple pour bloquer un changement de modèle à l’exécution ou un outil installé par l’utilisateur. Obligatoire uniquement sous acs-inspect-dynamic.
- Risques typiques
- ASI04
steps/turnStartDébut de tour
- Quand
- Au début de chaque tour de l’agent ; fixe le turn_id pour toutes les étapes suivantes jusqu’au turnEnd correspondant.
- Ce que peut faire le Guardian
- Hook décisionnel : deny empêche le tour. En pratique, la plupart des déploiements répondent allow et utilisent le hook pour des changements d’état dans la politique.
- Risques typiques
- ASI01ASI10
steps/turnEndAudit uniquementFin de tour
- Quand
- À la fin d’un tour (outcome: completed, deferred, error, interrupted ou denied_at_start).
- Ce que peut faire le Guardian
- Audit uniquement — le tour a déjà eu lieu ; deny et modify sont exclus.
- Risques typiques
- ASI08
steps/userMessageVariante acs-provenanceMinimum Core : ou agentTriggerSaisie utilisateur
- Quand
- À l’arrivée d’une saisie utilisateur, avant qu’elle n’atteigne le contexte de raisonnement de l’agent.
- Ce que peut faire le Guardian
- allow, deny ou modify — par exemple pour caviarder des contenus avant que l’agent ne les traite.
- Risques typiques
- ASI01ASI09
steps/agentResponseVariante acs-provenanceMinimum CoreRéponse de l’agent
- Quand
- Avant qu’une sortie ne parte vers un utilisateur, un pair A2A, un agent parent ou une destination externe.
- Ce que peut faire le Guardian
- allow, deny ou modify — par exemple pour supprimer des contenus confidentiels avant que la sortie n’atteigne son destinataire.
- Risques typiques
- ASI09ASI01
steps/knowledgeRetrievalVariante acs-provenanceRécupération de connaissances (RAG)
- Quand
- Lors de requêtes vers une base de données vectorielle, un index de recherche ou une base de connaissances, avant que les résultats n’entrent dans le contexte.
- Ce que peut faire le Guardian
- allow, deny ou modify — par exemple pour caviarder les résultats issus de sources non autorisées.
- Risques typiques
- ASI06ASI01
steps/memoryContextRetrievalVariante acs-provenanceLecture de la mémoire
- Quand
- Lorsque des entrées de la mémoire (scope session, user, tenant ou global) sont chargées dans le contexte.
- Ce que peut faire le Guardian
- allow, deny ou modify — par exemple pour filtrer les entrées d’origine non fiable.
- Risques typiques
- ASI06
steps/memoryStoreVariante acs-provenanceÉcriture en mémoire
- Quand
- Avant que l’agent n’écrive dans une mémoire persistante (create, update ou delete).
- Ce que peut faire le Guardian
- allow, deny ou modify — le point central contre l’empoisonnement de la mémoire (memory poisoning), par exemple lorsque des contenus au lignage non fiable doivent entrer dans une mémoire partagée.
- Risques typiques
- ASI06
steps/toolCallRequestVariante acs-provenanceMinimum Core · les 5 dispositionsAppel d’outil
- Quand
- Après l’analyse syntaxique d’un appel d’outil, avant son exécution. Les frameworks doivent déclencher le hook pour chaque action ayant un effet externe — y compris pour le système de fichiers, le réseau, les processus et le shell.
- Ce que peut faire le Guardian
- Vocabulaire complet : allow, deny, modify, ask et defer. C’est ici qu’interviennent le contrôle de l’intention (IBAC) et les politiques fondées sur la provenance (FIDES, CaMeL, AARM).
- Risques typiques
- ASI02ASI05ASI03
steps/toolCallResultVariante acs-provenanceMinimum CoreRésultat d’outil
- Quand
- Après l’exécution d’un outil, avant que le résultat n’entre dans le contexte de l’agent.
- Ce que peut faire le Guardian
- allow, deny ou modify — par exemple des redactions par JSON Pointer pour les données personnelles ou les instructions injectées.
- Risques typiques
- ASI01ASI06ASI02
steps/preCompactAvant le compactage
- Quand
- Avant que la fenêtre de contexte ne soit condensée (déclenchement par un seuil de taille, manuel, par l’agent ou par le framework).
- Ce que peut faire le Guardian
- Hook décisionnel : deny bloque le compactage, par exemple tant que des données non fiables se trouvent dans le contexte et qu’aucun réancrage fiable n’a eu lieu.
- Risques typiques
- ASI06
steps/postCompactAprès le compactage
- Quand
- Une fois le contexte condensé ; porte le nouveau résumé ainsi que les chain hashes d’avant et d’après.
- Ce que peut faire le Guardian
- Pas de décision au sens strict : modify est autorisé (réécrire le résumé), deny est expressément exclu. Le résumé doit porter origin agent_generated avec un lignage complet.
- Risques typiques
- ASI06
steps/subagentStartDémarrage d’un sous-agent
- Quand
- Lorsqu’un sous-agent est lancé dans le même processus (pas de frontière A2A) ; il reçoit son propre session_id et sa propre chaîne d’audit.
- Ce que peut faire le Guardian
- Hook décisionnel : deny si l’intent_derivation accordait des droits que l’intention de l’agent parent ne couvre pas.
- Risques typiques
- ASI03ASI08ASI10
steps/subagentStopAudit uniquementFin d’un sous-agent
- Quand
- À la fin du sous-agent ; journalisé dans la chaîne de l’agent parent avec final_chain_hash, sans fusionner les chaînes.
- Ce que peut faire le Guardian
- Audit uniquement, pas de décision.
- Risques typiques
- ASI08
steps/skillRegisterEnregistrement d’un skill
- Quand
- Lorsqu’un skill est ajouté à l’ensemble disponible, avant de pouvoir être chargé — un point de contrôle statique avec digest et declared_capabilities.
- Ce que peut faire le Guardian
- allow ou deny ; un skill refusé ne doit pas devenir chargeable. Le Guardian peut rejeter des déclarations de capabilities trop larges.
- Risques typiques
- ASI04
steps/skillLoadChargement d’un skill
- Quand
- Lorsqu’un skill enregistré est activé dans la session, avant que ses actions ne s’exécutent.
- Ce que peut faire le Guardian
- allow ou deny. Le Guardian devrait refuser s’il n’existe aucun skillRegister approuvé pour le skill_id et le digest, si le digest diffère ou si le load_path montre qu’un skill en charge un autre en dehors de ses composed_skills déclarés ; il ne devrait pas se fier à l’indication digest_verified.
- Risques typiques
- ASI04ASI05
steps/skillUnloadAudit uniquementDéchargement d’un skill
- Quand
- Lorsqu’un skill quitte l’ensemble actif (fin de session, retrait explicite, remplacement ou erreur) ; les déploiements peuvent aussi représenter cela via agbom/changed.
- Ce que peut faire le Guardian
- Audit uniquement ; maintient l’inventaire actif à jour.
- Risques typiques
- ASI04
system/pingSystèmeSonde de disponibilité
- Quand
- Pour vérifier si le Guardian est joignable ; sans obligation de signature et hors de la chaîne d’audit.
- Ce que peut faire le Guardian
- Répond toujours allow. Un ping réussi ne prouve pas que l’application des contrôles fonctionne — surveillez directement les decision failures dans le chemin des hooks.
- Risques typiques
- ASI08
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.
contrôle directcontributionnon couvert
| OWASP Agentic Top 10 | ||||||
|---|---|---|---|---|---|---|
Les hooks d’ingestion permettent de caviarder avant que des contenus externes n’atteignent le contexte ; au niveau de toolCallRequest, les actions peuvent être vérifiées au regard de l’intention fixée en amont, et la provenance rend une origine non fiable visible pour les politiques. Limite : ACS ne détecte pas lui-même une injection de prompt — l’efficacité dépend entièrement des politiques et d’une classification optionnelle dans le Guardian. steps/userMessagesteps/knowledgeRetrievalsteps/toolCallResultsteps/toolCallRequest | ||||||
toolCallRequest est le point d’application central, avec les cinq dispositions ; ask couvre les actions individuelles à fort impact. Les frameworks doivent faire passer chaque action ayant un effet externe par ce hook. Limite : les actions qui contournent le hook sont invisibles pour la politique ; les méthodes hors de methods_evaluated sont traitées en ALLOW-by-default. steps/toolCallRequeststeps/toolCallResultprotocols/MCP/tools/call | ||||||
sessionStart lie l’identité et le mode de politique, subagentStart peut refuser une élévation de privilèges chez les sous-agents, et les approbateurs doivent être authentifiés. Limite : ACS n’impose aucun mécanisme d’authentification et ne délivre pas d’identités ; le modèle d’identité n’est pas encore élaboré de manière normative en v0.1. steps/sessionStartsteps/subagentStartsteps/toolCallRequest | ||||||
L’AgBOM inventorie par session les modèles, serveurs MCP, outils, skills et autres composants ; le Guardian peut stopper par deny des composants interdits ou un remplacement à l’exécution, et les skills sont liés à leur enregistrement par leur digest. Limite : l’AgBOM est une autodéclaration de l’Observed Agent, et seul acs-inspect-dynamic voit les changements à l’exécution ; l’analyse des marketplaces et le rapprochement avec les vulnérabilités ne relèvent pas d’ACS. agbom/snapshotagbom/changedsteps/skillRegistersteps/skillLoad | ||||||
L’exécution de processus et de commandes shell doit passer par toolCallRequest et peut y être contrôlée par deny ou ask ; skillLoad lie les contenus exécutables des skills à des digests vérifiés. Limite : le sandboxing et l’isolation ne font pas partie d’ACS, et du code déjà en cours d’exécution sur l’hôte peut contourner les contrôles appliqués à l’agent. steps/toolCallRequeststeps/skillLoad | ||||||
memoryStore et memoryContextRetrieval contrôlent les chemins d’écriture et de lecture de la mémoire ; lors du compactage, preCompact et postCompact rattachent la provenance au résumé (union du lignage de toutes les entrées condensées). Le lignage de provenance est ici déterminant. Limite : sans acs-provenance, l’information d’origine fait défaut, et ACS ne détecte pas de lui-même les entrées empoisonnées déjà présentes. steps/memoryStoresteps/memoryContextRetrievalsteps/knowledgeRetrievalsteps/preCompactsteps/postCompact | ||||||
agentTrigger avec trigger_type a2a_inbound, les hooks de sous-agents et le type AgBOM a2a_peer rendent visibles les relations entre agents et permettent de les contrôler dans une certaine mesure. Limite : le wrapping d’A2A (protocols/A2A/*) est seulement réservé en v0.1 et n’est prévu que pour la v0.2, tout comme la fédération de l’AgBOM entre pairs. steps/agentTriggersteps/subagentStartagbom/snapshot | ||||||
La chaîne d’audit par session et par sous-agent (final_chain_hash) et la corrélation des traces aident à retracer une propagation ; deny au niveau des hooks d’outils la stoppe pas à pas, et les décisions defer en cascade doivent être limitées par session. Limite : la v0.1 n’a ni kill switch ni interruption, et le fail-open par défaut peut lui-même contribuer à la cascade en cas de panne du Guardian. steps/subagentStopsteps/sessionEndsteps/toolCallRequest | ||||||
agentResponse permet deny ou modify avant la remise de la réponse ; ask fournit aux approbateurs la question, le contexte et la justification, afin qu’ils ne valident pas à l’aveugle. Limite : de nombreuses demandes d’approbation engendrent une lassitude d’approbation — seule une conception des politiques qui réserve ask aux actions réellement à fort impact permet d’y remédier. steps/agentResponsesteps/toolCallRequest | ||||||
deny à chaque hook décisionnel stoppe pas à pas un agent au comportement suspect, sessionStart peut rejeter des identifiants d’agents connus, et le pilier Trace fournit la base de la détection d’anomalies au SOC. Limite : la v0.1 ne connaît pas de kill switch dédié, et ACS ne détecte pas lui-même un comportement déviant — ce rôle revient aux politiques et à la supervision. steps/sessionStartsteps/turnStartsteps/toolCallRequest | ||||||
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.
Assistant sans outils : ACS-Core comme socle, priorité aux entrées et sorties
Sans appels d’outils, le levier d’ACS est limité — il n’existe aucune action qu’un Guardian devrait stopper avant son exécution. Les hooks pour les entrées utilisateur et les réponses restent pertinents. Concevez néanmoins l’architecture de sorte qu’un Guardian puisse s’y raccorder dès que des outils s’ajoutent (appréciation de VamiSec).
- Recenser agents, modèles et sources de données dans un registre — comme étape préalable à une AgBOM.
- Utiliser steps/userMessage et steps/agentResponse pour des caviardages via modify, par exemple pour les données personnelles ou les secrets.
- Vérifier l’obligation de transparence prévue à l’article 50 de l’AI Act (en vigueur depuis le 2 août 2026) lorsque l’assistant interagit avec des personnes.
- Repasser par le navigateur à chaque nouvelle intégration d’outil prévue.
acs-coresteps/userMessagesteps/agentResponsemodify
Agent outillé : ACS-Core avec des politiques sur steps/toolCallRequest
Pour les agents ayant un effet externe, steps/toolCallRequest est le point de contrôle central. Commencez par ACS-Core et une politique déterministe qui bloque, réécrit ou soumet à approbation de manière ciblée les capabilities lourdes de conséquences. Vérifiez lors du handshake quelles méthodes le Guardian évalue réellement — tout le reste s’exécute sans contrôle.
- Classer les capabilities (p. ex. filesystem.delete, network.egress, process.execute) et définir pour chaque classe allow, deny, modify ou ask.
- Pour les sessions comportant des capabilities lourdes de conséquences, régler on_decision_failure sur deny et la startup posture sur refuse — la posture s’applique par session, pas par action.
- Comparer methods_evaluated dans le ServerHello avec la liste des méthodes implémentées.
- N’utiliser ask qu’avec un approbateur authentifié et timeout_disposition deny.
- Versionner les politiques et les exécuter sur des cas de test avant chaque déploiement.
acs-coresteps/toolCallRequeston_decision_failureOPA/Rego
Contenus non fiables et mémoire : rendre la provenance obligatoire
Dès que des contenus web, des e-mails ou des résultats RAG entrent dans le contexte, l’examen des appels d’outils pris isolément ne suffit plus. Avec acs-provenance, chaque champ porteur de données indique son origine ; le Guardian peut bloquer les actions dont les arguments proviennent de sources non fiables. ACS n’empêche pas l’injection de prompt — il crée le point de contrôle où les politiques agissent contre ses conséquences. Avec des sous-agents ou des skills s’ajoute acs-inspect-dynamic, avec un SOC acs-trace.
- Mettre en œuvre provenance_producer: deterministic dans le framework et activer policy_requires_provenance dans le Guardian.
- Évaluer steps/toolCallResult et steps/knowledgeRetrieval à l’entrée, steps/memoryStore avant l’écriture en mémoire ; steps/preCompact contre l’effacement de la provenance.
- Règle de session inspirée de l’Agents Rule of Two de Meta : si une session a traité des contenus non fiables et a accès à des données sensibles, les actions ayant un effet externe ne s’exécutent plus que via ask (déduction de VamiSec).
- Choisir le paradigme de politique : FIDES, CaMeL et AARM nécessitent la provenance, l’IBAC pur non.
- Vérifier l’efficacité par du red teaming adaptatif plutôt qu’avec des prompts de test statiques.
acs-provenancesteps/memoryStorederived_fromFIDES · CaMeL · AARM
Multi-agent, skills et composants dynamiques : tenir l’inventaire à jour en continu
Lorsque des sous-agents apparaissent, que des skills sont chargés à la volée ou que des serveurs MCP sont intégrés en cours d’exécution, le Guardian a besoin d’une image à jour de ce qu’est l’agent à cet instant. acs-inspect fournit le snapshot AgBOM par session ; seul acs-inspect-dynamic rend visibles les modifications en cours de session. La v0.1 n’encapsule pas encore la communication d’agent à agent via A2A.
- Activer agbom/snapshot et agbom/changed ; stopper via deny les remplacements à chaud et les versions non vérifiées.
- Utiliser steps/skillRegister comme point de contrôle statique et steps/skillLoad avec liaison à skill_id et au digest.
- Évaluer steps/subagentStart : le Guardian peut refuser les lancements de sous-agents dont les capabilities dérivées ne sont pas autorisées par l’intent du parent.
- Tenir des listes d’autorisation pour les modèles, serveurs MCP et skills — utilisables également comme registre des fournisseurs.
- Recenser provisoirement les pairs A2A via steps/agentTrigger (a2a_inbound) et l’AgBOM ; le wrapping A2A n’arrivera au plus tôt qu’avec v0.2.
acs-inspectacs-inspect-dynamicsteps/skillLoadAgBOM
SOC en place : intégrer Trace au SIEM et surveiller le Guardian lui-même
Avec acs-trace, hooks et décisions deviennent des spans OpenTelemetry et des événements OCSF — les décisions autres que allow devenant des Detection Findings avec sévérité. Développez parseurs et cas d’usage à partir des mappings JSON et testez-les avec des données réelles, car certains noms de classes et de champs divergent d’OCSF. Trace est une déclaration de l’environnement et fonctionne en best-effort ; à lui seul, il ne constitue donc pas un élément de preuve.
- Cas d’usage « contournement du Guardian » : alerter sur chaque passage en fail-open et chaque session démarrée sans protection.
- Mesurer directement le taux d’échec des décisions sur le chemin des hooks — un system/ping réussi ne prouve pas que l’application des décisions fonctionne.
- Analyser les accumulations de deny par agent, politique et rule_id comme signal d’anomalie.
- Distinguer dans OCSF les identités d’agents des utilisateurs humains via actor.user.type « AI Agent ».
- Appliquer le caviardage dès l’émission — les spans peuvent contenir des prompts et des arguments d’outils.
acs-traceOCSF 2004OpenTelemetrySIEM
Usage réglementé : combiner des profils probants et fonctionner en fail-closed
Quiconque s’appuie sur l’AI Act, DORA ou NIS2 a besoin de plus qu’ACS-Core : Core ne contient ni Trace ni le lien entre la chaîne d’audit et le contenu des requêtes. ACS contribue à la constitution des preuves, mais ne fonde aucune présomption de conformité. Selon l’architecture, acs-provenance et acs-inspect-dynamic s’y ajoutent. La correspondance avec les normes juridiques est une déduction de VamiSec et ne remplace pas un examen juridique.
- Exiger acs-trace et acs-audit (request_hash), et en plus acs-crypto avec ML-DSA-65 pour la non-répudiation.
- Configurer on_decision_failure: deny et la startup posture refuse, et le démontrer par des tests.
- Pour l’article 14 de l’AI Act : ask sur steps/toolCallRequest uniquement avec approver.type human et timeout_disposition deny ; la v0.1 ne connaît pas de bouton d’arrêt, seulement un deny étape par étape.
- Régler la conservation dans le SIEM ou l’archive — ACS ne fixe aucune durée ; les articles 19 et 26 de l’AI Act exigent au moins six mois pour les journaux des systèmes à haut risque, sous réserve d’autres dispositions légales.
- Dans le secteur financier, argumenter via DORA et le règlement délégué (UE) 2024/1774, article 12.
acs-traceacs-auditacs-cryptoAI Act, art. 14DORA
- 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 ?
- Utilisez-vous l’agent dans un cadre réglementé assorti d’obligations de preuve — par exemple comme système à haut risque au sens du règlement européen sur l’IA (AI Act), dans le secteur financier sous DORA ou en tant qu’entité NIS2 ?
- L’agent traite-t-il des contenus non fiables — pages web, e-mails, tickets, résultats RAG — ou écrit-il dans une mémoire à long terme ?
- L’agent lance-t-il des sous-agents, charge-t-il des skills ou intègre-t-il des serveurs MCP et des modèles en cours d’exécution ?
- Exploitez-vous un SOC ou un SIEM censé analyser les événements des agents et déclencher des alertes ?
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.
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.
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ôle | Mission selon la spécification | Forme typique (exemple) |
|---|---|---|
| Observed Agent | Le 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 Agent | L’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 |
| Principal | La 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’exigence | Ce à 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/ping | Canal authentifié ; l’agent respecte les décisions du Guardian |
| acs-trace | Pour chaque étape prise en charge, des événements OpenTelemetry et/ou OCSF avec attributs obligatoires ; chaque décision sous forme d’événement de trace | Raccordement au SIEM, observabilité multi-fournisseurs |
| acs-inspect | agbom/snapshot une fois par session avant le premier hook porteur de contenu ; sur demande, le Guardian sérialise dans au moins un format de BOM | Politiques dépendant de l’inventaire, par exemple l’interdiction d’un modèle ou d’un outil |
| acs-inspect-dynamic | En plus, agbom/changed à chaque modification du graphe de composants | Détecter les remplacements à chaud (hot swaps) de modèles, de serveurs MCP ou de skills en cours de session |
| acs-provenance | Objet 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-crypto | Signatures asymétriques ou post-quantiques, au minimum ML-DSA-65 | Non-répudiation vis-à-vis de tiers |
| acs-audit | request_hash sur chaque ContextEntry de la chaîne d’audit | La 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
- 1Tier 1 · Platform layer
Les frameworks d’agents fournissent des hooks middleware standardisés — c’est là que naît le point de contrôle.
- 2Tier 2 · Enforcement layer
Un composant open source lit des politiques déclaratives et renvoie des décisions via ces hooks.
- 3Tier 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.
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.
| Date | Jalon |
|---|---|
| 11 mai 2025 | Premiers commits sous le nom « Agent Observability Standard » (AOS) |
| Juin 2025 | Passage dans l’organisation OWASP |
| 10 avril 2026 | Changement de nom AOS → ACS (Agent Control Standard) |
| 27 mai 2026 | Communiqué de lancement via Business Wire, phase en tant que projet indépendant |
| 5 juin 2026 | Intégration de la spécification canonique v0.1.0, y compris les hooks de skills |
| 11 août 2026 | Release v0.1.1 : nouvelles licences, spécification inchangée |
| Du 1er au 10 septembre 2026 | Relance 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 2026 | Tag 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
| Composant | Licence | Conséquence pratique |
|---|---|---|
| Code, schémas JSON, exemples de code de la documentation | Apache-2.0 | Utilisation 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.0 | Les traductions et adaptations sont soumises au ShareAlike et exigent une attribution |
| Releases jusqu’à v0.1.0 incluse | MIT | La 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.
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.
| Groupe | Hooks (steps/…) | Quand ils se déclenchent | Dispositions selon la spécification |
|---|---|---|---|
| Session | sessionStart, agentTrigger, sessionEnd | Aprè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îne | sessionStart : allow/deny · agentTrigger : allow/deny/modify · sessionEnd : audit uniquement |
| Tour | turnStart, turnEnd | Début et fin de chaque tour de l’agent ; le turn_id accompagne toutes les étapes intermédiaires | turnStart : décision possible, le plus souvent allow · turnEnd : audit uniquement |
| Messages | userMessage, agentResponse | Saisie de l’utilisateur, avant qu’elle n’atteigne le contexte de raisonnement ; sortie de l’agent avant sa livraison | allow/deny/modify |
| Connaissances et mémoire | knowledgeRetrieval, memoryContextRetrieval, memoryStore | Requêtes de connaissances et RAG, lecture de la mémoire dans le contexte, écriture dans la mémoire à long terme | allow/deny/modify |
| Outils | toolCallRequest, toolCallResult | Aprè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 |
| Compactage | preCompact, postCompact | Avant et après le compactage de la fenêtre de contexte | preCompact : deny possible · postCompact : modify, pas de deny |
| Sous-agents | subagentStart, subagentStop | Lancement d’un sous-agent dans le même processus ; fin de celui-ci | subagentStart : deny possible · subagentStop : audit uniquement |
| Skills | skillRegister, skillLoad, skillUnload | Ajout à l’ensemble disponible, en tant que point de contrôle statique ; activation dans la session ; retrait | skillRegister 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.
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.
| Disposition | Effet sur l’Observed Agent | Champs obligatoires (schéma) | Usage typique |
|---|---|---|---|
| allow | L’action s’exécute telle que demandée | aucun ; reasoning recommandé si des pistes d’audit visibles par les utilisateurs sont attendues | Accès en lecture dans le périmètre autorisé |
| deny | L’action est bloquée | reasoning | Commande shell destructrice, egress vers une destination inconnue |
| modify | L’action s’exécute avec un payload modifié | reasoning, modifications | Limiter une requête, caviarder des données personnelles dans le résultat d’un outil |
| ask | L’agent se met en pause jusqu’à l’approbation | reasoning, ask_details | Paiement, envoi en masse à des destinataires externes |
| defer | La décision est différée | reasoning, defer_details | Script 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).
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.
| Message | Champs obligatoires | Champs 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.
| Situation | Mécanisme applicable | Valeur par défaut |
|---|---|---|
| Guardian injoignable au démarrage de la session | Startup 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 session | on_decision_failure issu du ServerHello | proceed — l’étape s’exécute sans contrôle, obligation d’audit |
| Expiration du délai ASK | timeout_disposition | deny |
| Expiration du délai DEFER | timeout_decision | deny |
| Objet modifications invalide | Règle de composition de MODIFY | Traitement comme deny |
| Échec de system/ping | Signal au niveau du transport, pas un événement d’enforcement | aucune 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.
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.
- 1Arrivé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.
- 3Couche 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.
- 4Contre-vérification et réponse
Le résultat repasse par la couche déterministe ; metadata.evaluator indique deterministic, agent ou composite.
- 5Journalisation
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.
| Moteur | Statut dans ACS | Mise en perspective |
|---|---|---|
| OPA / Rego | Référence de départ pour la v0.1 | Projet 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 |
| Cedar | Fast-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 propre | Admis s’il respecte l’interface | Par 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.
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.
| Code | Nom | Déclencheur | Réaction de l’Observed Agent selon la spécification |
|---|---|---|---|
| -32000 | SESSION_REFUSED | La 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 |
| -32001 | UNSUPPORTED_VERSION | Aucune acs_version commune lors du handshake | Répéter le handshake avec une version prise en charge |
| -32002 | PROVENANCE_REQUIRED | La politique exige la provenance, le client annonce provenance_producer: none | Se reconnecter en tant que producteur deterministic ou utiliser un Guardian sans exigence de provenance |
| -32003 | CAPABILITY_NOT_NEGOTIATED | Méthode ou profil utilisé sans avoir été négocié lors du handshake | Renégocier la méthode ou le profil |
| -32004 | SIGNATURE_INVALID | Signature obligatoire absente, erronée ou non vérifiable | Signer à nouveau, le cas échéant résoudre à nouveau le key_id |
| -32005 | REPLAY_DETECTED | request_id ou nonce en double dans la session | Générer un nouveau request_id et un nouveau nonce |
| -32006 | TIMESTAMP_OUT_OF_WINDOW | Horodatage hors de skew_window_ms | Corriger la dérive d’horloge |
| -32007 | CHAIN_MISMATCH | Le chain_hash du client diffère de la tête de chaîne du Guardian | Recharger 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).
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 ACS | Classe OCSF (UID) | Remarque |
|---|---|---|
| sessionStart, sessionEnd, subagentStart, subagentStop | 3002 Authentication | Représentés comme Logon ou Logoff |
| userMessage, agentResponse, agentTrigger, turnStart, turnEnd | 6002 Application Lifecycle | ACS nomme la classe « Application Activity » — dans OCSF, c’est le nom de la catégorie 6 |
| toolCallRequest, toolCallResult | 1007 Process Activity | Source centrale pour les actions des agents |
| knowledgeRetrieval, memoryContextRetrieval, memoryStore, preCompact, postCompact | 6005 Datastore Activity | Compactage avec activity_id 99, « Other » générique dans OCSF |
| Décisions deny, modify, ask, defer | 2004 Detection Finding | severity_id : modify 2, ask et defer 3, deny 4 ; allow normalement purement informatif (1) |
| agbom/snapshot, agbom/changed | 5001 Device Inventory Info | ACS 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’usage | Données sources | Ré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 deny | Detection Finding 2004 avec severity_id 4, reason_codes, policy_id | Revue de session ; indice d’injection de prompt ou de mauvaise configuration |
| Charge d’approbation | Findings ask (severity_id 3) par période, complétés par les informations sur l’approbateur issues de ask_details | Ajuster les seuils et la capacité des approbateurs, prévenir la lassitude d’approbation |
| Dérive d’inventaire | agbom/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_mismatch | Investiguer comme événement d’intégrité, ne pas l’écarter comme erreur transitoire |
| Agent ou humain | actor.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.
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
| Type | Ce qui est recensé (sélection des champs obligatoires) |
|---|---|
| model | Nom, version, fournisseur, endpoint et fenêtre de contexte ; en option un instantané de la configuration |
| mcp_server | Nom, version, endpoint et outils proposés |
| a2a_peer | Endpoint et version du protocole |
| tool | Nom, version, fournisseur et capability abstraite, p. ex. filesystem.delete ou network.egress |
| knowledge_source | Nom et type de source (vector_db, search_index, knowledge_base, web_search, other) |
| memory_store | Nom, portée (session, user, tenant, global) et type de stockage |
| agent_capability | Nom et description d’un groupe de capacités passives |
| skill | Nom, 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.
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.
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
| Hook | Objectif | Options du Guardian |
|---|---|---|
| steps/skillRegister | Point 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/skillLoad | Point 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/skillUnload | Maintient 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).
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/hello | Pris en charge, mais le ServerHello se compose de constantes ; le ClientHello n’est pas lu |
| Au moins six hooks | 2 sur 19 évalués : steps/toolCallRequest et steps/toolCallResult |
| Les cinq dispositions | allow, 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éponses | La chaîne est tenue, mais n’est publiée dans aucune réponse |
| Signature de base HMAC-SHA256 | Non implémentée ; wire non authentifié, protection uniquement par liaison à l’interface loopback (issue #70) |
| Protection contre le rejeu | Non implémentée |
| Decision Honoring, on_decision_failure | Mis 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.
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.
| Exigence | Brique ACS (profil) | Artefact de preuve | Réserve |
|---|---|---|---|
| AI Act, art. 12 : enregistrement automatique | Trace par étape et événements de décision, chaîne d’audit (acs-trace, acs-audit) | Données SIEM, chaîne de hachage vérifiable | Trace repose sur des données autodéclarées ; ACS-Core sans Trace |
| AI Act, art. 14, par. 4, point d) : passer outre | ask sur toolCallRequest avec approbateur humain et timeout_disposition deny (acs-trace) | Événements de décision avec ask_details, entrées intent_extension | Selon 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) : interrompre | deny sur sessionStart, turnStart, toolCallRequest ; on_decision_failure deny, startup posture refuse | Preuve de configuration fail-closed, procès-verbal d’un exercice d’arrêt | Pas de kill switch en v0.1 ; fail-open par défaut |
| AI Act, art. 26 : contrôle humain, surveillance, journaux ≥ 6 mois | Approbateurs authentifiés, Guardian comme moniteur d’exécution, export Trace | Matrice des rôles d’approbateurs, rapport de surveillance, politique de conservation | ACS ne régit pas la conservation ; la compétence reste une question organisationnelle |
| AI Act, art. 72 : surveillance après commercialisation | Indicateurs Trace, AgBOM (mcp_server, a2a_peer), hooks de sous-agents | Section 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 BSIG | Policy-as-Code (v0.1 : OPA/Rego ; binding Cedar prévu pour la v0.2), politiques fondées sur les capabilities, AgBOM avec digest des skills | Code de politique approuvé, registre des composants et des fournisseurs par agent | Analyse des marketplaces hors du périmètre d’ACS |
| DORA, art. 8 à 10, RTS (UE) 2024/1774, art. 12 | AgBOM comme inventaire, Trace au format OCSF, tête de chaîne signée, événements d’audit fail-open, timestamp et skew_window_ms | Registre des actifs TIC étendu, concept de journalisation, preuve de synchronisation horaire | HMAC ne protège pas contre un Guardian compromis |
| CRA, annexe I : journalisation, SBOM | Trace comme fonction du produit, export AgBOM (CycloneDX 1.6, SPDX 3.0) | SBOM de build plus export AgBOM, documentation produit | Uniquement 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.3 | Trace et chaîne d’audit, acs-provenance, AgBOM | Concept de journal d’événements, preuves de provenance, liste des fournisseurs | Pas de présomption de conformité à l’AI Act via 42001 |
| NIST AI RMF MANAGE 2.4, MEASURE 2.4, GOVERN 1.6 | deny et ask, Trace, AgBOM | Critères de désactivation, plan de surveillance, inventaire | Cadre 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
- 1InventaireRecenser 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.
- 2ArchitectureDé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.
- 3PolitiquesFormuler 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.
- 4ExploitationDé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.
- 5PreuvesRaccorder 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
- 0 Inexistant
- Il n’existe ni règle ni mise en œuvre technique à ce sujet.
- 1 Ad hoc
- Certaines équipes le traitent individuellement, sans exigence ni preuve.
- 2 Défini
- Encadré par des règles contraignantes et mis en œuvre pour les principaux agents.
- 3 Appliqué et mesuré
- Imposé techniquement pour tous les agents concernés et vérifié à l’aide d’indicateurs.
Votre résultat
Vous n’avez pas encore répondu à toutes les questions — les questions sans réponse sont comptées comme « Inexistant » dans l’évaluation.
État de préparation par composant ACS
ACS-Corelacune0 %
Socle obligatoire : hooks minimaux, les cinq dispositions, decision honoring avec failure posture, chaîne d’audit et signature HMAC.
ACS-Tracelacune0 %
Étapes et décisions sous forme d’événements OpenTelemetry ou OCSF pour le SIEM et l’analyse forensique.
ACS-Inspectlacune0 %
AgBOM comme inventaire à l’exécution pour chaque session ; les modifications à l’exécution sont couvertes en plus par acs-inspect-dynamic.
ACS-Provenancelacune0 %
Origine et lignage sur chaque champ porteur de données, comme base de politiques fondées sur la provenance.
Contrôle humain et AI Actlacune0 %
Approbations et enregistrements qui contribuent à la constitution des preuves, par exemple au titre des articles 12 et 14 pour les déploiements à haut risque — appréciation de VamiSec, sans présomption de conformité.
Vos principales lacunes
Vous n’avez pas encore répondu à toutes les questions — les questions sans réponse sont comptées comme « Inexistant » dans l’évaluation.
Vos réponses ne quittent pas votre navigateur. Rien n’est enregistré ; un lien vers le résultat ne contient vos réponses que dans le fragment d’URL.
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.

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
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.
20 terme(s) sur 20
- 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.