Valutare il Machine Learning per la rilevazione delle vulnerabilità software
Questo studio esamina l'efficacia del machine learning nel trovare vulnerabilità software attraverso test di dati modificati.
― 12 leggere min
Lavori recenti hanno dimostrato che il machine learning può aiutare a trovare problemi di sicurezza nel software. Analizzando il codice sorgente di una funzione, i modelli di machine learning possono identificare se c'è un difetto con una buona dose di accuratezza. Tuttavia, ci sono preoccupazioni su quanto bene questi risultati si mantengano su dataset diversi.
Per valutare la capacità generale di questi modelli, i ricercatori hanno provato ad aggiungere piccole modifiche ai Dati di test mantenendo il significato invariato. Questo test ha rivelato che i modelli spesso si basavano su caratteristiche non collegate alle Vulnerabilità reali, e la loro precisione è diminuita significativamente. In risposta, è stata suggerita una strategia in cui il modello sarebbe stato addestrato su questi dati modificati, portando a un miglioramento delle prestazioni.
In questo studio, andiamo oltre questa indagine. Proponiamo un modo semplice per valutare questi modelli, che può aiutare i ricercatori a capire meglio quanto bene funziona il machine learning per trovare vulnerabilità nel codice. In particolare, suggeriamo due approcci: uno in cui trasformiamo i Dati di addestramento e di test ma mantenendo i loro significati intatti, e un altro in cui testiamo il modello con dati che includono vulnerabilità fisse.
Usando una varietà di Trasformazioni, tecniche di machine learning e dataset, abbiamo scoperto che anche con l'addestramento su dati modificati, i modelli continuano a fare affidamento su caratteristiche non correlate quando provano a prevedere vulnerabilità. Hanno anche avuto difficoltà a distinguere tra funzioni vulnerabili e le loro versioni corrette.
Molti studi recenti hanno riportato risultati impressionanti nella rilevazione di vulnerabilità usando metodi di machine learning. Questi modelli sembrano migliori di altri che usano tecniche diverse, come l'analisi statica, anche quando non richiedono una conoscenza approfondita su come funzionano i programmi. Questo solleva una domanda: è già risolto il problema della ricerca di vulnerabilità di sicurezza nel software? Possono davvero questi modelli individuare vulnerabilità o i punteggi alti sono solo ingannevoli?
Affinché i metodi di machine learning possano essere utilizzati in modo sicuro in applicazioni software reali, devono essere affidabili e solidi. Pertanto, i ricercatori stanno cercando di indagare cosa possono e non possono fare questi modelli, oltre a guardare alla loro performance nei test standard.
Un modo per testare i limiti di questi modelli è vedere dove falliscono. Ad esempio, possiamo apportare piccole modifiche significative all'input di codice e osservare come reagiscono i modelli. Questo include rinominare variabili, aggiungere righe che non vengono eseguite o sostituire frammenti di codice con equivalenti. Studi precedenti hanno dimostrato che i modelli di machine learning spesso mancano di affidabilità quando si trovano di fronte a cambiamenti che mantengono il significato invariato.
Un modo comune per affrontare i problemi di affidabilità è addestrare il modello utilizzando dati modificati. Molti ricercatori hanno scoperto che questo può aiutare a recuperare le prestazioni perse. Tuttavia, ci sono domande su se i miglioramenti derivano da miglioramenti genuini nella capacità del modello di identificare vulnerabilità o se i modelli si stanno semplicemente adattando a un diverso tipo di dati.
Per affrontare queste domande, presentiamo un metodo che può aiutare a valutare i modelli di machine learning per la rilevazione delle vulnerabilità attraverso modifiche ai dati. Il primo metodo consiste nell'applicare alcune modifiche ai dataset di addestramento e test. Quando ripetuto per varie coppie di trasformazioni, i punteggi risultanti possono indicare se i modelli si adattano troppo strettamente ai cambiamenti specifici applicati durante l'addestramento. Il secondo metodo consiste nel valutare quanto bene un modello addestrato su dati modificati possa funzionare su un set di test che include funzioni vulnerabili e le loro versioni corrette.
In aggiunta ai metodi proposti, condividiamo anche ciò che abbiamo trovato nei nostri esperimenti. Abbiamo implementato questi metodi su tre tecniche di machine learning leader utilizzate per la rilevazione di vulnerabilità. Per il primo metodo, abbiamo utilizzato 11 modifiche che mantengono il significato del codice intatto e le abbiamo testate su due dataset. Come previsto, l'addestramento su dati modificati ha aiutato a ripristinare le prestazioni, ma solo quando le stesse modifiche sono state utilizzate sia nell'addestramento che nel test. Se sono state applicate modifiche diverse, le prestazioni sono diminuite significativamente.
Per il secondo metodo, abbiamo creato un nuovo dataset chiamato VulnPatchPairs, che include funzioni vulnerabili insieme alle loro versioni corrette. Nonostante l'uso di tre tecniche di machine learning leader, nessun modello è riuscito a distinguere efficacemente tra funzioni vulnerabili e le loro controparti corrette. Le loro performance erano solo leggermente migliori del caso casuale.
In sintesi, i nostri contributi includono:
- Un metodo chiaro per valutare i modelli di machine learning mirati alla rilevazione di vulnerabilità usando dati modificati.
- Prove che mostrano che i miglioramenti derivanti dall'uso di dati di addestramento modificati si applicano solo a modifiche specifiche utilizzate durante l'addestramento e che i modelli si adattano eccessivamente a caratteristiche non correlate introdotte da queste modifiche.
- Introduzione di VulnPatchPairs, un nuovo dataset contenente funzioni vulnerabili e le loro versioni fissate corrispondenti.
- Dimostrazione che le tecniche di machine learning leader faticano a distinguere tra funzioni vulnerabili e le loro correzioni, e che l'addestramento su dati modificati non porta a un miglioramento significativo delle prestazioni.
- Disponibilità di tutti i dataset, codice e risultati per garantire trasparenza e riproducibilità.
Lavori Correlati
Un modo principale per studiare l'affidabilità dei metodi di machine learning per la rilevazione delle vulnerabilità è attraverso cambiamenti che mantengono il significato del codice. Studi precedenti hanno introdotto metodi per generare questo tipo di cambiamenti nei dataset di codice sorgente. Gli effetti dell'uso di dati modificati per l'addestramento sono stati esplorati in molte attività di ingegneria del software, come il riassunto del codice, la previsione dei tipi, la classificazione della funzionalità del codice e l'identificazione delle vulnerabilità. Un risultato comune di questi studi è che utilizzare le stesse modifiche sia per l'addestramento che per il test può migliorare le prestazioni.
Alcuni studi sono andati oltre testando come i dati di addestramento amplificati con un tipo di modifica si comportano quando valutati su dati amplificati con una modifica diversa ma correlata. Ad esempio, in uno studio, gli autori hanno utilizzato un metodo per rinominare variabili durante l'addestramento e poi hanno valutato su dati in cui le variabili erano rinominate casualmente. Altri studi hanno anche trovato che l'uso di metodi diversi per l'addestramento e il test porta in genere a prestazioni inferiori. Tuttavia, rimane poco chiaro se queste scoperte siano specifiche per i metodi trasformazionali studiati o se siano applicabili a diversi metodi, modelli e dataset. La nostra ricerca mira a rispondere a queste domande aperte fornendo una metodologia generale e uno studio empirico approfondito.
Alcune trasformazioni utilizzate negli studi esistenti vengono calcolate durante l'addestramento del modello con l'obiettivo di rendere il modello più robusto. La distinzione tra questo approccio e l'amplificazione dei dati di addestramento standard è che le trasformazioni per l'allenamento avversariale vengono eseguite durante il processo di addestramento per massimizzare la perdita del modello sui campioni di input. Abbiamo utilizzato sia trasformazioni semplici che addestramento avversariale nei nostri esperimenti.
Per indagare ulteriormente sull'efficacia delle tecniche di machine learning per identificare vulnerabilità e su come l'amplificazione dei dati influisca su di esse, abbiamo compilato un nuovo dataset chiamato VulnPatchPairs. Questo dataset contiene coppie di funzioni vulnerabili e le loro rispettive correzioni. Lavori precedenti hanno suggerito tale dataset basato su coppie per studi di correzione automatizzata, ma siamo i primi a utilizzare questo tipo di dataset per valutare quanto siano efficaci i modelli di machine learning nella rilevazione delle vulnerabilità.
Proponiamo un nuovo metodo di benchmarking per aiutare i ricercatori a valutare le tecniche di machine learning per la rilevazione delle vulnerabilità. Il metodo è diviso in due parti.
Trasformazioni di Codice Consapevoli dell'Etichetta
Una parte fondamentale dei nostri metodi coinvolge trasformazioni di codice consapevoli dell'etichetta, insieme a ciò che ci aspettiamo dai modelli di rilevazione delle vulnerabilità.
Una trasformazione di codice è una funzione che modifica un pezzo di codice senza alterarne il significato. Una situazione ideale è quando l'applicazione di una trasformazione a uno snippet di codice non cambia la sua etichetta di vulnerabilità. Ci riferiamo a questo tipo di trasformazione come semantica preservante. Al contrario, una trasformazione che inverte l'etichetta modifica uno snippet in modo tale che il suo stato di vulnerabilità cambi, aggiungendo o rimuovendo una vulnerabilità.
In generale, speriamo che un modello di rilevazione delle vulnerabilità possa prevedere accuratamente se uno snippet di codice contiene un difetto di sicurezza, indipendentemente da qualsiasi trasformazione precedentemente applicata. In particolare, ci aspettiamo:
- Se trasformiamo il codice senza cambiare il suo stato di vulnerabilità, lo strumento di rilevazione dovrebbe comunque produrre il risultato corretto.
- Se alteriamo uno snippet di codice per aggiungere o rimuovere una vulnerabilità, ci aspettiamo che il modello cambi la sua previsione per allinearsi a questo nuovo stato.
Metodologia: Rilevazione dell'Overfitting ai Cambiamenti di Codice
L'obiettivo del nostro primo metodo è verificare se i miglioramenti derivanti dall'amplificazione dei dati possano essere applicati in modo coerente oltre le modifiche specifiche apportate durante l'addestramento. Vogliamo anche vedere se le tecniche di machine learning continuano a sovradimensionare cambiamenti non correlati nei loro dataset di addestramento.
Input: Gli input per questo metodo includono un insieme di trasformazioni semantiche preservanti, un dataset di addestramento, un dataset di test, una tecnica di machine learning per la rilevazione delle vulnerabilità e una metrica di performance che misura quanto bene il modello performa.
Calcoli: Questo metodo calcola le medie dei risultati amplificando solo i dati di test, utilizzando le stesse trasformazioni sia per i dataset di addestramento che per quelli di test e utilizzando trasformazioni diverse per i dati di addestramento.
Utilizzo dei Risultati: I ricercatori possono utilizzare questo metodo per valutare nuove tecniche di machine learning per la rilevazione delle vulnerabilità. In particolare, possono rispondere a domande su come le prestazioni cambiano con dati di test modificati, quanto le prestazioni possono essere ripristinate con trasformazioni simili per i dati di addestramento e se il modello si sovradimensiona a cambiamenti specifici.
Distinguere tra Vulnerabilità e Patch
L'obiettivo del nostro secondo metodo è vedere se le tecniche di machine learning possono generalizzare da dataset standard a uno scenario modificato in cui devono differenziare tra vulnerabilità e le loro forme corrette.
Input: Oltre agli input richiesti per il primo metodo, questo secondo metodo include anche un dataset di test specializzato Vulnerability-Patch per il confronto.
Calcoli: Questo metodo utilizza il dataset di test Vulnerability-Patch per quantificare l'abilità del modello di generalizzare a un contesto modificato. Controlla sia un modello addestrato su dataset standard che uno addestrato su dati amplificati.
Utilizzo dei Risultati: Utilizzando questo metodo, i ricercatori possono valutare se le prestazioni dei loro modelli possano essere applicate a un contesto modificato. Possono anche determinare se l'amplificazione dei dati migliora la capacità del modello di generalizzare.
Impostazione Sperimentale e Domande di Ricerca
Il nostro obiettivo è verificare se i due metodi proposti possono effettivamente valutare le tecniche di machine learning leader per la rilevazione delle vulnerabilità. Vogliamo rispondere a diverse domande chiave:
- Cosa succede alle prestazioni dei modelli di machine learning quando amplifichiamo snippet di codice di input senza alterare il loro stato di vulnerabilità?
- Queste tecniche si sovradimensionano a modifiche specifiche che non cambiano lo stato di vulnerabilità?
- I punteggi di alta performance possono essere generalizzati a uno scenario modificato in cui i modelli devono distinguere vulnerabilità dalle loro correzioni?
Trasformazioni Semantiche Preservanti
Una parte chiave dei nostri metodi coinvolge l'uso di trasformazioni semantiche preservanti. Le trasformazioni comunemente utilizzate nel lavoro correlato includono il rinominare identificatori, inserire righe che non vengono eseguite, sostituire istruzioni di codice con equivalenti, spostare istruzioni e rimuovere righe non necessarie.
Dataset di Rilevazione delle Vulnerabilità
Per i nostri esperimenti, abbiamo utilizzato due dataset pubblicamente disponibili specificamente progettati per la rilevazione delle vulnerabilità.
CodeXGLUE/Devign: Questo dataset include 26.400 funzioni C, di cui circa il 45,6% contiene vulnerabilità.
VulDeePecker: Questo dataset è composto da 61.600 esempi di codice C/C++, di cui circa il 28,7% contiene vulnerabilità.
Nuovo Dataset: VulnPatchPairs
Abbiamo sviluppato un nuovo dataset chiamato VulnPatchPairs per indagare quanto bene le tecniche di machine learning possano identificare vulnerabilità rispetto alle loro correzioni. Questo dataset, che include funzioni C da grandi progetti open-source, consiste in coppie di funzioni vulnerabili e le loro versioni corrette.
Tecniche di Machine Learning
Per i nostri esperimenti, abbiamo selezionato tre tecniche di machine learning leader conosciute per le loro prestazioni nella rilevazione delle vulnerabilità. Queste tecniche sono state scelte in base ai loro punteggi nei benchmark più famosi per valutare tali approcci.
Pipeline di Addestramento del Modello
Abbiamo mantenuto un'impostazione di addestramento coerente tra tutti i modelli durante i nostri esperimenti. I dataset che abbiamo utilizzato erano già suddivisi in parti di addestramento, validazione e test, e abbiamo applicato passaggi di pre-elaborazione per pulire i dati.
Risultati Sperimentali
Abbiamo iniziato la nostra analisi osservando come l'amplificazione dei dati influisce sulle prestazioni dei modelli di machine learning. I nostri risultati hanno mostrato che amplificare il dataset di test tende a ridurre le prestazioni dei modelli. Tuttavia, quando abbiamo amplificato il dataset di addestramento in modo simile, abbiamo generalmente visto miglioramenti.
Overfitting a Trasformazioni Specifiche
Abbiamo indagato se le prestazioni potessero ancora essere ripristinate quando venivano applicate trasformazioni diverse al dataset di addestramento rispetto al dataset di test. I nostri risultati hanno indicato che l'uso di trasformazioni diverse non ha aiutato a ripristinare le prestazioni; infatti, le prestazioni sono spesso diminuite ulteriormente.
Generalizzazione a VulnPatchPairs
Il nostro ultimo set di esperimenti si è concentrato nel determinare se le tecniche di machine learning potessero generalizzare dai dataset standard a uno scenario che richiede la differenziazione tra vulnerabilità e le loro correzioni corrispondenti. Abbiamo scoperto che i modelli in generale hanno faticato a fare questa distinzione e non hanno mostrato miglioramenti significativi attraverso l'amplificazione dei dati di addestramento.
Minacce alla Validità
Riconosciamo varie potenziali minacce alla validità dei nostri risultati, comprese le scelte fatte riguardo la selezione degli iperparametri e le suddivisioni dei dataset. Inoltre, riconosciamo che le nostre scoperte potrebbero non applicarsi ad altre tecniche di machine learning, dataset e trasformazioni oltre a quelle che abbiamo valutato.
Discussione e Lavori Futuri
In sintesi, i nostri risultati confermano che i miglioramenti ottenuti dall'amplificazione dei dati si applicano solo a trasformazioni specifiche utilizzate nell'addestramento. L'incapacità delle tecniche di machine learning leader di generalizzare in nuovi contesti presenta sfide significative per la loro applicazione negli ambienti software reali. I nostri metodi proposti offrono un nuovo approccio per misurare e affrontare queste questioni, e speriamo che ispirino ulteriori ricerche per migliorare la robustezza delle tecniche di machine learning per la rilevazione delle vulnerabilità.
Titolo: Uncovering the Limits of Machine Learning for Automatic Vulnerability Detection
Estratto: Recent results of machine learning for automatic vulnerability detection (ML4VD) have been very promising. Given only the source code of a function $f$, ML4VD techniques can decide if $f$ contains a security flaw with up to 70% accuracy. However, as evident in our own experiments, the same top-performing models are unable to distinguish between functions that contain a vulnerability and functions where the vulnerability is patched. So, how can we explain this contradiction and how can we improve the way we evaluate ML4VD techniques to get a better picture of their actual capabilities? In this paper, we identify overfitting to unrelated features and out-of-distribution generalization as two problems, which are not captured by the traditional approach of evaluating ML4VD techniques. As a remedy, we propose a novel benchmarking methodology to help researchers better evaluate the true capabilities and limits of ML4VD techniques. Specifically, we propose (i) to augment the training and validation dataset according to our cross-validation algorithm, where a semantic preserving transformation is applied during the augmentation of either the training set or the testing set, and (ii) to augment the testing set with code snippets where the vulnerabilities are patched. Using six ML4VD techniques and two datasets, we find (a) that state-of-the-art models severely overfit to unrelated features for predicting the vulnerabilities in the testing data, (b) that the performance gained by data augmentation does not generalize beyond the specific augmentations applied during training, and (c) that state-of-the-art ML4VD techniques are unable to distinguish vulnerable functions from their patches.
Autori: Niklas Risse, Marcel Böhme
Ultimo aggiornamento: 2024-06-06 00:00:00
Lingua: English
URL di origine: https://arxiv.org/abs/2306.17193
Fonte PDF: https://arxiv.org/pdf/2306.17193
Licenza: https://creativecommons.org/licenses/by/4.0/
Modifiche: Questa sintesi è stata creata con l'assistenza di AI e potrebbe presentare delle imprecisioni. Per informazioni accurate, consultare i documenti originali collegati qui.
Si ringrazia arxiv per l'utilizzo della sua interoperabilità ad accesso aperto.