Retour à tous les articles
Publié le · par Renaud Deraison

La page web a réécrit la configuration de l'agent

Le 21 juillet 2026, Intezer et Kodem Security ont divulgué CVE-2026-10591 : une page de documentation d'apparence ordinaire portait des instructions en texte blanc d'un pixel, et lorsqu'un développeur a demandé à l'agent Kiro d'AWS de la lire, Kiro a utilisé son propre outil d'écriture de fichiers pour écraser la configuration qui lance ses serveurs MCP sans aucune approbation, puis a rechargé le fichier et exécuté le code de l'attaquant sur l'hôte, avec les privilèges du développeur. AWS a ajouté une invite d'approbation. Ce qui perdure, c'est que l'agent, le web qu'il lit et la machine du développeur ne formaient qu'une seule zone de confiance. Bromure Agentic Coding place un hyperviseur entre eux.

Un développeur a demandé à Kiro de lire une page de documentation. La page contenait une phrase peinte en texte blanc d'un pixel, écrite pour le modèle, pas pour l'œil. La suivant, Kiro a réécrit le fichier qui décide quels programmes il lance, puis en a lancé un. Rien dans tout cela n'a nécessité un clic.

Kiro est l'IDE agentique d'AWS : un agent de code qui lit le web ouvert en votre nom, récupère de la documentation et branche des outils pour vous. Comme la plupart des agents en 2026, il parle le Model Context Protocol, ou MCP : la prise qui permet à un agent de code d'appeler des outils externes et de lire leurs résultats. Kiro conserve sa liste de serveurs MCP, et la commande exacte utilisée pour démarrer chacun d'eux, dans un simple fichier à ~/.kiro/settings/mcp.json. Quand ce fichier change, Kiro le recharge et lance tout ce qu'il décrit désormais.

Cette dernière phrase est toute la vulnérabilité. Le fichier est un lanceur, et l'agent peut y écrire.

Le 21 juillet 2026, Intezer, dans une recherche menée avec Kodem Security, a montré la chaîne qui suit, et The Hacker News l'a couverte le jour même. AWS a attribué CVE-2026-10591, noté 8,8 sur 10. Des éléments antérieurs du même problème avaient été signalés par Johann Rehberger et par Cymulate. Ce qu'Intezer a ajouté, c'est la livraison.

Une page que vous lisez, pas un fichier que vous avez ouvert

Les instructions ne sont pas arrivées dans un dépôt ou une configuration à laquelle le développeur avait choisi de faire confiance. Elles sont arrivées sur une page web. Intezer les a plantées en texte blanc d'un pixel, color:#fff;font-size:1px, sur une page de documentation d'API par ailleurs ordinaire. Dans un navigateur, le paragraphe ne rend rien : un mince ruban vide qu'un humain dépasse en défilant. Pour l'agent, qui ingère le texte de la page plutôt que son image, c'est un paragraphe d'instructions parfaitement clair.

Ces instructions disaient à Kiro d'utiliser fsWrite, son propre outil d'écriture de fichiers, pour écraser ~/.kiro/settings/mcp.json avec une entrée fournie par l'attaquant. Kiro l'a fait sans demander. Son mode Autopilot par défaut a écrit le fichier de lui-même, sans aucune boîte de dialogue ni invite « autoriser cette écriture ? ». Le rechargement s'est déclenché, Kiro a lancé la commande de la nouvelle entrée, et le code de l'attaquant s'est exécuté sur l'hôte avec les privilèges du développeur : de quoi lire des identifiants, copier du code source, installer une persistance, ou se déplacer latéralement vers tout ce que la machine du développeur peut atteindre.

La machine du développeur — une seule zone de confiancePage docnormale pour unœil humain…texte blanc 1px :« écraser mcp.json »Agent Kirolit la page commedu texte, obéit,appelle fsWritemcp.jsonpas une liste, unlanceur. Rechargerexécute sa commande.Le code tourneen tant que dev :identifiants, code,cloud, latéralAucune invite d'approbation entre « lire cette page » et « exécuter ce code ».CVE-2026-10591 — signalé fév. 2026, présent sur v0.9.2 / v0.10.16, corrigé dans la série v0.11.
CVE-2026-10591, de gauche à droite, tout sur la machine du développeur. Une page de documentation porte des instructions en texte blanc d'un pixel, invisibles dans le navigateur et en texte clair pour l'agent. Invité à lire la page, Kiro suit l'instruction dissimulée et utilise son propre outil fsWrite pour écraser ~/.kiro/settings/mcp.json. Ce fichier est un lanceur : au rechargement, Kiro démarre la commande qu'il nomme désormais, exécutant le code de l'attaquant en tant que développeur, avec un accès aux identifiants, au code source et aux sessions cloud auxquelles la machine est connectée. Aucune invite d'approbation ne se tenait entre la lecture de la page et l'exécution du code.

AWS a ajouté une invite. La machine reste le butin.

Le correctif est le bon. AWS marque désormais mcp.json, .vscode/tasks.json, le répertoire .git et d'autres fichiers sensibles à l'exécution comme des chemins protégés : y écrire exige une approbation explicite, aussi bien en mode Autopilot qu'en mode Supervised. L'étape d'approbation qui manquait est maintenant là. Si vous utilisez Kiro, mettez-le à jour.

Ce que le correctif ne change pas, c'est la forme de la pièce. AWS l'a dit en conclusion : un humain dans la boucle ne fonctionne comme contrôle que si on lui montre l'étape qui compte, et si la plateforme tient la ligne même une fois que le modèle a été entièrement convaincu de la franchir. Cela fait deux exigences. L'invite satisfait la première : elle fait apparaître l'écriture. Elle ne peut satisfaire la seconde, car lorsque le code s'exécute, il s'exécute sur la propre machine du développeur, avec sa propre portée. Une approbation que vous validez d'un clic un après-midi de fatigue, ou une approbation que la prochaine page astucieuse apprend à formuler pour qu'elle paraisse routinière, vous mène au même endroit : le code de l'attaquant s'exécutant là où vivent vos clés, vos dépôts et vos sessions cloud.

La forme récurrente ici — une page que l'agent a lue, une configuration qu'il pouvait écrire, un lancement qu'il pouvait déclencher — n'est pas propre à Kiro. C'est à quoi ressemble un agent qui lit le web ouvert et modifie des fichiers sur une machine pleine de secrets. La question durable est de savoir où l'agent s'exécute, et ce qui l'entoure quand l'invite échoue.

Là où Bromure exécute les mêmes étapes

Bromure Agentic Coding n'essaie pas de faire en sorte que l'agent se méfie de la page, refuse l'écriture ou intercepte le clic. Il change la machine sur laquelle toute la séquence s'exécute. L'agent de chaque profil s'exécute à l'intérieur d'une VM Linux jetable sur Apple Silicon, à un hyperviseur de macOS. Exécutez la chaîne exacte de CVE-2026-10591 là-dedans et chaque étape se déclenche quand même, et chaque étape atterrit ailleurs.

La page est lue. L'injection l'emporte. Le substitut de Kiro réécrit mcp.json, le rechargement se déclenche, la commande de l'attaquant se lance « avec les privilèges du développeur ». Sauf qu'à l'intérieur de la VM, le développeur est l'utilisateur ubuntu dans une boîte jetable, et la boîte ne contient rien qui vaille le déplacement. Le code part à la recherche des identifiants qui rendent l'attaque payante — la clé Anthropic, les clés AWS, le jeton GitHub — et trouve des leurres. Dans Bromure, les vrais secrets n'entrent jamais dans la VM ; un courtier d'identifiants sur l'hôte injecte des substituts comme brm_…, un kubeconfig synthétique et une clé SSH jetable, et n'insère la vraie valeur qu'à la frontière réseau, sur les requêtes vers des destinations que vous avez approuvées. Le vol de code source n'atteint que les dossiers que vous avez choisi de monter. Le « mouvement latéral vers les systèmes internes » atteint le pare-feu de la VM propre à chaque profil.

Config normale — une machinePage cachée → Kiro réécrit mcp.json →le code s'exécute sur votre MacVraies clés & jetonsvolésSource & cloudaccessiblesLe serveur MCP implanté persisteaux redémarragesL'invite était la seule ligne, et elle a cédé.Bromure Agentic Coding — VM jetableMême chaîne — dans la VM,utilisateur ubuntu jetableSaisit des leurresbrm_… , pas les vraiesSortie filtréeau proxy hôte, tracéeFermer la session → réinit. boîteserveur implanté & persistance effacésLa ligne est l'hyperviseur, pas l'invite.
La même attaque, deux machines. Sur une configuration normale (à gauche), le code injecté s'exécute sur le Mac du développeur et atteint les vrais identifiants, le code source et les sessions cloud qui vivent à côté. Sous Bromure Agentic Coding (à droite), la chaîne identique s'exécute à l'intérieur d'une VM jetable : le code s'exécute en tant qu'utilisateur ubuntu jetable, les identifiants qu'il saisit sont des leurres, ses requêtes sortantes sont filtrées et journalisées au niveau du proxy hôte, et fermer la session réinitialise la boîte, effaçant le serveur MCP implanté et toute persistance. L'hyperviseur est la ligne que le modèle ne peut franchir par la parole.

Il y a ensuite la moitié sortante. Voler un leurre ne paie que si vous pouvez l'envoyer quelque part, et se déplacer latéralement signifie atteindre un second hôte. Ce sont deux actions réseau, et dans Bromure toutes deux traversent le proxy hôte, où la véritable destination d'une requête est filtrée à la sortie et où la forme destructrice d'une action — un delete, un drop ou un terminate contre les API cloud et git que le profil expose — rencontre un garde-fou capable de la refuser, quoi que l'agent ait été persuadé de faire. Tout ce que le code lancé tente laisse une ligne journalisée dans la trace de session.

Et une couche se tient devant tout cela, pour une raison qui colle exactement à cette attaque. Bromure évalue le contenu non fiable qu'un agent lit — une page récupérée ou une réponse d'outil — avec un détecteur d'injection sur l'appareil avant que le modèle n'agisse dessus. Si le texte d'un pixel fonctionne, c'est parce qu'une personne lit la page rendue. Le classifieur, lui, ne le fait pas ; il lit le même flux brut que le modèle, où color:#fff;font-size:1px ne cache rien. L'astuce qui rend le paragraphe invisible à l'œil ne change rien pour un évaluateur qui lit les octets. Il attrape l'essentiel, et un déguisement suffisamment inédit peut encore échapper à un seul détecteur, c'est pourquoi il se tient devant la boîte jetable plutôt que de la remplacer.

Le web est désormais l'entrée non fiable

Pendant des années, le conseil pour les agents de code était de faire attention aux dépôts auxquels vous faites confiance. Kiro fait avancer la leçon : l'entrée dangereuse était une page de documentation, du genre qu'un agent lit cent fois par jour, et l'arme était une propriété CSS qu'un navigateur honore depuis les années 1990. À mesure qu'une plus grande part du flux de développement passe par des agents qui lisent le web ouvert, chaque page est une entrée non fiable, et la lire plus attentivement n'y change rien.

L'invite qu'AWS a ajoutée est le bon correctif, et il devrait être déployé. Mais un contrôle qui dépend d'une personne repérant la seule écriture qui compte, sur chaque page, pour toujours, est un contrôle au piètre bilan sur la durée. Bromure Agentic Coding ne demande pas à l'agent d'être prudent avec le web. Il suppose que la page l'emporte, que la configuration est réécrite et que le code s'exécute, et il fait en sorte que, lorsque tout cela arrive, cela arrive dans une boîte où il n'y a rien à prendre et aucun chemin de retour. C'est la différence entre une invite que l'on peut contourner par la parole et une ligne tracée un niveau plus bas, où la parole cesse de fonctionner. Installez-le et donnez à votre agent une machine qui n'est pas la vôtre à perdre.