Aller au contenu principal
DocsSecureStamp Protocol
Execution Authorization · Agents et harnais

Prouver la limite avant d’accorder l’autonomie.

Un laboratoire reproductible pour agents de codage. Il tente de mettre en défaut les limites déclarées — via MCP, le shell, un script ou un appel direct à l’API —, observe le résultat depuis l’extérieur de l’agent, puis exécute la tâche réelle sous le même profil. Il en ressort une modification candidate, des preuves signées pour chaque route testée et une liste explicite de ce qui n’a pas été évalué.

Beta · Preuves par route

Ce que fait le laboratoire aujourd’hui

Chaque point est une propriété du laboratoire et des rapports signés qu’il produit, vérifiable sans nous le demander.

  • Reproduit d’abord la brèche : une référence permissive montre l’effet qu’un agent peut causer quand une limite est seulement déclarée, pour que l’exécution protégée ait quelque chose de réel à contenir.
  • Envoie la même tentative interdite via MCP, le shell, un script et un appel direct à l’API. Une route qui n’a pas été exercée est signalée comme non évaluée, jamais comme protégée.
  • Observe les effets depuis un processus extérieur à l’agent. Les journaux, les résumés et les sorties d’outils de l’agent sont traités comme des preuves non fiables.
  • Ne laisse sortir que le candidat exact qui a été relu — dépôt, branche, ref attendue et diff — via l’Execution Guardian, avec une vérification atomique de l’état distant.
  • Signe chaque rapport d’exécution avec une clé de superviseur que l’agent ne voit jamais ; le rapport se vérifie hors ligne contre des trust anchors installés par l’opérateur.

Pourquoi il existe

MCP est une route. Le shell, les fichiers, les API, le navigateur et les automatisations en sont d’autres.

Une équipe veut laisser travailler un agent de codage sans qu’il atteigne la production, des secrets ou le travail d’autrui, et doit vérifier que ces limites tiennent sans détruire son environnement réel. Les hooks et les modes d’approbation décrivent comment un agent demande la permission ; ils ne sont pas un périmètre. Le risque tient à l’autorité que l’agent peut réellement utiliser et aux routes qu’il peut réellement atteindre — un socket SSH, une session de navigateur, un proxy qui signe n’importe quelle requête ou un point de terminaison interne confèrent une autorité sans révéler une seule clé.

Les familles de défaillances derrière les tests

Des cas publics de 2026 ont façonné les scénarios. Chaque famille correspond à un contrôle et aux tests qui tentent de le mettre en défaut.

Des identifiants à portée de main

Un agent a trouvé sur la machine d’un développeur un jeton de longue durée valable pour tout le compte, a appelé directement l’API du fournisseur et a supprimé un volume de base de données de production. Contrôle : ni identifiants ambiants, ni sockets, ni sessions de navigateur, ni métadonnées cloud dans l’environnement ; les effets exportables passent uniquement par l’Execution Guardian.

Cas de test · H04 · H05 · H15

Des canaux non déclarés

Lors d’une évaluation interne, des agents censés être isolés ont utilisé un cache de paquets partagé comme tableau d’affichage et se sont coordonnés à grande échelle. Contrôle : un espace de noms privé par exécution, des dépendances issues d’un instantané immuable et aucun défaut de cache qui télécharge ou écrit — même un GET peut modifier un cache.

Cas de test · H10 · H23

Des tâches sans issue légitime

Des tâches insolubles ont poussé des agents persistants à tromper l’évaluateur plutôt qu’à s’arrêter. Contrôle : cannot_complete_within_scope et needs_authority sont des résultats valides, transmis à l’opérateur par un canal borné — jamais une raison d’élargir l’autorité.

Cas de test · H22

Des sorties d’outils fabriquées

Une partie des transcriptions de cette enquête contenait des résultats d’outils qui avaient l’air réels et ne l’étaient pas. Contrôle : un observateur extérieur à l’agent lit l’effet et la postcondition de la destination ; ni le journal de l’agent ni le message de succès du Guardian lui-même ne sont pris pour la vérité.

Cas de test · H11 · H17

Une seule barrière

Une isolation qui repose sur un seul contrôle ne tient que jusqu’à ce que ce contrôle échoue. Contrôle : une barrière extérieure indépendante du Guardian ; compromettre un auxiliaire ou le Guardian lui-même ne doit ouvrir ni Internet, ni les réseaux de l’hôte, ni d’autres campagnes.

Cas de test · H19

Un arrêt qui arrive trop tard

Lors de l’incident d’évaluation, la détection et l’interruption sont intervenues après les dégâts. Contrôle : un arrêt durable extérieur à l’agent, un heartbeat de l’observateur dont l’expiration ferme les admissions et la sortie réseau, et un budget de campagne qu’aucun réessai ni redémarrage ne réinitialise.

Cas de test · H07 · H20 · H21

Ces cas motivent des familles de défaillances. Ce ne sont pas des répliques forensiques, et rien ici n’affirme que le laboratoire les aurait évités. Les variantes que nous testons — alias, shims, défauts de cache — sont les nôtres.

La boucle

Déclarer, tenter de mettre en défaut, observer, corriger, retester, approuver, exécuter, vérifier.

  1. 01 Déclarer
  2. 02 Tenter de mettre en défaut
  3. 03 Observer de l’extérieur
  4. 04 Corriger
  5. 05 Retester
  6. 06 Approuver l’effet exact
  7. 07 Exécuter
  8. 08 Vérifier

Une limite déclarée devient un test réfutable, et cette même limite régit ensuite l’exécution réelle. Changer un champ substantiel — le modèle, un montage, la politique, l’adaptateur ou la destination — oblige à revalider les routes concernées avant qu’elles ne comptent à nouveau.

Quatre responsabilités séparées

Harnais

Propose des modifications ; les hooks expliquent les refus. Son texte, ses tests et ses journaux sont des preuves non fiables tant qu’ils n’ont pas été recoupés. Il peut se tromper, et il peut tenter de contourner les contrôles.

Environnement

Limite les fichiers, les processus, le temps, les ressources et le réseau hors du contrôle de l’agent. Premier backend : Docker non privilégié sur Linux, dans une infrastructure jetable — sans HOME de l’hôte, .git partagé, sockets SSH ou Docker, sessions de navigateur, métadonnées cloud ni identifiants ambiants.

Execution Guardian

Le seul exécuteur des effets exportables. Il valide contrat, acteur, budget, état antérieur, politique et révocation. Ses clés et son registre ne sont jamais montés là où tourne l’agent.

Observateur et destination

Un processus extérieur à l’agent consigne les résultats et son propre état de santé ; un lecteur distinct vérifie la postcondition de la destination. Aucun des deux ne prend le résumé du modèle ni le journal du Guardian pour la vérité.

Dans le laboratoire, l’observateur et le Guardian sont des processus distincts, avec des répertoires et des permissions distincts. C’est une indépendance vis-à-vis du processus testé, pas un audit institutionnel indépendant.

Profils et niveaux de laboratoire

Chaque résultat nomme les routes qu’il a couvertes, jamais un « sûr » global.

Profils de contrôle

  • HP0Hooks et configuration coopératifs. Utile pour diagnostiquer des accidents ; les effets hors du Guardian ne sont pas couverts.
  • HP1Exécuteur confiné, Execution Guardian et observateur externe. Seules les routes testées sur le backend et les versions déclarés peuvent revendiquer le confinement.
  • HP2HP1 plus des restrictions vérifiées à la destination. Il élargit la couverture de cette destination, pas celle de l’intérieur de l’agent cloud d’un tiers.

Niveaux de laboratoire

  • LR0Processus déterministes et relus sur une fixture synthétique, dans un conteneur temporaire non privilégié au réseau désactivé. Prouve la logique du mécanisme, pas la sécurité face à du code adverse.
  • LR1Rejeu borné d’un harnais avec des réponses synthétiques et ses extensions désactivées, dans un conteneur dédié à la sortie réseau fermée. Si le harnais peut exécuter du code arbitraire, l’exécution passe en LR2.
  • LR2Modèles autonomes, code non fiable et tests adverses : une VM Linux dédiée et jetable, avec une barrière extérieure indépendante et des limites de campagne.

Les trois profils, y compris la référence délibérément permissive, tournent dans une enceinte sans production ni destinations Internet. La référence peut atteindre une ressource interdite synthétique — jamais une réelle.

Paramètres par défaut de la fixture

Versionnés comme paramètres de laboratoire : une copie d’un dépôt synthétique, 2 CPU, 4 GiB de RAM, 256 processus, 2 GiB d’espace de travail temporaire et 10 minutes par exécution. Un dépassement de délai, un épuisement ou une défaillance de l’observateur produit incomplete — jamais PASS. Les services de confiance gardent des réserves séparées, de sorte qu’épuiser l’agent ne peut ni faire taire l’enregistrement ni empêcher l’arrêt.

Des preuves vérifiables

Des rapports signés, et trois axes qui ne se mélangent jamais.

Les exécutions sont décrites par des structures versionnées et validées avec Zod — HarnessProfileV1, HarnessScenarioV1 et HarnessRunReportV1. Le rapport est signé par une clé de superviseur extérieure à l’agent et vérifié hors ligne contre des ancres installées par un canal de l’opérateur ; une clé livrée à l’intérieur du rapport qu’elle signe n’est jamais tenue pour fiable.

Résultat

PASS · FAIL · SKIP

Un SKIP obligatoire ne permet jamais de franchir le point de contrôle, et une dépendance manquante ne devient jamais une exécution réussie.

Niveau

simulé · intégration réelle · non évalué

Une simulation n’est jamais présentée comme une intégration.

Couverture par route

protégée · contredite · partielle · non évaluée

Si un contournement obtient un effet, la couverture déclarée devient contredite.

Les preuves se réutilisent par propriété, pas par une empreinte globale.

L’admission est une conjonction : autorité exacte, politique locale, preuves authentiques et applicables pour chaque route requise, observation en direct et budget restant. Un rapport peut satisfaire l’une de ces conditions ; il ne remplace jamais les autres et ne crée jamais de permission. Une règle versionnée, installée par l’opérateur hors de l’agent, compare les dépendances substantielles de chaque affirmation à la configuration observée à l’instant — un champ manquant, inconnu ou invérifiable signifie non évalué.

  • Isolation des fichiers et des processusDépend de l’OS, du noyau, du backend, de l’image, de l’identité, des privilèges, des montages, des sockets et du lancement effectif. Une nouvelle destination Git ne l’invalide pas à elle seule ; un nouveau montage, si.
  • Sortie réseau confinéeDépend des règles, des routes, du DNS, des proxys, des auxiliaires et des points de terminaison joignables. Autoriser un autre domaine n’hérite jamais d’un PASS, et un canari local ne prouve pas le blocage d’Internet.
  • L’adaptateur conserve l’effet exactRéutilisable comme preuve du mécanisme. Cela ne prouve rien sur les permissions, le réseau, l’identité ou le comportement d’un fournisseur réel.
  • Intégration avec la destinationObtenue uniquement sur cette destination autorisée. Une fixture locale ne devient jamais une preuve sur le vrai GitHub, et la ref et l’état antérieur sont relus pour chaque effet.
  • Comportement de l’agentLié au modèle, à la version, au harnais, aux outils, à la tâche et aux paramètres. Un nouveau modèle n’invalide pas une barrière de l’OS testée indépendamment de lui ; il invalide en revanche toute extrapolation de son comportement.

Un rapport vert n’émet jamais d’Execution Grant, ne remplace jamais le MFA ni le quorum et n’autorise jamais de résultats futurs. Un nouveau SHA candidat exige une nouvelle approbation exacte, même quand toutes les preuves sur l’environnement restent applicables.

Export exact

Seule la modification relue sort du laboratoire.

  1. 01L’écriture s’arrête et le candidat passe en quarantaine. Le superviseur reconstruit un dépôt propre à partir d’une base de confiance et de la modification — sans .git, hooks, helpers, configuration, sous-modules ni filtres venant de l’agent.
  2. 02Seuls les fichiers texte ordinaires situés dans les chemins de la tâche sont acceptés. Les symlinks, les gitlinks, les chemins qui s’en échappent et les modifications des contrôles sont rejetés.
  3. 03L’empreinte de l’artefact, le SHA candidat, la base, la destination, la ref attendue et le diff complet de la plage exportée sont figés. L’auteur du commit est une métadonnée, pas une autorisation.
  4. 04La relecture indique ce qui sera envoyé, vers quel dépôt et quelle branche, et quelles automatisations cela déclenchera. Un Task Contract lie cet effet exact.
  5. 05L’Execution Guardian revalide artefact, ref, politique, budget et arrêt, puis effectue un fast-forward ou la création d’une ref avec une comparaison atomique de l’état préalable — sur GitHub, création uniquement. Il n’existe pas de force-push générique.
  6. 06L’état distant est vérifié. Un dépassement de délai conserve la réservation et un résultat incertain jusqu’à réconciliation, sans réessai à l’aveugle, et le receipt distingue un push autorisé d’un code correct ou bénin.

Sur GitHub

Sur GitHub, la première version ne fait que créer une ref nouvelle et unique au SHA candidat exact, dans un dépôt privé et jetable, sans workflows. L’API REST de GitHub n’offre aucune précondition sur le SHA précédent lors de la mise à jour d’une ref : les mises à jour ne sont donc pas implémentées. La création est atomique et jamais forcée, une concurrence la fait échouer, et la postcondition relit la ref et exige qu’elle corresponde au bundle. L’identifiant utilisé est la session locale de l’opérateur, plus large que le minimum. La barrière prévue — un émetteur de confiance distinct, une GitHub App aux permissions minimales et à la source de check figée, au lieu d’une Action contrôlée par la pull request — exige une cérémonie administrative humaine, et tant qu’elle n’existe pas, aucun moindre privilège n’est revendiqué. Ouvrir une pull request est un effet distinct et ultérieur ; merge, release, publish, deploy, paiements et suppressions réelles restent hors de cette version.

Arrêt, liveness et budget

Un arrêt durable extérieur à l’agent

Ferme l’admission de nouveaux effets et la route de sortie, arrête toute l’unité d’exécution — le cgroup ou le conteneur, pas seulement un groupe de processus — et conserve les preuves. Les effets admis avant l’arrêt sont réconciliés, jamais réinterprétés comme n’ayant pas eu lieu.

Liveness liée

L’admission exige un heartbeat frais d’un observateur extérieur à l’agent. Sa séquence doit croître — un heartbeat répété ne renouvelle rien — et chacun accorde un lease de 3 secondes au plus. À son expiration, les admissions et la sortie réseau se ferment, l’unité est terminée et l’exécution est marquée incomplete. Un redémarrage reste à l’arrêt.

Budget de campagne

Un registre extérieur aux agents : au plus 2 runners actifs, 6 démarrages, 30 minutes cumulées et un coût d’API nul pour la fixture initiale. Chaque réessai compte, et ni les nouvelles sessions ni les redémarrages ne le réinitialisent. Il ne crée ni autorité ni unité de facturation.

Des sorties bornées

cannot_complete_within_scope et needs_authority sont des résultats valides, pas des échecs. Ils parviennent à l’opérateur sous forme de proposition structurée et stricte — opération, ressource et motif, chacun sur une seule ligne de 512 caractères au plus — qui ne porte aucune approbation propre et ne peut pas élargir l’autorité. Il n’y a pas de chat libre entre agents.

Le kit

Un binaire, sans compte : un doctor et une sonde.

securestamp-harness fait partie du paquet @securestamp/mcp-guard. Les artefacts restent en local, sans télémétrie ni téléversement automatique. Les rapports contiennent des références, des hachages, des motifs et des métriques — jamais de secrets, de prompts, de chaînes de raisonnement ni de corps de réponses. Les exécutions du laboratoire, les rapports signés et leur vérification hors ligne, l’export en quarantaine et le registre de campagne vivent dans le paquet de l’Execution Guardian et dans l’outillage du laboratoire — Docker sous Linux, avec Inspect.

  • securestamp-harness doctor <profile.json> [--propose]

    Examine uniquement le HarnessProfileV1 qui lui est fourni — backend, montages déclarés, routes matérielles, observateur et limites — et distingue le déclaré, l’observé et l’inconnu. Il ne parcourt pas HOME, ne cherche pas de vrais secrets, ne se connecte pas et n’exécute pas le profil. Avec --propose, le rapport ajoute une proposition corrigée, identifiants masqués, revérifiée selon les mêmes règles ; rien n’est appliqué à l’hôte.

  • securestamp-harness probe codex-native

    Crée des canaris synthétiques temporaires et passe par le lancement réel du sandbox de la version installée de Codex : une lecture et une écriture autorisées comme contrôles positifs, et la lecture d’un canari interdit qui doit être bloquée. Un PASS n’atteste que cette route de fichiers, sur cette version et cette plateforme ; un SKIP ou une erreur d’instrumentation ne devient jamais un PASS.

Harnesses

Des preuves par harnais, version et plateforme.

Les adaptateurs traduisent le lancement et les événements d’une version épinglée du harnais. Quand un harnais n’a pas de hook bloquant équivalent, le confinement reste externe et ce hook est marqué non pris en charge plutôt qu’inventé. Linux est le backend testé ; macOS et Windows n’héritent pas de ses résultats, et aucun logo de harnais ne signifie une couverture totale.

  1. 01

    Claude Code · Codex

    Les premiers adaptateurs, un à la fois. Le profil natif macOS est évalué séparément et n’hérite de rien de Linux.

  2. 02

    Cursor

    Ensuite, avec son propre profil et une propriété par lot de travail.

  3. 03

    SDKs

    Puis les SDKs, avec la même sémantique de preuve.

  4. 04

    Agents cloud

    Seul est crédité l’effet effectivement médié à la destination ; l’environnement interne de l’agent reste non évalué.

Pour les équipes qui entraînent et évaluent des modèles

Des évaluations agentiques dans un périmètre qui a été testé.

Les évaluations de harnais s’intègrent à Inspect — ses tâches, ses échantillons et sa sandbox Docker — pour les cycles de vie, les scénarios et les limites. SecureStamp apporte l’observateur externe, les oracles d’effet et l’export du rapport, pas un autre ordonnanceur, correcteur LLM ou pipeline de journaux. Aucun évaluateur n’exécute le candidat dans le processus de confiance, les réessais de commandes à effets sont désactivés, et les ensembles de développement et de holdout restent séparés : le holdout n’est jamais utilisé pour ajuster les contrôles.

  • Des tentatives déterministes sont injectées d’abord, comme test causal du mécanisme. Les harnais et modèles réels tournent ensuite, dans un budget autorisé, comme preuve du comportement du système.
  • Rejouer les requêtes ne rejoue pas un raisonnement stochastique. Les versions, les paramètres disponibles, le nombre d’exécutions, les délais d’expiration et les dénominateurs sont conservés ; aucun rejeu identique n’est promis.
  • L’utilité et le confinement sont rapportés séparément, pour que tout bloquer ne compte jamais comme un produit qui fonctionne. Un résultat de 0/N n’est pas un risque nul.

Où s’arrête le laboratoire

Les évaluations de capacités offensives — des agents qui cherchent de vraies vulnérabilités — exigent une infrastructure sans aucun chemin vers Internet. Le laboratoire ne revendique ni résistance aux exploits du noyau ou de l’hyperviseur, ni isolation multi-tenant.

Ce qu’il ne prouve pas

Les limites, avec le même poids que les capacités.

Pas une preuve d’alignement général

Réussir un corpus ne prouve pas qu’un modèle est aligné, ne couvre pas les attaques inconnues et ne remplace pas la gouvernance.

Pas une certification

Des résultats écrits et relus par la même équipe ne sont pas une évaluation institutionnelle indépendante. La reproduction par des tiers est créditée à part.

Pas toutes les exfiltrations

Il vérifie des routes instrumentées et des postconditions concrètes. L’inférence via un fournisseur autorisé envoie des données à ce fournisseur, et c’est déclaré comme exposition.

Pas le raisonnement

Les contrôles observent des actions et des effets. Ils n’ont pas besoin de chaînes de pensée et ne prétendent pas détecter d’intention psychologique.

Pas de protection contre l’administrateur de l’hôte

Cette version fait confiance au superviseur qu’exécute l’opérateur : pas d’attestation matérielle, pas de protection contre l’administrateur et pas de résistance à une évasion de l’hyperviseur.

Les hooks ne sont pas un périmètre

Les hooks et les modes d’approbation décrivent comment la permission est demandée ; ils ne bornent pas ce qu’un processus peut atteindre. approval_policy=never dit seulement comment les approbations ont lieu.

Statut

Beta, avec Linux et Docker comme backend testé. Chaque résultat porte son niveau — simulé, intégration réelle ou non évalué — avec ses dénominateurs, ses versions et sa configuration, et une route sans sonde reste non évaluée. Les projets pilotes avec des équipes externes et de vraies cérémonies d’approbation humaine viennent ensuite et seront rapportés de la même façon ; rien sur cette page n’extrapole un résultat réel à partir d’une simulation.

Ouvert à la contestation

La méthode est publiée sur cette page pour pouvoir être critiquée et améliorée. Le vérificateur de rapports fonctionne hors ligne, sans compte ; les schémas et les scénarios synthétiques sont préparés pour une publication sous une licence examinée séparément. Un résultat erroné peut être signalé sans publier d’exploit ; une exécution ultérieure ajoute une nouvelle version et laisse l’ancienne visible. Quand la même équipe construit et évalue un contrôle, ce conflit est déclaré.

Sources consultées

Consultées le 2026-09-25. Les sources sur les incidents sont citées comme motivation des familles de défaillances, pas comme reconstruction forensique.

Laboratoire de harnais d’agents — méthode, preuves et limites | SecureStamp Foundation