alexi.sh
Tous les articlesSécurité navigateurConfidentialité réseauOutils de confidentialitéModélisation des menacesCodage IAOutils de dev

alexi.shLabo IA

ai-coding

Une pull request empoisonnée, deux agents : le premier exploit de chaîne d'approvisionnement d'agent contre agent

PrivSec Lab5 min de lecture
Un mannequin articulé en bois debout sur une table blanche, dont les ficelles sont tenues par une main humaine au-dessus de lui

Un chercheur a transformé un bot à faible privilège du dépôt Agent Development Kit de Google en levier contre un bot à privilège élevé. Google a corrigé et refusé la prime. Les deux positions se défendent, et c'est là que ça devient intéressant.

Le chercheur en sécurité Dan Lisichkin, de Pillar Security, a fait dans le dépôt de l'Agent Development Kit de Google quelque chose qui n'avait pas été démontré publiquement jusque-là : il s'est servi d'un agent IA pour en attaquer un autre.

Le décor est banal, et c'est précisément ce qui rend l'affaire intéressante. Le dépôt google/adk-python, que ses mainteneurs annoncent à plus de 90 millions de téléchargements, fait tourner des agents sur ses propres pull requests. L'un d'eux est un relecteur exposé au public, que la contribution de n'importe qui peut atteindre. Il fonctionne avec un jeton d'accès personnel de collaborateur, autrement dit modeste. Un autre agent se tient plus en profondeur, avec des privilèges de mainteneur.

Le mécanisme

Une pull request, ce n'est pas seulement du code. C'est un titre, un corps, un diff et des commentaires, et tout cela est du texte qu'un agent lit. Lisichkin a placé une injection de prompt dans ce texte. Le relecteur à faible privilège l'a lu, et au lieu de se contenter de relire, il a agi d'une manière qui a déclenché l'agent à privilège élevé.

Rien n'était cassé au sens strict. Chaque agent a fait ce pour quoi il avait été construit. Le relecteur a lu une entrée non fiable, puisque c'est son métier. Le second agent a fait confiance à un signal venu de l'intérieur du dépôt, puisque l'intérieur du dépôt est censé être sûr. Ce que personne n'avait écrit, c'est la frontière entre les deux, et une frontière non écrite n'est pas appliquée.

Gros plan sur une chaîne en acier sur fond gris, où deux sections sont reliées par un maillon rapide boulonné, plus clair que les autres maillons

Google a corrigé et refusé de payer

C'est le passage sur lequel il vaut la peine de s'arrêter, parce que les deux camps ont un vrai argument.

Google a corrigé le problème. Google a aussi refusé la prime, en disant qu'il ne récompense pas les rapports de vulnérabilité qui exigent de l'ingénierie sociale pour permettre une compromission de la chaîne d'approvisionnement, et en soulignant qu'un mainteneur doit tout de même cliquer sur « fusionner », les pull requests n'étant pas fusionnées automatiquement après une revue par un bot.

Ce n'est pas une esquive. C'est factuellement exact : la chaîne ne se referme que si un humain accepte une pull request malveillante. Beaucoup d'échelles de gravité minorent, à raison, les découvertes qui ont besoin de la coopération d'un humain.

La réponse du chercheur est correcte elle aussi, et elle porte sur la conception plutôt que sur la gravité. Sa position, dans ses propres termes, est que les agents devraient avoir leur propre identité, laquelle détermine à quelles ressources ils ont le droit d'accéder et de quelle manière ils ont le droit d'interagir avec ces ressources. Un agent qui emprunte le jeton d'un humain hérite des permissions d'un humain, et aucune étape de revue ne compense cela.

Il n'est pas nécessaire de désigner un gagnant. La lecture honnête, c'est que cet exploit précis avait besoin d'une erreur humaine, et que l'architecture qu'il expose n'en a pas besoin pour poser problème la prochaine fois.

Pourquoi « un humain doit encore fusionner » vieillira mal

Exiger qu'un mainteneur fusionne est une barrière réelle aujourd'hui. C'est une barrière que toute l'industrie travaille en ce moment à supprimer.

Le sens de la marche, dans le développement agentique, va vers moins de points de contrôle humains, pas plus. Chaque règle de fusion automatique, chaque politique du type « le bot a approuvé, donc ça passe », chaque pipeline où la sortie d'un agent alimente un autre agent sans personne au milieu, retire exactement l'étape sur laquelle Google compte. La mesure d'atténuation est organisationnelle, et les mesures organisationnelles se dégradent.

Quoi faire dans votre propre dépôt

Rien de tout cela n'exige la taille de Google pour s'appliquer. Si vous faites tourner des agents sur vos dépôts :

  • Donnez à chaque agent sa propre identité. Partager un jeton d'accès personnel entre un humain et un bot, ou entre deux bots, revient à ne plus pouvoir restreindre ni révoquer quoi que ce soit indépendamment, et à ne plus pouvoir dire, dans un journal d'audit, qui a fait quoi.
  • Restreignez le jeton à la tâche. Un relecteur a besoin de lire un diff et d'écrire un commentaire. Il n'a pas besoin d'un accès en écriture sur les branches.
  • Traitez tout ce qu'un agent lit depuis l'extérieur comme porteur d'instructions. Le corps d'une pull request écrit par un inconnu mérite la même méfiance qu'un champ de formulaire sur un site public. Notre guide sur la sécurité des agents IA couvre le motif général.
  • Ne laissez pas la sortie d'un agent servir de déclencheur de confiance à un autre. Si l'agent B agit sur la parole de l'agent A, alors qui contrôle l'entrée de A contrôle B.

Ne confondez pas avec les paquets litellm

Un incident distinct touche le même écosystème et se mélange souvent à celui-ci. En mars 2026, des versions malveillantes de litellm, 1.82.7 et 1.82.8, ont été publiées sur PyPI au moyen d'identifiants de mainteneur compromis, dans une fenêtre d'environ trois heures. Quiconque installait google-adk avec extensions pendant cette fenêtre les récupérait.

C'est une compromission de dépendance classique : identifiants volés, paquet empoisonné, fenêtre courte. Cela n'a rien à voir avec des agents qui se parlent. Les deux sont des incidents de chaîne d'approvisionnement, mais les défenses diffèrent, et les traiter comme une seule histoire revient à en corriger une en croyant avoir couvert l'autre.

Ce qu'il faut retenir

La découverte est modeste dans son impact immédiat et considérable dans ce qu'elle signale. Un agent n'est pas un outil qui s'exécute quand on appuie sur un bouton. C'est un acteur qui lit, décide et agit, et dès que vous en avez deux dans le même dépôt avec des privilèges différents, vous avez une frontière de confiance, que vous l'ayez conçue ou non.

Donnez des identités aux agents avant de leur donner des permissions.

Sources

  • Recherche Pillar Security, rapportée par The Register, 3 août 2026.

Photo : Pixabay (source)

Aussi disponible en

FAQ

Quelle est la vulnérabilité de Google ADK ?
Dans le dépôt google/adk-python, une pull request porteuse d'une injection de prompt pouvait pousser un agent de revue public à faible privilège à déclencher un second agent doté de privilèges de mainteneur. Le défaut n'était pas un bug dans l'un ou l'autre agent pris isolément, mais la frontière de confiance entre les deux, que personne n'avait définie.
Qui l'a trouvée ?
Dan Lisichkin, de Pillar Security. Le dépôt est l'Agent Development Kit de Google pour Python, que le projet annonce à plus de 90 millions de téléchargements.
Google a-t-il corrigé ?
Oui, Google a corrigé. Google a en revanche refusé la prime, en indiquant qu'il ne récompense pas les rapports de vulnérabilité qui exigent de l'ingénierie sociale pour permettre une compromission de la chaîne d'approvisionnement, et en rappelant qu'un mainteneur doit tout de même fusionner la pull request malveillante, les pull requests n'étant pas fusionnées automatiquement après une revue par un bot.
Est-ce la même chose que les paquets litellm malveillants ?
Non, et les deux se confondent facilement. En mars 2026, des attaquants ont publié sur PyPI les versions malveillantes 1.82.7 et 1.82.8 de litellm à l'aide d'identifiants de mainteneur compromis, dans une fenêtre d'environ trois heures, ce qui touchait toute installation de google-adk avec extensions. Il s'agissait d'une compromission d'identifiants dans une dépendance. Le problème d'agent contre agent, lui, est un défaut de conception dans la façon dont deux agents se font confiance.
Que faut-il changer concrètement ?
Donner à chaque agent sa propre identité et ses propres identifiants restreints plutôt qu'un jeton partagé, et traiter tout contenu qu'un agent lit depuis une source non fiable, y compris le corps ou le diff d'une pull request, comme une entrée susceptible de porter des instructions.