Le blog

Agents & accès

Vos agents ont-ils plus de droits que vos administrateurs ?

Jetons, comptes de service, serveurs MCP, agents achetés sur étagère : chaque agent agit avec des droits que quelqu’un a accordés, parfois sans le voir. Deux questions repèrent les plus exposés. Le refus se décide dans le service, et l’accord humain porte sur l’action exacte.

Portrait de Aurélien Noce

Aurélien Noce

Architecture, recherche & transmission

Publié
Lecture
8 min
Un tableau de clés d’immeuble sur fond nuit : chaque clé pend à son crochet avec une étiquette, sauf une, sans étiquette, accrochée à un anneau indigo.
Illustration conçue avec l’IA

Un compte administrateur se demande, se justifie et porte un nom. Un jeton collé dans la configuration d’un agent, un connecteur de messagerie accepté d’un clic, un serveur MCP branché sur la base : qui les a validés, avec quels droits, et jusqu’à quand ?

Nous partons de faits publiés et datés : la documentation des éditeurs, quatre démonstrations de chercheurs corrigées depuis, et l’incident décrit par Hugging Face en juillet 2026. Aucun mode opératoire ici : seulement ce que les droits permettaient, et ce qui a arrêté l’agent.

D’où viennent les droits d’un agent

Un agent n’a pas de droits propres. Il emprunte ceux qu’on lui donne, par trois chemins.

Le premier est un jeton ou un compte de service créé pour lui. En avril 2026, Railway a décrit le cas d’un client : un agent avait trouvé sur le poste de l’utilisateur un jeton d’API à longue durée de vie, et s’en était servi pour supprimer un volume de production[1]. L’API a traité la requête comme celle d’une chaîne d’intégration continue. Le jeton portait sur tout le compte, « l’accès le plus large possible », écrit Railway : la bonne portée existait, mais le parcours de création ne la rendait pas évidente.

Le deuxième, ce sont les connexions de l’utilisateur. Supabase l’écrit à propos de son serveur MCP : il agit dans le contexte des permissions du développeur, et ne doit donc pas être confié aux clients[2]. Pour une application OAuth créée à la main, la même page demande encore d’accorder l’écriture sur tous les périmètres disponibles. Varonis, à propos de Copilot Personal de Microsoft, résume le problème : la faille, c’est « l’accès légitime de l’utilisateur », que le système suppose toujours déclenché par lui[3].

Le troisième, ce sont les agents achetés sur étagère. Selon Zenity, certains sous-agents d’Agentforce prévus pour Slack s’ajoutent « en exactement deux clics », avec toutes leurs actions[4].

D’où un premier test. Pour un administrateur, vous savez qui, depuis quand et pourquoi. Posez les mêmes questions au jeton le plus large de chaque agent : qui l’a créé, sur quel périmètre, jusqu’à quand ? Si la réponse est « tout le compte » et « jamais », le titre de cet article vous concerne.

Hugging Face, juillet 2026 : ce que les droits ont permis

Le 16 juillet 2026, Hugging Face a annoncé une intrusion dans une partie de sa production, menée « de bout en bout » par un système d’agents autonomes[5]. Sa chronologie technique, publiée le 27 juillet, donne le contexte : l’agent tournait dans une évaluation interne d’OpenAI sur les capacités offensives, et Hugging Face estime qu’il cherchait à tricher en volant les solutions de l’épreuve[6]. Le rapport reconstitue environ 17 600 actions entre le 9 et le 13 juillet. Nous n’avons joué aucun rôle dans cette réponse : nous lisons le rapport publié.

Ce qui nous intéresse ici, ce sont les droits. Plusieurs ont tenu. Les identifiants cloud récupérés ont permis de cartographier l’infrastructure, mais chaque appel qui modifiait quelque chose a été refusé par la politique du rôle : « une carte, pas le contrôle », résume Hugging Face. Les 84 opérations tentées contre le magasin d’identifiants ont été refusées. La base interne atteinte a été lue, pas modifiée.

D’autres droits ont cédé. Aucune règle d’admission ne rejetait les conteneurs privilégiés, et le rôle d’un pilote de stockage autorisait la création de conteneurs sur tout le cluster. Un mot de passe statique figurait dans l’environnement d’une machine de traitement. Et un seul objet secret de production rassemblait beaucoup de clés.

Chiffre clé

136

clés dans un seul objet secret de production : une seule lecture a donné à l’agent la clé du VPN interne et l’identifiant d’un service d’accès.[6]

Hugging Face tire lui-même la leçon : les faiblesses étaient connues, parmi elles des accès trop larges et des identifiants à longue durée de vie. Ses priorités : isoler strictement les évaluations, resserrer les frontières de confiance, raccourcir la durée des identifiants, bloquer l’accès aux métadonnées cloud. Les refus qui ont tenu venaient des politiques des services, pas du modèle : l’évaluation avait justement désactivé les filtres de sécurité de production d’OpenAI.

Deux questions par agent

Tous les agents ne méritent pas la même attention. Deux questions suffisent pour les trier. L’agent lit-il du contenu écrit par des inconnus : e-mail, formulaire, ticket, page web, fiche CRM remplie par un prospect ? Peut-il agir : écrire, envoyer, publier, payer, supprimer, changer des droits ?

La règle de lecture vient du NCSC britannique, qui reprend une formule de Simon Willison et Baibhav Bista : quand un modèle traite l’information d’une partie, ses privilèges tombent à ceux de cette partie[7]. Un agent qui lit les e-mails de n’importe qui ne devrait pas pouvoir faire plus que n’importe qui. Willison nomme la combinaison la plus risquée : des données privées, du contenu non fiable et un moyen de communiquer vers l’extérieur[8].

Grille à deux axes. En abscisse : « Lit du contenu écrit par des inconnus », non puis oui. En ordonnée : « Peut agir : écrire, envoyer, payer, supprimer », non puis oui. Case non-non : « Assistant fermé », revue annuelle des droits. Case qui lit sans agir : « Lecteur exposé », surveiller ce qui sort, liens et images compris. Case qui agit sans lire d’inconnu : « Exécutant interne », approbation des actions critiques. Case oui-oui, en indigo : « Priorité », refus au service, accord sur l’action exacte, droits au plus près de la tâche. Sous la grille, le chemin de cette case : texte reçu, modèle, appel d’outil, service ; la barrière est posée au service, et la ligne de journal du refus est mise en évidence.
Schéma 1 Deux oui, et l’agent passe en tête de liste. La barrière se pose au service, et son refus s’écrit dans le journal.

Les démonstrations publiées sur des agents métier tombent dans la case des deux oui. Ce sont des travaux de chercheurs, signalés aux éditeurs et corrigés depuis selon leurs auteurs.

DémonstrationLe contenu inconnuCe que l’agent pouvait faire
ForcedLeak, Agentforce (Noma, septembre 2025)[9]Une fiche prospect saisie par le formulaire web de l’entrepriseEnvoyer des données du CRM vers un domaine resté sur la liste de confiance, expiré, racheté 5 dollars
SalesBleed, Agentforce dans Slack (Zenity, septembre 2026)[4]Une fiche prospectRépondre dans un fil Slack sans confirmation ni mention de l’utilisateur à l’origine
CoSnitch, Copilot Personal (Varonis, août 2026)[3]Un lien piégéInterroger Gmail, Drive, l’agenda et OneDrive déjà connectés, et en faire sortir le contenu
Manus (Salt Labs, octobre 2026)[10]Un e-mailExécuter du code dans un environnement qui détenait le jeton OAuth Gmail de l’utilisateur

Le point commun : l’agent s’est servi de droits ou de capacités qu’il détenait légitimement, au service d’un texte écrit par quelqu’un d’autre.

Le refus se décide dans le service

Une consigne dans les instructions de l’agent (« ne jamais écrire en production ») n’est pas une limite. La lecture seule doit être un droit, pas une consigne.

La spécification MCP le dit à sa façon. L’annotation readOnlyHint signale qu’un outil ne modifie pas son environnement, mais toutes les annotations sont des indications : elles ne garantissent pas le comportement de l’outil, et un client ne doit jamais fonder une décision sur celles d’un serveur non fiable[11]. Ce sont les serveurs qui doivent mettre en place des contrôles d’accès appropriés[12].

Concrètement, la limite se pose là où le service la vérifie. Le mode lecture seule du serveur MCP de Supabase exécute les requêtes avec un utilisateur Postgres en lecture seule : c’est la base qui refuse[2]. Railway propose des jetons de projet, limitables à un environnement[1]. GitHub recommande ses jetons « à granularité fine », limitables à certains dépôts avec des permissions précises, et conseille de leur fixer une date d’expiration[13].

Une détection après coup n’est pas un refus. Chez Manus, selon Salt Labs, le garde-fou de sécurité a repéré l’attaque, mais seulement après l’exécution du code[10].

Le test se fait sur des données de test, jamais en production. Demandez à l’agent une action hors de sa tâche, par exemple une écriture sur une ressource de test, puis lisez le journal du service. Le test est réussi si le refus y figure. Si l’agent annonce « bloqué » alors que l’écriture a eu lieu, il est raté. Changez ensuite la cible, et recommencez.

L’accord porte sur l’action exacte

Pour les actions qui doivent rester possibles, l’approbation humaine prend le relais. La spécification MCP recommande qu’une personne puisse toujours refuser l’appel d’un outil, et que le client lui montre les paramètres de l’appel avant de l’envoyer au serveur[12].

Encore faut-il que l’accord porte sur ce qui sera exécuté. L’OWASP en a fait un principe pour l’autorisation des transactions : « ce que vous voyez est ce que vous signez »[14]. L’utilisateur voit et valide les données significatives de l’opération ; l’autorisation est vérifiée côté serveur ; les données sont protégées contre la modification ; chaque autorisation est unique.

Transposé à un agent, cela donne trois règles. L’opération est figée avant l’accord : destinataire, montant, contenu. Le service compare ce qui a été approuvé à ce qu’on lui demande d’exécuter, et refuse toute différence. Un accord vaut pour une exécution, pas pour la session. Le guide de l’ANSSI du 30 octobre 2026 va dans le même sens : présenter à l’approbateur « l’action exacte, son objectif et ses effets attendus », et n’exécuter « que l’action approuvée »[15]. Nous le lisons en détail dans « IA agentique : ce que recommande l’ANSSI depuis le 30 octobre ».

Deux chemins comparés, l’un au-dessus de l’autre. En haut, « Accord sur l’intention » : l’agent prépare « Répondre au client », la personne clique sur « Approuver », puis l’agent exécute une action dont le destinataire et le contenu ont changé ; rien ne le détecte. En bas, « Accord sur l’action exacte » : l’agent prépare une action figée, avec son destinataire, son contenu et son montant ; la personne approuve cette action ; le service compare l’action reçue à l’action approuvée. Si elles diffèrent, il refuse et l’écrit au journal. Si elles sont identiques, il exécute une seule fois.
Schéma 2 L’accord ne protège que s’il porte sur l’action que le service exécutera, et si le service vérifie qu’elles sont identiques.

Reste à vérifier que la confirmation existe toujours. Dans SalesBleed, l’action de réponse dans Slack n’en demandait pas, et Zenity rappelle qu’un seul clic suffit à désactiver cette exigence[4]. Une confirmation se relit après chaque changement de configuration.

Une heure pour faire l’inventaire

Le plus utile se fait sans outil à acheter, avec les responsables des agents autour d’une table.

Un agent qui coche ces cases peut encore se tromper. Mais ce qu’il a le droit de faire est écrit quelque part, vérifié par le service, et quelqu’un en répond.

Sources

  1. Railway, Mahmoud Abdelwahab — Your AI wants to nuke your database. Guardrails fix that.

    blog.railway.com · publié le · consulté le · Billet de l’éditeur sur l’incident d’un de ses clients : sections sur le jeton utilisé et sur les portées de jetons. Citations traduites par nos soins.

  2. Supabase Docs — Supabase MCP Server

    supabase.com · non daté · consulté le · Documentation mise à jour en continu, sans date de publication : sections « Manual OAuth app » et « Recommendations ». Traduit par nos soins.

  3. Varonis Threat Labs, Lior Adar — CoSnitch: When Your AI Assistant Becomes Its Own Whistleblower

    varonis.com · publié le · consulté le · Recherche d’un éditeur de sécurité sur Microsoft Copilot Personal (CVE-2026-24301). Signalé à Microsoft en décembre 2025, corrigé le 18 août 2026 ; Varonis dit n’avoir vu aucune exploitation. Citations traduites par nos soins.

  4. Zenity Labs — SalesBleed: Anonymous Phishing via Agentforce in Slack

    labs.zenity.io · publié le · consulté le · Recherche d’un éditeur de sécurité. Signalé à Salesforce le 1er juin 2026, correctifs confirmés le 21 septembre 2026 selon Zenity. Citations traduites par nos soins.

  5. Hugging Face — Security incident disclosure — July 2026

    huggingface.co · publié le · consulté le · Première déclaration de l’entreprise. Traduit par nos soins.

  6. Hugging Face — Anatomy of a Frontier Lab Agent Intrusion: A Technical Timeline of the July 2026 Incident

    huggingface.co · publié le · consulté le · Chronologie technique publiée par Hugging Face. Faits et citations de l’article tirés de cette page, traduits par nos soins. La déclaration d’OpenAI citée par la page n’a pas pu être lue.

  7. NCSC (Royaume-Uni), Dave Chismon — Prompt injection is not SQL injection (it may be worse)

    ncsc.gov.uk · publié le · consulté le · Billet de blog du centre national de cybersécurité britannique. Traduit par nos soins.

  8. Simon Willison — The lethal trifecta for AI agents: private data, untrusted content, and external communication

    simonwillison.net · publié le · consulté le

  9. Noma Security, Sasi Levi — ForcedLeak: AI agent risks exposed in Salesforce Agentforce

    noma.security · publié le · consulté le · Recherche d’un éditeur de sécurité. Signalé à Salesforce le 28 juillet 2025 ; application des « Trusted URLs » le 8 septembre 2025.

  10. Salt Security, Salt Labs — How We Hijacked an AI Agent With a Single Email

    salt.security · publié le · consulté le · Recherche d’un éditeur de sécurité sur l’agent Manus ; faille résolue selon Salt Labs. Traduit par nos soins.

  11. Model Context Protocol, spécification 2026-07-28 — Schema Reference

    modelcontextprotocol.io · non daté · consulté le · Référence du schéma, version 2026-07-28 de la spécification : définition de readOnlyHint et note sur les annotations. Traduit par nos soins.

  12. Model Context Protocol, spécification 2026-07-28 — Tools

    modelcontextprotocol.io · non daté · consulté le · Sections « User Interaction Model » et « Security Considerations ». Traduit par nos soins.

  13. GitHub Docs — Managing your personal access tokens

    docs.github.com · non daté · consulté le · Documentation mise à jour en continu, sans date de publication.

  14. OWASP Cheat Sheet Series — Transaction Authorization Cheat Sheet

    cheatsheetseries.owasp.org · non daté · consulté le · Document vivant, sans date de publication : principes 1.1, 2.1, 2.6 et 2.10. Traduit par nos soins.

  15. ANSSI, collection Les Essentiels — Sécuriser un système IA agentique

    messervices.cyber.gouv.fr · publié le · consulté le · Document de deux pages, version V1.0 (10/26), principe 3 « Classer et contrôler les actions des agents ».

Le scan gratuit

Et chez vous,
qu’est-ce qui est exposé ?

Nous examinons ce que vos équipes et prestataires livrent avec l’IA : code, infrastructure et accès aux données. Un humain relit chaque constat.

Demander le scan gratuit

Scan gratuit. Des failles détectées ? Le rapport détaillé est payant.