
Défense contre l'injection de prompt stéganographique pour l'IA agentique reposant sur la liaison de provenance au moment du décodage, l'authentification HMAC et l'application de la confiance MCP.
Une preuve de concept reproductible d'un vecteur d'injection de prompt stéganographique qui contourne les analyseurs de contenu textuel, et une défense qui le contient à la frontière du décodage — la liaison de provenance au moment du décodage.
Recherche en sécurité éducative / défensive uniquement. Tous les secrets de ce dépôt sont factices. À utiliser uniquement sur des systèmes que vous possédez ou que vous êtes autorisé à tester.
Un attaquant envoie par courriel à une victime un message d'apparence ordinaire. Un logo de marque dans la
signature du courriel dissimule une instruction via la stéganographie (LSB, DCT ou métadonnées).
L'image est visuellement identique à l'originale et ne contient aucun texte suspect, donc
un analyseur de contenu ne voit rien et la victime ne clique sur rien. Mais l'agent de résumé de boîte de réception
routinier de la victime traite la signature, un outil de son pipeline décode l'image, et l'instruction
cachée entre dans le contexte de l'agent — où, dans un pipeline MCP multi-agents, elle est relayée entre agents comme
une sortie de pair de confiance et déclenche un appel d'outil critique. C'est le blanchiment de confiance
inter-modal. La défense, la liaison de provenance au moment du décodage, génère une
étiquette UNTRUSTED signée par HMAC à l'instant où un outil d'inversion de dissimulation s'exécute et
fait en sorte que la couche MCP maintienne elle-même la lignée de provenance, de sorte qu'elle bloque tout
appel d'outil critique dont la lignée n'est pas de confiance — même lorsqu'un agent compromis
présente une étiquette valide pour une valeur de confiance sans rapport. Elle contient plutôt que
ne détecte, elle est donc indépendante de la formulation de la charge utile et du support.
Taux de réussite de l'attaque (ASR) — 24 charges utiles (trois supports × huit évasions : simple, formulation bénigne, Base64, fractionnement de jetons, homoglyphe cyrillique, largeur nulle, confusable Unicode, commentaire HTML) ; plus bas est meilleur. La base de référence taint en processus est un contrôle de flux d'information qui marque la sortie de décodage comme non fiable mais ne porte aucune liaison cryptographique inter-domaines :
| Défense | Fuites | n | ASR |
|---|---|---|---|
| Sans défense (aucune vérification) | 24 | 24 | 100% |
| Analyseur de contenu (mots-clés/DLP) | 15 | 24 | 62,5% |
| Analyseur d'intention par regex | 15 | 24 | 62,5% |
| Taint de flux de données (base IFC) | 0 | 24 | 0% |
| Provenance au décodage (la nôtre) | 0 | 24 | 0% |
Taint et provenance sont à égalité sur l'ASR mono-domaine ; ils divergent sous relais adversarial (ci-dessous), ce qui est l'intérêt de la liaison cryptographique.
Substitution d'étiquette valide — un agent compromis présente une liaison TRUSTED légitimement signée
d'un outil bénin tout en omettant l'origine de décodage UNTRUSTED
qui pilote réellement l'appel. Le correctif est que la couche MCP maintient elle-même la lignée
et décide sur son propre registre, et non sur la liaison fournie par l'agent :
| Application | Décision |
|---|---|
| Liaison fournie par l'agent uniquement (naïve) | autoriser (fuites) |
| Maintenue par la couche, dépendance omise | bloquer |
| Maintenue par la couche, dépendance dans les arguments | bloquer |
| Maintenue par la couche, contexte propre | autoriser |
Ablation des composants — quatre composants, chacun défendant contre une attaque distincte. Désactivez-en
un à la fois ; substitution est intra-domaine, forged relay est une étiquette TRUSTED forgée
traversant un relais non fiable vers un vérificateur distant qui ne détient que la liaison présentée.
Crucialement, le HMAC seul ne stoppe pas la substitution (le registre le fait), et
le registre seul ne survit pas à un relais inter-domaines (le HMAC le fait) :
| Configuration | Honnête | Substitution | Relais forgé |
|---|---|---|---|
| Mécanisme complet | bloqué | bloqué | bloqué |
| − marquage de décodage | fuites | fuites | fuites |
| − authentification cryptographique (HMAC) | bloqué | bloqué | fuites |
| − suivi de lignage de confiance | bloqué | fuites | bloqué |
| − médiation des sinks | fuites | fuites | fuites |
Propagation inter-contextes — la teinte (taint) survit à une frontière de message inter-agents, pas seulement à un handle de retour d'outil. Un décodage non fiable dans l'Agent A atteint un appel critique dans le contexte séparé de l'Agent B, et sur un canal médié (que le modèle de menace exige déjà pour les communications inter-agents) la teinte se propage et B est bloqué. Un canal que la couche ne médie pas est hors du modèle par construction — pas une fuite dans le périmètre :
| Canal A → B | Appel critique de B |
|---|---|
| Message inter-agents médié (dans le périmètre) | blocage (teinte propagée) |
| Canal latéral non médié (hors du modèle) | non couvert |
Mise à l'échelle du surcoût — MintBinding est ~O(1) (~10–14 µs quelle que soit
la profondeur) ; EnforceCritical est linéaire en la fermeture de dépendances qu'il
parcourt (≈10 µs à la profondeur 1 → ≈0,66 ms à la profondeur 100 → ≈6,7 ms à la
profondeur 1000) et constant (~6–7 µs) selon le nombre de contextes teintés
concurrents. Les fermetures réalistes (profondeur de l'ordre de la dizaine) restent
sous ~0,1 ms.
Utilité pour les tâches légitimes — un chemin de promotion de confiance audité (re-étiquetage d'une valeur décodée spécifique, par ex. un numéro de facture issu d'un OCR, sous autorisation) élimine les faux blocages tandis que l'attaque reste bloquée :
| Régime | Achèvement | Faux blocages | Attaque bloquée |
|---|---|---|---|
| Sans promotion | 2/3 (67%) | 1 | oui |
| Promotion de confiance | 3/3 (100%) | 0 | oui |
Complétude de l'ensemble de décodage — l'hypothèse d'enregistrement, mise à l'épreuve directement :
| Ensemble de décodage | Attaque stégo | Appel critique légitime |
|---|---|---|
| Correct | bloqué | autorisé |
| Décodeur manquant | fuites | autorisé |
| Trop large | bloqué | faux blocage |
Intégrité des étiquettes lors des transferts — la liaison survit à un relais honnête et résiste à un worker compromis :
| Scénario de relais | Décision du vérificateur |
|---|---|
| Relais honnête, 1 / 3 / 5 / 10 sauts | vérifie ; bloqué |
| Compromis : réécriture de la charge utile, HMAC conservé | blocage (incohérence HMAC) |
Compromis : forge TRUSTED | blocage (incohérence HMAC) |
| Compromis : suppression de la liaison | blocage (aucune étiquette valide) |
Surcoût — effectivement gratuit au point de décision : la création et la vérification d'une liaison coûtent ~8–9 µs chacune (~17 µs au total), contre un appel d'outil de décodage de ~11 ms — moins de ~0,2 % ajouté. La distorsion du support est faible (LSB ≈ 76 dB PSNR, métadonnées sans perte ; DCT ≈ 18 dB — une métrique de distorsion, pas une affirmation d'imperceptibilité perceptuelle).