Exfiltration par rendu Markdown et liens
Comment un assistant sans aucun outil d'envoi fait sortir des données par une image ou un lien rendus dans votre interface, et pourquoi la parade se place dans le composant de rendu et la politique de contenu plutôt que dans le prompt.
Par Elias Varen7 min de lectureMembres
Votre assistant n'a aucun outil d'envoi. Pas de mail, pas de webhook, pas d'appel HTTP. Il lit des données du tenant, lit parfois un document externe, et répond par du texte. En revue, on note « pas de canal de sortie » et on passe au sujet suivant.
Le texte de la réponse est rendu en Markdown dans votre interface. Le Markdown sait afficher des images. Une image a une adresse, et le navigateur de l'utilisateur va chercher cette adresse dès que le composant l'affiche. Si l'adresse a été composée par le modèle, le modèle vient de faire émettre une requête HTTP vers le serveur de son choix, avec dans l'URL ce qu'il a bien voulu y mettre. Le canal de sortie existait depuis le début, et c'est votre front.
Une requête que personne n'a décidée
L'enchaînement ne demande aucune faille au sens classique. Chaque composant fait ce pour quoi il est prévu.
1. l'agent lit un contenu tiers (ticket, page, pièce jointe)
2. ce contenu lui demande d'ajouter à sa réponse une image dont l'adresse
pointe vers un serveur externe et contient, en paramètre, une donnée
du contexte
3. le modèle écrit la réponse, image comprise
4. le front rend le Markdown
5. le navigateur charge l'image : la donnée part dans l'URL
6. le serveur externe lit son journal d'accèsL'utilisateur n'a cliqué sur rien. Il peut ne rien voir, qu'il s'agisse d'une image d'un pixel ou d'une image cassée perdue dans une réponse longue. Ce qui sort tient dans une URL, donc quelques milliers de caractères par image, largement de quoi emporter un nom, une adresse, un extrait de conversation ou un token qui traînait dans le contexte.
Le lien cliquable est la variante à un clic. L'adresse est composée de la même façon, le texte affiché est rassurant, et la donnée part quand l'utilisateur clique. Et l'utilisateur clique, puisque le lien lui est présenté par l'assistant de sa propre application.
Ce canal reste ouvert dans beaucoup de produits pour une raison d'organisation plus que de technique. L'équipe qui conçoit l'agent raisonne en outils et considère la réponse comme un texte inerte. L'équipe front reçoit une chaîne à afficher et branche le composant Markdown habituel, celui qui sert déjà pour le contenu écrit par l'équipe elle-même. Personne ne possède la question « qui a écrit cette URL ? ».
À lire ensuite
Toute la rubrique IAIA
Identité des agents : qui agit, au nom de qui ?
Pourquoi un agent doté d'un compte de service large devient un adjoint confus, et comment faire porter à chaque appel d'outil l'autorité de l'utilisateur, réduite à la tâche, avec un journal qui nomme les deux.
7 minMembres
IA
Mode automatique : classer les actions au lieu de demander
Pourquoi la demande de permission systématique ne protège plus au bout d'une heure, ce qu'un classifieur d'actions rattrape et ce qu'il laisse passer, et comment décider quelles actions lui confier.
8 minMembres
IA
Serveurs MCP : une chaîne d'approvisionnement non inventoriée
Pourquoi un serveur MCP est une dépendance qui écrit dans votre prompt et s'exécute avec vos droits, et comment l'inventorier, l'épingler et le relire sans bloquer l'équipe.
8 minMembres