alexi.sh
Tutti gli articoliSicurezza del browserPrivacy di reteStrumenti per la privacyModellazione delle minacceProgrammazione con IAStrumenti per sviluppatori

alexi.shLaboratorio di Ingegneria AI

ai-coding

Una pull request avvelenata, due agenti: il primo attacco alla catena di fornitura da agente ad agente

PrivSec Lab5 min di lettura
Un manichino di legno snodabile in piedi su un tavolo bianco, con i fili tenuti da una mano umana sopra di lui

Un ricercatore ha trasformato un bot a basso privilegio del repository Agent Development Kit di Google in una leva contro uno a privilegio alto. Google ha corretto e rifiutato il premio. Entrambe le posizioni reggono, ed è lì che la cosa si fa interessante.

Il ricercatore di sicurezza Dan Lisichkin, di Pillar Security, ha fatto nel repository dell'Agent Development Kit di Google una cosa mai dimostrata pubblicamente prima: ha usato un agente di IA per attaccarne un altro.

L'impianto è ordinario, ed è proprio questo a renderlo interessante. Il repository google/adk-python, che i manutentori dichiarano a oltre 90 milioni di download, fa girare agenti sulle proprie pull request. Uno di questi è un revisore esposto al pubblico, raggiungibile dal contributo di chiunque. Lavora con un token di accesso personale da collaboratore, quindi modesto. Un altro agente sta più all'interno, con privilegi da manutentore.

Il meccanismo

Una pull request non è solo codice. Ha un titolo, un corpo, un diff e dei commenti, e tutto questo è testo che un agente legge. Lisichkin ha inserito una prompt injection in quel testo. Il revisore a basso privilegio l'ha letto e, invece di limitarsi a revisionare, ha agito in un modo che ha attivato l'agente a privilegio alto.

In senso stretto non si era rotto nulla. Ogni agente ha fatto ciò per cui era stato costruito. Il revisore ha letto input non fidato, perché è il suo mestiere. Il secondo agente si è fidato di un segnale proveniente dall'interno del repository, perché l'interno dovrebbe essere sicuro. Ciò che nessuno aveva scritto è il confine tra i due, e un confine non scritto non viene applicato.

Primo piano di una catena di acciaio su sfondo grigio, dove due tratti sono uniti da una maglia rapida avvitata, più chiara delle altre maglie

Google ha corretto e ha rifiutato di pagare

È il passaggio su cui vale la pena fermarsi, perché entrambe le parti hanno un argomento vero.

Google ha risolto il problema. Google ha anche rifiutato il premio, dicendo che non ricompensa le segnalazioni di vulnerabilità che richiedono ingegneria sociale per rendere possibile una compromissione della catena di fornitura, e sottolineando che un manutentore deve comunque cliccare su "unisci", dato che le pull request non vengono unite automaticamente dopo la revisione di un bot.

Non è una scappatoia. È corretto sul piano dei fatti: la catena si chiude solo se una persona accetta una pull request malevola. Molte scale di gravità riducono, a ragione, il peso delle scoperte che hanno bisogno della collaborazione di un essere umano.

Anche la replica del ricercatore è corretta, e riguarda la progettazione più che la gravità. La sua posizione, con le sue parole, è che gli agenti dovrebbero avere una propria identità, che stabilisce a quali risorse è loro consentito accedere e in che modo è loro consentito interagire con quelle risorse. Un agente che prende in prestito il token di una persona eredita i permessi di una persona, e nessuna fase di revisione compensa questo.

Non serve scegliere un vincitore. La lettura onesta è che questo exploit preciso ha avuto bisogno di un errore umano, e che l'architettura che mette in luce non ne avrà bisogno per essere un problema la prossima volta.

Perché "serve comunque un umano che unisca" invecchierà male

Che un manutentore debba unire è una barriera reale oggi. Ed è una barriera che l'intero settore sta lavorando in questo momento a rimuovere.

La direzione di marcia nello sviluppo agentico va verso meno punti di controllo umani, non di più. Ogni regola di unione automatica, ogni politica del tipo "il bot ha approvato, quindi entra", ogni pipeline in cui l'output di un agente alimenta un altro agente senza nessuno in mezzo, toglie esattamente il passaggio su cui Google conta. La mitigazione è organizzativa, e le mitigazioni organizzative si degradano.

Cosa fare nel proprio repository

Niente di tutto questo richiede la scala di Google. Se fai girare agenti sui tuoi repository:

  • Dai a ogni agente una propria identità. Condividere un token di accesso personale tra una persona e un bot, o tra due bot, significa non poter più restringere né revocare nulla in modo indipendente, e non poter più dire da un registro di audit chi ha fatto cosa.
  • Restringi il token al compito. Un revisore deve leggere un diff e scrivere un commento. Non gli serve accesso in scrittura ai rami.
  • Tratta come portatore di istruzioni tutto ciò che un agente legge dall'esterno. Il testo di una pull request scritto da uno sconosciuto merita la stessa diffidenza di un campo di modulo su un sito pubblico. La nostra guida sulla sicurezza degli agenti IA copre lo schema generale.
  • Non lasciare che l'output di un agente sia l'innesco fidato di un altro. Se l'agente B agisce sulla parola dell'agente A, allora chi controlla l'input di A controlla B.

Da non confondere con i pacchetti litellm

Un incidente distinto tocca lo stesso ecosistema e viene spesso mescolato a questo. A marzo 2026 versioni malevole di litellm, la 1.82.7 e la 1.82.8, sono state pubblicate su PyPI tramite credenziali di manutentore compromesse, in una finestra di circa tre ore. Chi installava google-adk con le estensioni durante quella finestra se le portava a casa.

È una classica compromissione di dipendenza: credenziali rubate, pacchetto avvelenato, finestra breve. Non ha nulla a che vedere con agenti che si parlano tra loro. Sono entrambi incidenti di catena di fornitura, ma le difese sono diverse, e trattarli come un'unica storia porta a correggerne uno credendo di aver coperto l'altro.

Cosa portarsi via

La scoperta è modesta nell'impatto immediato e grande in ciò che segnala. Un agente non è uno strumento che parte quando premi un pulsante. È un attore che legge, decide e agisce, e nel momento in cui ne hai due nello stesso repository con privilegi diversi, hai un confine di fiducia, che tu l'abbia progettato o no.

Dai agli agenti un'identità prima di dare loro dei permessi.

Fonti

  • Ricerca di Pillar Security, riportata da The Register, 3 agosto 2026.

Foto: Pixabay (source)

Disponibile anche in

FAQ

Qual era la vulnerabilità di Google ADK?
Nel repository google/adk-python, una pull request che conteneva una prompt injection poteva spingere un agente di revisione pubblico e a basso privilegio ad attivare un secondo agente dotato di privilegi da manutentore. Il difetto non stava in nessuno dei due agenti preso da solo, ma nel confine di fiducia tra i due, che nessuno aveva definito.
Chi l'ha trovata?
Dan Lisichkin, di Pillar Security. Il repository è l'Agent Development Kit di Google per Python, che il progetto dichiara a oltre 90 milioni di download.
Google ha corretto?
Sì, Google ha applicato una patch. Ha invece rifiutato il premio, dichiarando che non ricompensa le segnalazioni di vulnerabilità che richiedono ingegneria sociale per rendere possibile una compromissione della catena di fornitura, e osservando che un manutentore deve comunque unire la pull request malevola, dato che le pull request non vengono unite automaticamente dopo la revisione di un bot.
È la stessa cosa dei pacchetti litellm malevoli?
No, e le due vicende si confondono facilmente. A marzo 2026 alcuni attaccanti hanno pubblicato su PyPI le versioni malevole 1.82.7 e 1.82.8 di litellm usando credenziali di manutentore compromesse, in una finestra di circa tre ore, colpendo chiunque installasse google-adk con le estensioni. Quella era una compromissione di credenziali in una dipendenza. Il problema da agente ad agente è invece un difetto di progettazione nel modo in cui due agenti si fidano l'uno dell'altro.
Cosa conviene cambiare davvero?
Dare a ogni agente una propria identità e credenziali ristrette invece di un token condiviso, e trattare qualsiasi contenuto che un agente legge da una fonte non fidata, compresi il testo e il diff di una pull request, come un input capace di veicolare istruzioni.