Una vulnerabilità dei share link di ChatGPT consentiva l’accesso alle chat private
Una vulnerabilità dei share link di ChatGPT consentiva l’esecuzione di codice controllato da un attaccante all’interno della sessione autenticata di un’altra persona e l’accesso a conversazioni private, come dimostrato dalla società di sicurezza Parameter. Un share link è un indirizzo web pubblico che permette di mostrare una conversazione a qualcuno. La vulnerabilità è stata corretta e Parameter ha dichiarato di non aver trovato prove del suo sfruttamento ai danni di utenti reali.
Parameter ha segnalato la vulnerabilità tramite il bug bounty program di OpenAI, che premia i ricercatori per la segnalazione responsabile di problemi di sicurezza, il 18 ottobre. OpenAI ha riprodotto il test di esecuzione del codice e accesso alla chat privata, ha innalzato la valutazione della gravità da P2 a P1, la sua categoria più grave, e ha corretto il problema otto giorni dopo la segnalazione. Parameter ha pubblicato i risultati il 28 ottobre, dopo l’implementazione della correzione, e ha ricevuto un pagamento complessivo di 5.000 dollari.
L’attacco iniziava con una conversazione altrimenti normale, condivisa tramite la funzione di link pubblico di ChatGPT. Un link malevolo avrebbe potuto essere recapitato tramite email, messaggio di chat, ticket di assistenza o post sui social media, proprio come una normale conversazione condivisa. Il destinatario non doveva installare software, entrare in un workspace controllato dall’attaccante né effettuare l’accesso tramite una pagina fornita dall’attaccante.
Nel test più affidabile, il destinatario apriva il link e faceva clic una volta sul pulsante Preview di ChatGPT. Preview trasforma HTML, il codice usato per strutturare le pagine web, in una piccola pagina web all’interno di una conversazione. In seguito Parameter ha configurato Preview in modo che si aprisse automaticamente, riducendo l’interazione necessaria alla sola apertura del link condiviso.
Una volta attivato, il codice di test veniva eseguito con i privilegi di accesso della sessione ChatGPT autenticata della vittima. Elencava le conversazioni recenti, apriva una chat privata che non era mai stata condivisa con l’altro account e trasmetteva un breve estratto a un server controllato da Parameter. I ricercatori hanno eseguito questa prova controllata utilizzando account di test separati, non contro utenti ignari.
Il codice non si limitava a copiare le informazioni visibili sullo schermo. Chiamava direttamente le API autenticate di ChatGPT. Un’API, ossia un’interfaccia di programmazione delle applicazioni, è un canale usato dal software per richiedere dati o azioni a un altro servizio. Poiché il codice operava con l’accesso web della vittima, Parameter ha affermato che non era limitato alla lettura delle chat e poteva di fatto eseguire azioni per conto dell’account.
Normalmente ChatGPT isola i contenuti di Preview all’interno di una sandbox, un’area limitata progettata per impedire al codice web non attendibile di raggiungere il servizio circostante. Preview veniva eseguito in un frame, una pagina web incorporata in un’altra pagina, su un indirizzo web separato. Parameter ha riscontrato che questo isolamento funzionava come previsto. La via di fuga dipendeva invece da un grafico interattivo inserito nella stessa conversazione condivisa.
Il rendering di quel grafico caricava MathLive, una libreria software per la matematica, nella pagina principale di ChatGPT. MathLive lasciava in esecuzione un listener per ricevere messaggi relativi alla propria tastiera visualizzata sullo schermo. I frame del browser possono scambiarsi messaggi in sicurezza quando il codice ricevente verifica l’origine di ciascun messaggio. Secondo Parameter, questo listener accettava da qualsiasi mittente un messaggio relativo alla tastiera e consentiva che contenesse HTML grezzo come dati del layout della tastiera.
La Preview isolata poteva quindi inviare HTML fornito dall’attaccante oltre il confine di isolamento, verso la pagina ChatGPT attendibile. Quell’HTML creava un altro frame che il browser considerava appartenente a chatgpt.com anziché trattarlo come contenuto isolato. Uno script caricato da YouTube forniva quindi il codice eseguibile che veniva eseguito all’interno di questo frame attendibile.
Questo passaggio finale funzionava perché la content security policy di ChatGPT, una regola del browser che limita le origini da cui una pagina può caricare script eseguibili, bloccava il codice scritto direttamente nella pagina ma permetteva gli script provenienti da YouTube. Parameter ha sottolineato che il percorso tramite YouTube era soltanto l’ultima soluzione alternativa, non la causa di fondo. Bloccare unicamente quella fonte avrebbe comunque consentito a una Preview non attendibile di iniettare HTML nel sito principale.
I ricercatori hanno individuato tre decisioni progettuali alla base della catena. MathLive agiva in risposta a un messaggio che modificava le impostazioni senza verificare quale frame lo avesse inviato. Il messaggio poteva contenere HTML grezzo come informazioni sul layout della tastiera. Quell’HTML poteva quindi creare un frame privo di sandbox che ereditava l’identità di chatgpt.com.
OpenAI ha distribuito la correzione su due versioni del web frontend di ChatGPT, la parte del servizio che viene eseguita nel browser dell’utente. Entro il 26 ottobre, entrambe le versioni rifiutavano i messaggi necessari per l’attacco. Poiché la modifica è stata apportata lato servizio, gli utenti di ChatGPT non devono installare un aggiornamento, reimpostare alcunché o adottare altre misure correttive per questa vulnerabilità.
Per le organizzazioni che valutano i rischi legati alle applicazioni web e agli account aziendali autenticati, AEU-I offre servizi IT, infrastrutture e consulenza con la sicurezza come priorità. La lezione più generale tratta dal test di Parameter è che un componente isolato può rimanere sicuro mentre un altro componente attendibile apre un percorso imprevisto che aggira tale isolamento, rendendo essenziali controlli rigorosi sull’origine e sul contenuto dei messaggi del browser.