Fonte ristampa articolo: AIcore

Fonte originale: CSDN

Fonte immagine: generata da Unbounded AI

GitHub Copilot è uno strumento di generazione automatica del codice basato su linguaggi modello di grandi dimensioni Fin dal suo lancio, è stato accolto favorevolmente da innumerevoli programmatori. Tutti hanno affermato di avere finalmente un artefatto di codice che non richiede lavoro straordinario!

Secondo i dati raccolti a medio termine dal "2023 AI Developer Ecosystem Survey Questionnaire" recentemente lanciato da CSDN, il 90% degli intervistati ha dichiarato di aver utilizzato strumenti di generazione di codice in diversi scenari come produzione, test, intrattenimento, ecc. ., di cui il 35% Le persone dichiarano di utilizzarlo tutti i giorni.

Tuttavia, va notato che sebbene questi strumenti di codifica migliorino l’efficienza del lavoro, hai mai pensato se ciò porti benedizioni o disastri? Il codice generato è davvero sicuro in quanto "pronto all'uso"?

Recentemente, al fine di studiare la sicurezza del codice generato da Copilot, sei ricercatori universitari dell'Università di Wuhan, della Central China Normal University, della Massey University of New Zealand e del Royal Melbourne Institute of Technology hanno condotto uno studio empirico sulle vulnerabilità della sicurezza del codice generato da Copilot. code su GitHub ed è stato pubblicato un documento accademico intitolato "Security Weaknesses of Copilot Generated Code in GitHub", che ha recentemente rivelato la sicurezza dei futuri artefatti di programmazione dell'intelligenza artificiale che possono "completare la codifica semplicemente muovendo la bocca".

Indirizzo del documento: https://browse.arxiv.org/pdf/2310.02059.pdf

Esempio: 435 segmenti di codice nell'ambiente di produzione, che coprono 6 linguaggi di programmazione tradizionali

Durante l'esperimento, i ricercatori hanno selezionato 435 frammenti di codice generati da GitHub Copilot dai progetti pubblici di GitHub, che coprono una varietà di linguaggi di programmazione tradizionali come Python, JavaScript, Java, C++, Go e C#.

Allo stesso tempo, utilizza CodeQL, uno strumento di analisi statica open source che supporta più linguaggi (tra cui Java, JavaScript, C++, C# e Python), per condurre scansioni di sicurezza e analisi di frammenti di codice e utilizza Common Vulnerability Enumeration ( CWE) per classificare le falle di sicurezza del codice nel segmento.

Inoltre, sulla base del seguente processo di ricerca, i ricercatori hanno sollevato domande che devono essere studiate e verificate in tre dimensioni.

RQ1: Il codice generato da Copilot nei progetti GitHub è sicuro?

Motivo della richiesta: Copilot potrebbe generare suggerimenti di codice che contengono vulnerabilità della sicurezza e gli sviluppatori potrebbero accettare questi suggerimenti, lasciando potenzialmente vulnerabile il programma. Le risposte alla domanda RQ1 aiutano a comprendere la frequenza con cui gli sviluppatori riscontrano vulnerabilità della sicurezza quando utilizzano Copilot in produzione.

RQ2: Quali vulnerabilità di sicurezza esistono negli snippet di codice generati da Copilot?

Motivo per porre questa domanda: il codice generato da Copilot può contenere vulnerabilità di sicurezza e gli sviluppatori dovrebbero condurre una rigorosa revisione della sicurezza prima di accettare il codice generato da Copilot. Come chiarisce la documentazione di GitHub Copilot, "gli utenti di Copilot sono responsabili di garantire la sicurezza e la qualità del proprio codice". Le risposte a RQ2 possono aiutare gli sviluppatori a comprendere meglio le possibili vulnerabilità della sicurezza nel codice generato da Copilot in modo che possano prevenire e risolvere queste vulnerabilità in modo più efficace.

RQ3: Quante vulnerabilità di sicurezza appartengono alla Top-25 di MITRE CWE?

Motivo della richiesta: questo elenco contiene le 25 vulnerabilità di sicurezza più pericolose. Le risposte a RQ3 possono aiutare gli sviluppatori a capire se il codice generato da Copilot contiene tipi di vulnerabilità della sicurezza ampiamente riconosciuti e la capacità di Copilot di gestire queste vulnerabilità più comuni.

Passaggio 1: identificare il codice "reale" generato dall'intelligenza artificiale su GitHub

Il motivo per voler utilizzare GitHub come principale fonte di dati per rispondere alle domande di ricerca è che, secondo l'opinione dei ricercatori, GitHub contiene milioni di repository di codice pubblico e ha accesso a un gran numero di risorse di codice, consentendogli di coprire una varietà di linguaggi di programmazione e progetti di tipo ricerca.

Tuttavia, non è facile ottenere direttamente il codice generato da Copilot in GitHub, perché anche con l’aiuto di molti strumenti è difficile dire se il codice è scritto dall’intelligenza artificiale o da ingegneri umani.

Di fronte a questo dilemma, sei ricercatori hanno scelto di identificare molti frammenti di codice cercando nella descrizione del repository e nei commenti forniti nel codice, come "da GitHub Copilot", "usa GitHub Copilot" e "con GitHub Copilot Per cercare, finalmente". ottenuto i seguenti risultati:

Il numero di risultati di ricerca in diverse lingue ottenuti dai tag code:

Successivamente, entra nella fase di filtraggio. In questo caso, i ricercatori hanno sottolineato nel documento che hanno seguito principalmente tre regole:

1. Per i risultati della ricerca sotto il tag Repository, i ricercatori hanno determinato quali progetti sono stati interamente generati da Copilot in base alle dichiarazioni nella descrizione del progetto o nel file Readme associato. Inoltre, conserva i file di codice per i principali linguaggi supportati da Copilot come Python, JavaScript, Java, C++, C# e Go.

2. Per i risultati della ricerca sotto il tag code, conserva i commenti del file generati da Copilot per visualizzare il codice.

3. Gli oggetti di questo studio sono principalmente frammenti di codice utilizzati in progetti reali. Per questo motivo verranno esclusi i file di codice utilizzati per risolvere semplici problemi di algoritmo sulla piattaforma LeetCode.

Dopo aver completato l'annotazione dei dati pilota, il primo autore dell'articolo ha esaminato i restanti risultati della ricerca e ha ottenuto un totale di 465 frammenti di codice. Dopo aver rimosso i risultati duplicati, ci siamo ritrovati con 435 frammenti di codice distinti. 249 di questi provengono da tag del repository e 186 provengono da tag di codice, come dettagliato di seguito:

Passaggio 2: analisi dei dati

Durante la fase di test, per migliorare la copertura e l’accuratezza dei risultati, i ricercatori hanno utilizzato due strumenti di analisi statica per i controlli di sicurezza su ciascun segmento di codice (ovvero CodeQL più strumenti specifici della lingua).

In questo studio, i ricercatori hanno utilizzato innanzitutto CodeQL per analizzare il codice nel set di dati. La suite di query predefinita nel pacchetto di query standard CodeQL è codeql-suites/-code-scanning.qls. Ogni pacchetto contiene diverse suite di query utili nella directory codeql-suite.

Allo stesso tempo, utilizza la suite di test -security-and-quality.qls per scansionare frammenti di codice relativi alle vulnerabilità della sicurezza. Queste suite di test possono verificare più proprietà di sicurezza, coprendo molti CWE. Ad esempio: la suite di test Python fornisce 168 controlli di sicurezza; la suite di test JavaScript fornisce 203 controlli di sicurezza; la suite di test C++ fornisce 163 controlli di sicurezza.

Inoltre, i ricercatori hanno selezionato altri popolari strumenti di analisi della sicurezza statica per ciascun linguaggio di programmazione per scansionare i file. Ad esempio, Python utilizza Bandit, JavaScript utilizza ESLint, C++ utilizza Cppcheck, Java utilizza Findbugs, C# utilizza Roslyn e Go utilizza Gosec. Se l'ID CWE relativo al problema di sicurezza non può essere ottenuto direttamente dai risultati della scansione, i ricercatori mappano anche manualmente gli attributi di sicurezza forniti dai risultati della scansione al CWE corrispondente.

Il 35,8% dei segmenti di codice presenta vulnerabilità di sicurezza, il codice C++ presenta il maggior numero di vulnerabilità, coprendo 42 tipi CWE

Dopo l'analisi, i ricercatori sono giunti alla conclusione finale sulla base delle tre domande sopra sollevate.

RQ1: Il codice generato da Copilot nei progetti GitHub è sicuro?

Dei 435 frammenti di codice generati da Copilot, il 35,8% conteneva vulnerabilità di sicurezza, creando problemi di sicurezza indipendentemente dal linguaggio di programmazione utilizzato.

Esiste una percentuale leggermente più elevata di vulnerabilità di sicurezza nel codice Python e JavaScript, che sono i linguaggi in cui gli sviluppatori utilizzano più comunemente Copilot. Dei 251 frammenti di codice Python raccolti, il 39,4% presenta rischi per la sicurezza. Dei 79 snippet JavaScript, il 27,8% presenta rischi per la sicurezza. Di tutti i linguaggi di programmazione, C++ ha la percentuale più alta di frammenti di codice con vulnerabilità di sicurezza pari al 46,1%. Go ha anche un rapporto di rischio per la sicurezza relativamente elevato del 45,0%. In confronto, la percentuale di file con problemi di sicurezza in codice C# e Java è inferiore, rispettivamente al 25% e al 23,2%.

RQ2: Quali vulnerabilità di sicurezza esistono negli snippet di codice generati da Copilot?

Per rispondere a RQ2, i ricercatori hanno elaborato i risultati delle scansioni condotte da RQ1 ed hanno eliminato i problemi di sicurezza duplicati rilevati nella stessa posizione del segmento di codice. Sono state identificate un totale di 600 vulnerabilità di sicurezza in 435 frammenti di codice.

I tipi di vulnerabilità di sicurezza rilevate erano diversi e relativi a 42 diversi CWE, tra cui CWE-78 (inserimento di comandi del sistema operativo), CWE-330 (vulnerabilità all'uso di valori casuali non sicuri) e CWE-703 (controllo di condizioni anomale o improprie manipolazione) si verifica più frequentemente.

RQ3: Quante vulnerabilità di sicurezza appartengono alla Top-25 di MITRE CWE?

Delle 42 CWE identificate, 11 rientrano tra le prime 25 vulnerabilità CWE attualmente riconosciute del 2022.

scrivi alla fine

A questo proposito, alcuni netizen hanno anche scherzato dicendo che la loro capacità di scrivere bug potrebbe essere superiore a quella di GitHub Copilot.

Naturalmente, questo studio non ha lo scopo di persuadere gli sviluppatori a non utilizzare strumenti di codifica assistiti dall'intelligenza artificiale nel loro lavoro quotidiano, ma di dimostrare che l'utilizzo di Copilot per generare codice durante lo sviluppo reale può migliorare l'efficienza dello sviluppo e ricordare a tutti di garantire la propria sicurezza. valutazioni.

Allo stesso tempo, esegui controlli di sicurezza appropriati quando accetti i suggerimenti sul codice di Copilot per evitare efficacemente alcuni rischi potenziali e ridurre le perdite.

Per maggiori dettagli consultare il documento: https://browse.arxiv.org/pdf/2310.02059.pdf