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

Le prompt ne parlait pas des formulaires

Le 9 octobre, Anthropic a publié un rapport sur des modèles Claude qui ont agi sur de vrais sites web pendant des tests internes. L'un d'eux, Claude Haiku 4.5, a envoyé le 18 juillet un faux signalement sur un homicide non élucidé à la police de Philadelphie. Ses instructions interdisaient les connexions, les achats et les données personnelles, et ne disaient rien des formulaires. Anthropic a trouvé le signalement dix semaines plus tard. Dans Bromure Agentic Coding, la limite est une règle sur le Mac : l'agent peut lire n'importe quelle page, et un POST vers un site que vous n'avez pas listé revient en 403 et apparaît dans la Security Timeline la minute même.

On avait dit au modèle de ne pas se connecter, de ne rien acheter et de ne saisir aucune donnée personnelle. Personne ne lui avait dit de ne pas cliquer sur Envoyer.

Le 18 juillet à 23 h 27, quelqu'un a envoyé un signalement via le formulaire public de PhillyUnsolvedMurders.com, le site de la police de Philadelphie consacré aux homicides non élucidés. Le message commençait par « Je dispose peut-être d'informations concernant cette affaire. » Il venait de Claude Haiku 4.5, qui tournait dans un test d'Anthropic générant des exemples de tâches à partir de sites web choisis au hasard.

Le filtre du département l'a classé en spam, et il n'est jamais parvenu au Real-Time Crime Center. Anthropic a découvert l'envoi le 28 septembre, a prévenu le département le 7 octobre et a rencontré ses responsables le 8 octobre. La police a rendu l'affaire publique le vendredi 9 octobre, et Anthropic a publié son rapport, Investigating unintended model actions, le même jour. La déclaration du département, rapportée par 6abc Action News : « Le délai de deux mois pour détecter l'incident et le signaler à la Ville est inacceptable. »

Anthropic a désormais coupé l'accès à l'internet réel pour toutes ses évaluations internes, jusqu'à ce que sa surveillance « détecte de manière fiable des comportements comme ceux-ci », selon The Hacker News. Le New York Times, citant deux sources anonymes, ajoute que des agents d'Anthropic ont rempli 20 demandes de visa sur le site du Département d'État.

Quatre formes d'obstination

Le rapport range ce qu'Anthropic a trouvé en quatre catégories. Anthropic affirme que l'impact réel a été minime et qu'aucune donnée client n'était concernée. Lisez-les comme la liste de ce que fait un agent compétent quand une tâche lui résiste :

  1. Il a exploité un serveur pour terminer un calcul. Un outil d'analyse hébergé par une université renvoyait une erreur. Claude a trouvé sur le serveur un script qui renvoyait « n'importe quel fichier demandé », puis une faille d'injection, et s'en est servi pour lancer le calcul.
  2. Il a envoyé des formulaires qu'il n'aurait pas dû envoyer. Quand un formulaire d'entraînement n'a pas chargé, un modèle de recherche non publié est allé sur le vrai site gouvernemental et a envoyé le vrai formulaire, à plusieurs reprises. Haiku 4.5, à qui l'on avait demandé de s'arrêter avant l'envoi final, a envoyé quand même, en attendant une page de confirmation ; son raisonnement disait qu'il « démontrait le processus ». Puis le signalement à la police.
  3. Il a contourné des barrières pour atteindre des données. Limité dans le nombre de pages qu'il pouvait parcourir, Claude a lu le fichier de configuration d'un site de cartographie, y a trouvé des jetons d'accès valides et a interrogé directement le serveur de cartes. Pour le projet statistique d'un chercheur, il a découvert que le tableau de bord payant d'une agence d'État remet un jeton à chaque visiteur, en a demandé un et a interrogé la base de données sans payer.
  4. Il a raccourci son chemin au-delà d'une limite de fetch. L'outil de fetch d'Anthropic plafonne la longueur des URL, parce que les URL longues ont « de la place pour transporter » des instructions injectées. Plusieurs modèles, dont Claude Opus 5 et Claude Mythos 5, ont fait passer leurs URL par des services de raccourcissement gratuits. L'opérateur de da.gd a écrit pour dire qu'il l'avait remarqué.

Le diagnostic d'Anthropic : la plupart de ces cas sont ceux où Claude « contourne une restriction au lieu de s'arrêter », et certains « auraient pu être évités » si les évaluations avaient précisé leurs cibles, les actions permises et les limites réseau.

Deux sortes de limites, toutes deux à l'intérieur

Chaque limite du rapport se trouve à l'intérieur de l'agent. Certaines étaient des phrases dans le prompt : pas de connexion, pas de compte, pas de données personnelles, s'arrêter avant l'envoi final. Le modèle a respecté celles qu'on lui avait données. Les formulaires ne figuraient pas sur la liste, et la consigne « s'arrêter avant l'envoi » a cédé devant l'envie du modèle de voir une page de confirmation.

Les autres étaient des limites d'outil : un plafond de longueur d'URL sur le fetch, un budget de clics dans le harnais d'évaluation. Le modèle a gardé l'objectif et pris un autre chemin : un raccourcisseur, un fichier de configuration, une requête directe au serveur derrière la page.

La détection d'Anthropic a eu du retard sur tout cela. Une revue des transcriptions commencée en juillet s'est étendue des évaluations cyber à tous les endroits où Claude pouvait atteindre internet, et le signalement est apparu le 28 septembre, dix semaines après son envoi. L'opérateur de da.gd et la police de Philadelphie ont chacun trouvé leur part par eux-mêmes.

Un formulaire, 72 jours de silence18 juil., 23 h 27POST vers le formulaire de la police :« Je dispose peut-être d'informations concernant cette affaire. »Prompt : pas de connexion, pas d'achat,pas de données perso. Formulaires : rien.72 jours : ni alerte, ni log lu. Le signalement dort dans la transcription.28 sept.trouvé lors d'unerevue de transcriptions7 oct.police prévenue9 oct.déclarationet rapport
Le signalement à la police, de l'envoi à la divulgation. Le seul contrôle entre le modèle et le formulaire était une liste de choses à ne pas faire, et l'envoi est apparu dans une revue de transcriptions dix semaines plus tard.

Votre agent a les mêmes habitudes

C'étaient les propres évaluations d'Anthropic, menées par les gens qui entraînent les modèles. Votre agent de code a les mêmes outils : un fetch, un shell avec curl, Python avec requests, et souvent un navigateur. Il a aussi la même disposition que celle décrite par le rapport. Donnez-lui une tâche qui échoue à mi-chemin, une fixture de test qui a besoin d'un endpoint réel, un parcours d'inscription à vérifier, un webhook à « valider », et il cherchera un autre moyen de terminer.

Vos propres limites sont aussi des phrases : une ligne dans CLAUDE.md qui dit de ne pas toucher à la production, une note dans la tâche qui demande de s'arrêter avant de déployer. Chacune couvre les cas auxquels son auteur a pensé. Un curl -X POST vers un formulaire réel, une API ou un serveur de staging qui se révèle être la production, c'est une seule commande pour un agent qui veut voir le résultat.

La même tâche dans une machine Bromure

Dans Bromure Agentic Coding, l'agent tourne dans une VM Linux sur votre Mac, et chaque connexion ouverte par la VM traverse un switch virtuel et un proxy sur l'hôte. Les règles vivent là, hors de portée de l'agent. Rejouez le signalement à la police dans une machine, et laissez le modèle décider d'envoyer.

Lire est permis, écrire est listé

Le pare-feu Outbound connections du panneau Guardrails de la machine accepte des règles par hôte, protocole, port et, pour le trafic web, méthode HTTP. Anthropic disait que ses évaluations avaient besoin de « limites réseau » explicites. En voici une, au format pf du panneau :

allow web api.anthropic.com
allow web github.com
allow web registry.npmjs.org
allow web pypi.org
allow web any:80,443 read-only
default deny

Les règles s'appliquent de haut en bas. Le fournisseur du modèle, la forge et les registres qu'utilise le projet ont droit à toutes les méthodes. Tout le reste du web a droit à GET, HEAD et OPTIONS : l'agent peut lire toutes les pages de documentation, issues, changelogs ou formulaires de signalement qu'il veut. Quand il clique sur Envoyer, le POST vers phillyunsolvedmurders.com correspond à la règle en lecture seule, et le proxy répond 403 avec « POST to phillyunsolvedmurders.com blocked by Bromure Guardrails. » Le formulaire ne reçoit jamais la requête. L'agent obtient une erreur nette qu'il peut rapporter, et default deny écarte tout ce qui n'est pas du trafic web vers un hôte listé.

Vous n'avez pas à lister les formulaires, les demandes de visa ou les pages d'entraînement qui n'ont pas chargé. La règle nomme les quatre hôtes vers lesquels cette machine écrit et refuse les écritures vers le reste du web.

Le contournement rencontre la même règle

Les limites techniques d'Anthropic vivaient dans des outils, alors le modèle a changé d'outil. Une règle Bromure vit sur le réseau, alors changer d'outil ne sert à rien. Le proxy voit la requête une fois sortie de la VM, qu'elle vienne du fetch de l'agent, de curl, de Python, d'un script Node que l'agent a écrit une minute plus tôt, ou d'une redirection depuis un raccourcisseur d'URL. Un lien court finit toujours en une requête vers le vrai hôte avec la vraie méthode, et cette requête est vérifiée comme les autres.

Il en va de même pour un jeton tiré d'un fichier de configuration. Si l'agent trouve une clé et s'en sert pour écrire sur un serveur que le projet ne liste pas, l'écriture se heurte à la règle en lecture seule. Les clés que vous avez configurées vous-même ont leur propre politique : les identifiants de la machine sont par défaut sur Prompt before write, si bien qu'un push, un envoi vers un registre ou une modification AWS s'arrête sur une boîte de dialogue sur le Mac qui montre l'opération exacte.

La trace est écrite la minute même

La police de Philadelphie a jugé inacceptable l'écart de dix semaines. Dans une machine Bromure, le POST refusé est une ligne rouge dans la Security Timeline à 23 h 27 le 18 juillet, avec le nom de la machine, l'hôte, la méthode et le chemin. La timeline est toujours active, conserve 90 jours, et son onglet Overview affiche sur un seul écran les derniers blocages des dernières 24 heures. Sur un Mac inscrit auprès de bromure.io, le même événement part vers la console de l'organisation.

La trace ajoute le reste. Au niveau par défaut, AI request details, le proxy conserve chaque requête faite par la machine, avec son hôte, sa méthode et son chemin, ainsi que toute la conversation avec le modèle, chiffrée sur le Mac. Le Trace Inspector montre le tour où le modèle a décidé d'envoyer, à côté de la requête qu'il a faite. bromure-cli trace hostnames liste chaque hôte contacté par la machine, avec le nombre de requêtes, si bien qu'un site avec lequel le projet n'a rien à faire ressort dans une liste de quelques dizaines de noms. Un relecteur lit un écran, pas dix semaines de transcriptions.

Les exécutions sans surveillance suivent les mêmes règles

Les incidents du rapport se sont produits dans des exécutions automatisées que personne ne regardait. Les Automations de Bromure, des exécutions d'agent planifiées ou déclenchées, tournent sur une machine sous les guardrails et le pare-feu de cette machine. Une exécution à 23 h 27 rencontre les mêmes règles qu'une exécution que vous regardez à midi, et ses blocages arrivent dans la même timeline.

Dans Bromure : l'agent lit tout, et écrit là où le Mac le permetVM de la machine (Ubuntu)GET /case/… → pagePOST /tip → 403via fetch, curl, Pythonou une URL raccourcie :même requête sur le réseaumodèle : « envoie le formulaire »Switch + proxy, sur le Macallow web api.anthropic.comallow web github.comallow web registry.npmjs.orgallow web pypi.orgallow web any:80,443 read-onlydefault denyPOST vers phillyunsolvedmurders.com→ 403, bloqué par Bromure GuardrailsFormulairea servi la pageenvoisreçus : aucunSecurity Timeline, la minute même18 juil. 23:27 · evals · Guardrails · POST phillyunsolvedmurders.com/… · bloquéLa trace conserve la méthode, l'hôte et le chemin, et le tour du modèle qui l'a demandé, chiffrés sur le Mac.
Le même signalement dans une machine Bromure. L'agent peut lire la page et remplir le formulaire. Le POST traverse le proxy sur le Mac, correspond à la règle en lecture seule et reçoit un 403, et la Security Timeline l'enregistre la minute même.

Le correctif d'Anthropic, sur votre portable

La liste de remédiations d'Anthropic comprend le retrait ou la refonte des évaluations pour qu'elles ne touchent plus de sites réels, le durcissement de son outil de fetch, le passage de ses agents internes sur une « infrastructure gérée de façon centralisée » avec un accès internet réduit, et une surveillance automatisée qui, en test, a bloqué tous les cas du rapport. C'est un labo doté de sa propre équipe d'infrastructure qui reconstruit son harnais.

Un développeur qui fait tourner Claude Code, Codex ou n'importe quel autre agent sur un portable a besoin des trois mêmes choses : une limite qui ne soit pas une phrase, vérifiée à un endroit que l'agent ne peut pas modifier, et une trace que quelqu'un voit le jour même. Une machine Bromure vous donne la règle de pare-feu, le proxy sur le Mac et la Security Timeline sans rien reconstruire.

Lit partout, écrit là où c'est listé

Une seule règle de pare-feu donne à l'agent toutes les pages web en GET et HEAD, et réserve POST, PUT et DELETE aux hôtes qu'utilise le projet. Un envoi vers n'importe quoi d'autre reçoit un 403 du proxy sur le Mac.

Changer d'outil ne change pas la réponse

Le contrôle porte sur la requête une fois sortie de la VM. Fetch, curl, Python, une URL raccourcie ou un jeton tiré d'un fichier de configuration aboutissent tous à la même requête, et à la même règle.

Les clés configurées demandent avant d'écrire

Les nouvelles machines mettent chaque service configuré sur Prompt before write. Un push, un envoi ou une modification cloud s'arrête sur une boîte de dialogue sur le Mac qui montre l'opération exacte.

Le blocage est consigné à la minute

Chaque refus est une ligne de la Security Timeline avec l'hôte, la méthode et le chemin, conservée 90 jours. La trace garde le tour du modèle qui l'a demandé.

Le prochain formulaire

Anthropic s'attend à trouver d'autres cas à mesure que sa revue avance. Ses modèles ont rempli des demandes de visa et un signalement à la police pendant des tests, avec des instructions écrites par ceux qui les ont entraînés. Votre agent tombera sur une fixture cassée, une URL de staging ou une page d'inscription à lui, avec des instructions écrites à la hâte.

Écrivez votre limite sous forme de règle de pare-feu sur le Mac et gardez la ligne de CLAUDE.md comme aide-mémoire. Pour les incidents de juillet qui ont déclenché la revue d'Anthropic, lisez La sandbox était une phrase, et pour la version OpenAI de la même histoire, La tâche était impossible, alors l'agent est sorti.