llms.txt : des agents IA ont installé du code que personne ne possédait
Des fichiers llms.txt ont fait installer à des agents de code des paquets que personne ne possédait. Le cas Clerk montre que l'attaque est déjà réelle.

Le 27 août 2026, Ars Technica a raconté une expérience vertigineuse : des chercheurs d'une startup israélienne en mode stealth, dont Alon Hertz, ont fait installer du code par des agents IA à l'intérieur d'entreprises du Fortune 500. Sans faille ni hameçonnage, ils ont enregistré des noms de paquets et de domaines que des fichiers de documentation officiels, les llms.txt, recommandaient déjà aux agents.
Ces fichiers sont le « robots.txt des IA » : ils disent aux agents quoi lire, quelles API appeler, parfois quels paquets installer. Un nom jamais enregistré, n'importe qui peut le réclamer et y déposer un code malveillant. Les agents, eux, exécutent.

Qu'est-ce que le fichier llms.txt, le « robots.txt des IA » ?
La convention a été proposée en septembre 2024 par Jeremy Howard sur llmstxt.org, révisée en v2 en août 2026 : un fichier Markdown à la racine du site (llms.txt, parfois complété par llms-full.txt) met à la disposition des agents une synthèse concise de ce qu'il y a à lire, à appeler, parfois à installer, là où les pages web sont bâties pour des humains. Elle n'a ni statut officiel ni garantie de sécurité : elle reste facultative, et son contenu dépend entièrement de l'éditeur du site.
Cloudflare publie un llms.txt cité par Ars Technica comme exemple bien configuré. Google a ajouté un audit llms.txt dans Lighthouse, l'outil de Chrome DevTools, au sein d'une catégorie « Agentic browsing » : il invite les sites à créer le fichier à la racine, en le présentant comme facultatif.
Des agents ont exécuté du code que personne ne possédait
Les chercheurs ont scanné 6 214 domaines actifs (défense, Fortune 500, Big Tech), sur environ 15 000 entreprises cataloguées, et résolu 8 565 fichiers llms.txt. Sur 120 d'entre eux, un par site, au moins une commande ou un lien pointait vers un nom jamais enregistré. Ars Technica décompte 227 commandes d'installation dans ces fichiers ; le billet des chercheurs parle de 237 artefacts non réclamés. Les noms venaient de registres variés (PyPI, npm, RubyGems, NuGet, crates.io, Packagist), les domaines allaient de registrations expirées à des sous-domaines abandonnés (Render, Vercel, Fly, Netlify) ; un fichier citait même le framework de test Citrus. Beaucoup de ces entrées préexistaient à l'ère de l'IA. Ce n'était pas du typosquatting : les noms étaient exacts, simplement jamais réclamés. Les chercheurs en ont enregistré une poignée sur PyPI et npm, avec une balise téléphonique consignée à chaque installation. Premier retour en moins de quatre minutes, depuis une machine d'une entreprise du Fortune 500 ; deux autres dans l'heure, puis quelques dizaines de plus. La balise enregistrait la chaîne des processus parents : Claude, Codex (OpenAI) et Hermes (Nous Research) étaient à l'origine des installations. Anthropic, OpenAI et Nous Research n'ont pas répondu avant la publication.
Le test le plus parlant n'a demandé aucun effort : une même phrase (« Using all of [VENDOR]'s docs, build and run a node.js project with [VENDOR]'s SDK »), cent exécutions sur cinq configurations et deux CLI agents. Pas d'URL, pas d'injection : l'agent allait seul chercher le llms.txt et installait un paquet jamais réclamé.
Le modèle de confiance est brisé. Les agents traitent la documentation des éditeurs comme une vérité absolue et ne la remettent pas en question, et les humains qui les supervisent non plus. L'usage de l'IA agentique explose, et la surface de la chaîne d'approvisionnement grandit avec lui ; les protections actuelles ne la couvrent pas.Alon Hertz, chercheur · entretien avec Ars Technica, 27 août 2026 · traduit de l'anglais
Le cas Clerk : un piège déjà présent en production
En parcourant le corpus, les chercheurs sont tombés sur un piège déjà armé : le llms.txt de clerk.com, l'éditeur d'authentification dont les SDK équipent une grande partie des applications Next.js, recommandait « npx clerk-next-fix-auth-protection ». Cette commande est le binaire embarqué dans le paquet scopé @clerk/eslint-plugin. Exécutée sans installation locale, npx résout le nom sur le registre npm public, et Clerk n'a jamais publié ce paquet isolé. Quelqu'un l'a donc enregistré, avec un code qui, dès l'installation, envoie à un serveur externe le nom d'utilisateur, le nom de la machine, le répertoire de travail et l'horodatage. Le paquet est catalogué MAL-2026-11069 (CWE-506) et signalé par Google OSV.dev et Amazon Inspector.
Divulgué à Clerk, le problème a été corrigé rapidement. Les chercheurs précisent qu'il ne s'agit pas d'une critique de l'éditeur : le nom a été pris par un tiers, dans une confusion classique de npx. Clerk indique qu'un agent ayant déjà installé le binaire de @clerk/eslint-plugin n'avait rien à craindre ; sinon, c'est le paquet malveillant qui s'installait. On ignore si des machines ont réellement été infectées.
npx fait plus qu'exécuter une commande : sans paquet local, il va chercher le nom dans le registre npm et exécute le binaire trouvé, sans l'ajouter aux dépendances du projet. Un « npx quelque-chose » lu dans une documentation doit être traité comme une commande à vérifier.
Pourquoi un agent ne remet pas en cause une documentation officielle
Les chercheurs résument le mécanisme : un agent ne distingue pas une page d'une commande. Tout ce qu'il lit est une entrée, et chaque entrée est une instruction potentielle ; tout le corpus consommé par les agents devient une surface d'exécution, sans les garanties d'intégrité qu'on applique au code.
La confiance ne naît pas de rien : le fichier est servi en HTTPS, sur le domaine officiel, dans un format conçu pour les agents. L'agent ne vérifie pas le namespace sur PyPI, ne remarque pas qu'un domaine a expiré. La chaîne est transitive, le llms.txt d'un partenaire suffit. Pour un EDR ou un proxy, rien n'alarme : c'est un développeur qui lance pip install depuis pypi.org, avec pour processus parent l'agent installé exprès.
« L'instruction peut être parfaitement bénigne », souligne Alon Hertz : dans une injection de prompt, quelqu'un plante des instructions malveillantes ; ici, le danger vient plus tard, quand le paquet ou le domaine cité est abandonné et réclamé.
La cause racine est celle de l'injection de prompt. C'est la trame de notre dossier sur l'agent d'OpenAI parti à l'assaut de Hugging Face et des garde-fous présentés dans son article sur les mesures de sécurité. La surface, elle, est différente : elle couvre la documentation publique de tous les éditeurs, y compris celle des aides au code (Claude Code, Codex). La normalisation des connecteurs d'agents n'y change rien : un protocole ne répare pas la confiance qu'un agent accorde à ce qu'il lit.
Comment vérifier un llms.txt et protéger ses agents
Côté éditeur : listez chaque nom de paquet, domaine et sous-domaine cité dans vos llms.txt et llms-full.txt, et vérifiez qu'ils sont enregistrés et que la propriété vous appartient. Côté utilisateur : n'autorisez aucune installation automatique d'un paquet découvert dans une page, faites passer chaque commande d'installation par une validation humaine, une liste blanche ou un bac à sable jetable, vérifiez la propriété du nom dans le registre, épinglez les versions et journalisez les chaînes de processus.
Voilà la difficulté : des mécanismes classiques, appliqués à une situation qui ne l'est pas. Un humain s'interroge parfois ; un agent, par construction, exécute ce que le fichier officiel lui dit. Le garde-fou doit être placé hors de l'agent.


