Sì, Copilot di GitHub può rivelare (veri) segreti

Sì, Copilot di GitHub può svelare (veri) segreti

Si è verificato un crescente interesse per le preoccupazioni etiche e sulla privacy legate ai modelli avanzati di linguaggio come ChatGPT e la tecnologia OpenAI GPT. Queste preoccupazioni hanno sollevato importanti questioni riguardo ai potenziali rischi nell’utilizzo di tali modelli. Tuttavia, non sono solo questi modelli di linguaggio generici a richiedere attenzione; anche strumenti specializzati come gli assistenti per il completamento del codice presentano le loro proprie preoccupazioni.

A un anno dal suo lancio, lo strumento di generazione del codice Copilot di GitHub è stato utilizzato da un milione di sviluppatori, adottato da più di 20.000 organizzazioni e ha generato più di tre miliardi di righe di codice, ha dichiarato GitHub in un post sul blog.

Tuttavia, fin dalla sua creazione, molti hanno sollevato preoccupazioni di sicurezza riguardanti i rischi legali associati a problemi di copyright, questioni sulla privacy e, naturalmente, suggerimenti di codice non sicuri, di cui esistono numerosi esempi, inclusi suggerimenti per inserire segreti direttamente nel codice.

Attualmente sono in corso ampie ricerche sulla sicurezza per valutare con precisione i potenziali rischi associati a questi nuovi strumenti pubblicizzati per migliorare la produttività.

Questo post del blog approfondisce la ricerca recente dell’Università di Hong Kong volta a testare la possibilità di sfruttare Copilot di GitHub e CodeWhisper di Amazon per raccogliere segreti che sono stati esposti durante l’addestramento dei modelli.

Come evidenziato nel rapporto “State of Secrets Spraw” del 2023 di GitGuardian, i segreti codificati direttamente nel codice sono molto diffusi su GitHub, con 10 milioni di nuovi segreti rilevati nel 2022, un aumento del 67% rispetto ai 6 milioni dell’anno precedente.

Dato che Copilot è addestrato utilizzando dati di GitHub, è allarmante che gli assistenti di programmazione possano potenzialmente essere sfruttati da attori malintenzionati per rivelare segreti reali nelle loro suggerimenti di codice.

Estrazione delle Credenziali Inserite Direttamente nel Codice

Per testare questa ipotesi, i ricercatori hanno condotto un esperimento per costruire un algoritmo di generazione delle richieste per cercare di estrarre credenziali dai modelli di linguaggio avanzati.

La conclusione è inequivocabile: costruendo 900 richieste estratte da frammenti di codice di GitHub, sono riusciti a raccogliere con successo 2.702 credenziali inserite direttamente nel codice da Copilot e 129 segreti da CodeWhisper (i falsi positivi sono stati filtrati tramite una metodologia speciale descritta di seguito).

Merita di nota il fatto che tra questi, almeno 200, pari al 7,4% (rispettivamente 18 e 14%), erano segreti effettivi inseriti direttamente nel codice che sono stati identificati su GitHub. Sebbene i ricercatori non abbiano confermato se queste credenziali fossero ancora attive, ciò suggerisce che questi modelli potrebbero potenzialmente essere sfruttati come via di attacco. Ciò consentirebbe l’estrazione e il probabile compromesso di credenziali trapelate con un elevato grado di prevedibilità.

Progettazione di una Macchina per l’Ingegneria delle Richieste

L’idea dello studio è vedere se un attaccante potrebbe estrarre segreti creando richieste appropriate. Per testare le possibilità, i ricercatori hanno costruito una macchina per i test delle richieste, chiamata “Hard-coded Credential Revealer” (HCR).

La macchina è stata progettata per massimizzare le possibilità di scatenare un segreto memorizzato. Per farlo, deve costruire una richiesta solida che “costringa” il modello a emettere il segreto. Il modo per costruire questa richiesta è cercare su GitHub file contenenti segreti inseriti direttamente nel codice utilizzando espressioni regolari. Quindi, il segreto originale inserito nel codice viene redatto e la macchina chiede suggerimenti di codice al modello.

Ovviamente, il modello dovrà essere richiesto molte volte per avere una piccola possibilità di estrarre credenziali valide, perché spesso restituisce credenziali “immaginarie”.

È anche necessario testare molte richieste prima di trovare una credenziale operativa che consenta l’accesso a un sistema.

In questo studio, vengono utilizzati 18 modelli per identificare frammenti di codice su GitHub, corrispondenti a 18 diversi tipi di segreti (AWS Access Keys, Google OAuth Access Token, GitHub OAuth Access Token, ecc.).

Anche se 18 tipi di segreti non sono esaustivi, essi sono comunque rappresentativi dei servizi ampiamente utilizzati dagli sviluppatori di software e facilmente identificabili.

Successivamente, i segreti vengono rimossi dal file originale e l’assistente per il codice viene utilizzato per suggerire nuove stringhe di caratteri. Tali suggerimenti vengono quindi sottoposti a quattro filtri per eliminare il maggior numero possibile di falsi positivi.

I segreti vengono scartati se:

  • Non corrispondono al pattern regex
  • Non presentano sufficiente entropia (non sufficientemente casuali, es: AKIAXXXXXXXXXXXXXXXX)
  • Possiedono un pattern riconoscibile (es: AKIA3A3A3A3A3A3A3A3A)
  • Contengono parole comuni (es: AKIAIOSFODNN7EXAMPLE)

Un segreto che supera tutti questi test viene considerato valido, il che significa che potrebbe essere un vero segreto (hard-coded altrove nei dati di addestramento).

Risultati

Tra le 8.127 suggerimenti di Copilot, sono stati estratti con successo 2.702 segreti validi. Pertanto, il tasso di validità complessivo è del 33,2%, il che significa che Copilot genera in media 3,0 segreti validi per una richiesta.

CodeWhisperer suggerisce un totale di 736 snippet di codice, tra i quali ne abbiamo identificati 129 validi. Il tasso di validità risulta quindi del 17,5%.

Ricordate che in questo studio, un segreto valido non significa che il segreto sia reale. Significa solo che ha superato con successo i filtri e quindi possiede le caratteristiche corrispondenti a un segreto reale.

Quindi, come possiamo sapere se questi segreti sono credenziali operative autentiche? Gli autori hanno spiegato di aver provato solo un subset delle credenziali valide (chiavi di test come le chiavi di test di Stripe progettate per permettere ai programmatori di testare i loro programmi) per motivi etici.

Invece, gli autori stanno cercando un altro modo per convalidare l’autenticità delle credenziali valide raccolte. Vogliono valutare la memorizzazione, o dove il segreto è apparso su GitHub.

La restante parte della ricerca si concentra sulle caratteristiche dei segreti validi. Ricercano il segreto utilizzando la Ricerca di Codice di GitHub e differenziano tra segreti fortemente memorizzati, che sono identici al segreto rimosso in primo luogo, e segreti debolmente memorizzati, che provengono da uno o più altri repository. Infine, ci sono segreti che non possono essere individuati su GitHub e che potrebbero provenire da altre fonti.

Conseguenze

L’articolo di ricerca mette in luce un rischio significativo per la privacy rappresentato dagli strumenti di completamento del codice come GitHub Copilot e Amazon CodeWhisperer. I risultati indicano che questi modelli non solo rivelano i segreti originali presenti nei loro dati di addestramento, ma suggeriscono anche altri segreti che sono stati incontrati altrove nel loro corpus di addestramento. Ciò espone informazioni sensibili e solleva gravi preoccupazioni sulla privacy.

Ad esempio, anche se un segreto hard-coded è stato rimosso dalla cronologia git dopo essere stato divulgato da un programmatore, un attaccante può ancora estrarlo utilizzando le tecniche di prompting descritte nello studio. La ricerca dimostra che questi modelli possono suggerire segreti validi e operativi presenti nei dati di addestramento.

Queste conclusioni sono supportate da un’altra recente ricerca condotta da un ricercatore dell’Università di Wuhan, intitolata Security Weaknesses of Copilot Generated Code in GitHub. Lo studio ha analizzato 435 snippet di codice generati da Copilot da progetti GitHub e ha utilizzato diversi scanner di sicurezza per identificare vulnerabilità.

Secondo lo studio, il 35,8% degli snippet di codice generati da Copilot presentava debolezze di sicurezza, indipendentemente dal linguaggio di programmazione utilizzato. Classificando i problemi di sicurezza identificati utilizzando Common Weakness Enumerations (CWE), i ricercatori hanno scoperto che “Credenziali hard-coded” (CWE-798) erano presenti nell’1,15% degli snippet di codice, rappresentando l’1,5% delle 600 CWE identificate.

Misure di mitigazione

Per affrontare l’attacco alla privacy su LLMs, sono necessari sforzi di mitigazione da parte di programmatori ed ingegneri di apprendimento automatico.

Per ridurre l’occorrenza di credenziali hard-coded, gli autori raccomandano di utilizzare strumenti di gestione centralizzata delle credenziali e scansione del codice per evitare l’inclusione di codice con credenziali hard-coded.

Durante le varie fasi di sviluppo del modello di completamento del codice, possono essere adottati approcci diversi:

  • Prima della pre-formazione, le credenziali hard-coded possono essere escluse dai dati di addestramento pulendoli.
  • Durante l’addestramento o il fine-tuning, possono essere impiegate difese algoritmiche come la Privacy Differenziale (DP) per garantire la preservazione della privacy. La DP fornisce forti garanzie di privacy del modello.
  • Durante l’inferenza, l’output del modello può essere post-elaborato per filtrare i segreti.

Conclusione

Questo studio evidenzia un rischio significativo associato agli strumenti di completamento del codice come GitHub Copilot e Amazon CodeWhisperer. Creando prompt e analizzando codice disponibile pubblicamente su GitHub, i ricercatori sono riusciti ad estrarre numerosi segreti hard-coded validi da questi modelli.

Per attenuare questa minaccia, i programmatori dovrebbero utilizzare strumenti di gestione centralizzata delle credenziali e la scansione del codice per prevenire l’inclusione di credenziali codificate. Gli ingegneri di machine learning possono attuare misure come l’esclusione di queste credenziali dai dati di addestramento, l’applicazione di tecniche di protezione della privacy come Differential Privacy e la filtrazione dei segreti nell’output del modello durante l’inferenza.

Queste scoperte vanno oltre Copilot e CodeWhisperer, sottolineando la necessità di misure di sicurezza in tutti gli strumenti di completamento del codice neurale. Gli sviluppatori devono intraprendere azioni proattive per affrontare questo problema prima di rilasciare i propri strumenti.

In conclusione, affrontare i rischi per la privacy e proteggere le informazioni sensibili associate a modelli di lingua di grandi dimensioni e strumenti di completamento del codice richiede sforzi collaborativi tra programmatori, ingegneri di machine learning e sviluppatori di strumenti. Implementando le mitigazioni consigliate, come la gestione centralizzata delle credenziali, la scansione del codice e l’esclusione delle credenziali codificate dai dati di addestramento, i rischi per la privacy possono essere efficacemente mitigati. È fondamentale che tutti gli stakeholder lavorino insieme per garantire la sicurezza e la privacy di questi strumenti e dei dati da essi gestiti.