AN-06 L3 Niveau de conformité : Guard Groupe : Autorité

Trust Labels étiquettes de confiance

Deux petites étiquettes plus la contamination de session appliquent la Rule of Two.

Définition

Les Trust Labels sont deux très petits jeux d’étiquettes attachés aux données, l’origine (owner, agent, external) et la sensibilité (public, private, secret), plus la contamination de session. Le NAS applique la Rule of Two comme un invariant de session : une session ne peut pas réunir à la fois [A] a lu du contenu externe, [B] touche à des données sensibles et [C] modifie un état protégé ou communique vers l’extérieur. Compléter la troisième exige une Human Gate.

v0.2 Brouillon de spécification Mis à jour le

Le problème

L’injection de prompt fonctionne parce qu’un modèle ne distingue pas les « instructions » des « données ». Les défenses au niveau du modèle (classifieurs, durcissement des prompts) fuient, et les attaquants peuvent s’adapter. Fin octobre 2025, Meta a proposé l’Agents Rule of Two : tant que l’injection n’est pas résolue de façon fiable, une session devrait avoir au plus deux des trois propriétés.

L’approche la plus fiable consiste à borner les conséquences en dehors du modèle. Le stockage est précisément l’endroit où passent toutes les lectures et écritures, et c’est donc un endroit naturel pour transformer cette règle en invariant testable.

Fonctionnement

  • Étiquettes. Trois origines, trois sensibilités et un indicateur reviewed (posé par l’approbation d’une validation). Les points d’import (pages web, e-mails, téléversements) valent external par défaut ; quand un détecteur de secrets trouve des identifiants, il les étiquette automatiquement secret.
  • Contamination de session. Le résumé de tout ce qu’une exécution a lu (d’après le manifeste de lecture) ; au sein d’une session elle ne fait que croître, et une nouvelle session repart propre.
  • L’invariant. A = la session a lu external ; B = l’habilitation peut lire private ou plus (seuil configurable) ; C = l’habilitation peut proposer une fusion dans un arbre protégé, partager, supprimer ou envoyer des données vers l’extérieur. Quand les trois sont réunis dans une même session, l’appel qui déclenche C est refusé ou envoyé à une validation.
  • En pratique : sous une habilitation qui a à la fois B et C, dès qu’une session a lu du contenu externe, toute action de type C ultérieure exige une personne. Pour éviter cette friction, faites le travail de « lecture de contenu externe » dans une session distincte sans B, et ne transmettez les résultats que par une passation structurée.
  • Propagation. Les dérivations faites par le NAS lui-même (index, résumés) héritent de façon déterministe de l’union des étiquettes de leurs entrées ; les fichiers qu’une exécution écrit héritent de la contamination de session de l’exécution (le choix prudent).
  • Déclassification. Uniquement par une Human Gate, ou par une passation structurée : la sortie de la session contaminée est restreinte à des champs validés par un schéma JSON (énumérations, identifiants, chaînes bornées), et c’est seulement après validation qu’une session privilégiée peut la lire. On ne peut faire confiance qu’à ce qui peut être validé de façon déterministe.
  • L’application se fait à la passerelle et au montage (qui connaissent l’habilitation et la session), pas à l’intérieur du modèle.

Commencer petit

  • Ne faites que deux choses : étiquetez external les fichiers du répertoire d’import, et par défaut n’accordez à une exécution qui a lu external ni sortie de données ni fusion protégée sans validation.
  • Écrivez la politique sous forme de règles déterministes en Cedar ou Rego, et donnez des raisons lisibles en cas de refus.
  • Faites tourner en mode « journal seulement » pendant une semaine pour voir ce qu’il bloquerait par erreur, puis activez l’application.

Esquisse d’interface

À titre d’illustration seulement. Les noms de champs peuvent changer avant la spécification v0.3.

policy.yaml
# Deterministic policy (Cedar- or Rego-style rules can express the same thing)
session_invariant: rule_of_two
properties:
  A: session.read_origin includes "external"
  B: lease.sensitivity_max >= "private"
  C: lease allows propose_protected | share | delete | egress
on_would_complete_ABC: gate        # never "allow"
rules:
  - id: r-merge-1
    when: session.A and op == "merge" and target.protected
    then: gate
  - id: r-secret-1
    when: session.read_sensitivity == "secret" and op == "egress"
    then: deny

Ce que demande la spécification

  • Chaque point d’import DOIT attribuer une étiquette par défaut ; le contenu externe DOIT être étiqueté external.
  • Au sein d’une session, la contamination DOIT uniquement croître.
  • L’évaluation des politiques DOIT être déterministe et NE DOIT PAS appeler un LLM.
  • Un appel qui permettrait à une session de réunir A+B+C DOIT être refusé ou envoyé à une validation.
  • La déclassification DOIT passer par une validation ou par une passation structurée validée par un schéma.
  • Les données dérivées DOIVENT hériter de l’union des étiquettes de leurs entrées.

Ce qui est emprunté, et ce qui est nouveau

Tout ce qui précède relève de réflexions établies. Ce qui est nouveau : mettre en œuvre la contamination de session à la frontière du stockage avec le manifeste de lecture, et appliquer les étiquettes aux écritures de mémoire et aux données dérivées. Nous gardons délibérément le treillis d’étiquettes à 3×3, car les treillis fins mènent en pratique à une explosion d’étiquettes. OpenClaw fait déjà des étiquettes d’origine et de l’isolation à l’intérieur d’un seul runtime ; notre seule différence est de placer cela dans un stockage partagé.

Limites assumées

  • Ce n’est pas une défense contre l’injection de prompt ; il en limite les conséquences.
  • Le NAS ne voit pas les outils extérieurs (un navigateur, la messagerie) ; il a donc besoin de la coopération du runtime.
  • La contamination est prudente et apporte de la friction et des faux positifs ; un texte libre hors des schémas structurés peut encore porter les mots d’un attaquant.
  • Les canaux cachés ne peuvent pas être éliminés.

Questions ouvertes

  • La granularité d’une étiquette doit-elle être le fichier ou le paragraphe ?
  • Comment gouverner le vocabulaire des étiquettes entre locataires ?
  • Comment réduire les faux positifs ?

Questions

La Rule of Two arrête-t-elle l’injection de prompt ?

Elle n’empêche pas l’injection de se produire. Elle rend une session injectée incapable de réunir les trois propriétés « a lu du contenu non fiable, touche à des données sensibles, peut modifier un état protégé ou envoyer des données vers l’extérieur », ce qui borne les conséquences. Meta souligne elle-même qu’il s’agit d’une heuristique de réduction du risque qui ne remplace pas le moindre privilège.

Pourquoi seulement trois origines et trois sensibilités ?

Parce que les treillis d’étiquettes fins ont tendance à gonfler et à être désactivés en pratique. 3×3 suffit pour dire « qui l’a écrit, avec quelle sensibilité » et rend la raison d’un refus facile à comprendre. Des partitions plus fines peuvent se faire avec les chemins et les habilitations.

La contamination de session laissera-t-elle l’agent sans rien pouvoir faire ?

Elle ne restreint que trois sortes d’actions : modifier un arbre protégé, partager ou supprimer, et envoyer des données vers l’extérieur. Les lectures et écritures dans une branche ne sont pas touchées. Pour éviter la friction, placez le travail de lecture de contenu externe dans une session sans données sensibles et ne renvoyez que des résultats validés par un schéma.

Citer cette page

Des adresses stables et une citation suggérée, pour les personnes, les moteurs de recherche et les agents.

Citation suggérée
Agent NAS project. “Trust Labels (étiquettes de confiance).” agentnas.com, 2026-11-11. https://agentnas.com/fr/concepts/trust-labels/