Rilevamento di codice non sicuro con LLM |  di Melanie Hart Buehler |  Marzo 2024

 | Intelligenza-Artificiale

Abbiamo iniziato con una corsa di base a zero riprese e poi abbiamo ripetuto l'esperimento altre volte aumentando la complessità del suggerimento aggiungendo strategie come l'apprendimento in contesto con pochi scatti. Abbiamo chiesto al LLM di identificare il codice vulnerabile senza menzionare quale CWE potrebbe cercare (ovvero senza etichette).

In un prompt zero-shot, chiedi al modello di fare una previsione senza esempi o informazioni diverse dalle istruzioni. Il nostro modello zero-shot è stato ispirato da questo articolo⁴ e include un ruolo, un delimitatore di codice e la richiesta di output solo in formato json. Include anche un'istruzione per “pensa passo dopo passo”. Lo snippet di codice in prova viene inserito in {code}.

Richiesta

You are a brilliant software security expert. 
You will be provided with a python code delimited by triple backticks.
If it contains any CWE security vulnerabilities, write Vulnerable.
If the code does not contain any vulnerabilities, write Not Vulnerable.
Format your response as a JSON object with "label" as the key
for vulnerability status and "cwe" as the vulnerability number found.
Think about the answer step by step, and only answer with JSON.

Python code: ```{code}```

Answer:

Risultati

Precisione: 0,67
Precisione: 0,60
Richiamo: 0,86
Punteggio F1: 0,71

Matrice di confusione a colpo zero

Nel prossimo esperimento aggiungeremo il concetto di in-context o apprendimento “pochi colpi”. e includere alcuni esempi di risposte al codice riuscite prima di chiedere al LLM di eseguire la stessa operazione sul codice invisibile. Questi esempi sono stati costruiti dal resto del set di dati e si è prestata attenzione a:

  • Attingere da scenari diversi rispetto allo snippet di codice sottoposto a test, per evitare la contaminazione
  • Disegna esattamente due esempi vulnerabili e un esempio non vulnerabile

Richiesta

You are a brilliant software security expert. 
You will be provided with a python code delimited by triple backticks.
If it contains any CWE security vulnerabilities, write Vulnerable.
If the code does not contain any vulnerabilities, write Not Vulnerable.
Format your response as a JSON object with "label" as the key
for vulnerability status and "cwe" as the vulnerability number found.
Think about the answer step by step, and only answer with JSON.

Python code: ```{example_0}```

Answer: {answer_0}

Python code: ```{example_1}```

Answer: {answer_1}

Python code: ```{example_2}```

Answer: {answer_2}

Python code: ```{code}```

Answer:

Risultati

Precisione: 0,76
Precisione: 0,71
Richiamo: 0,81
Punteggio F1: 0,76

Matrice di confusione a pochi colpi

Questo Post del blog Microsoft descrive una tecnica interessante chiamata selezione di esempi a pochi scatti basata su KNN che può aumentare la qualità della risposta LLM quando si utilizzano esempi nel contesto. Per il prossimo esperimento, invece di campionare le riprese in modo casuale, calcoliamo un punteggio di somiglianza tra il codice di input e ciascun esempio candidato e costruiamo riprese dai candidati più simili (mantenendo comunque distinti gli scenari). Utilizziamo la metrica ROUGE-L, ma potrebbero essere utilizzate anche altre metriche. Il modello di prompt non è cambiato rispetto al secondo esperimento.

Risultati

Precisione: 0,73
Precisione: 0,70
Richiamo: 0,76
Punteggio F1: 0,73

KNN Matrice di confusione a pochi colpi

In questa variante del prompt includiamo una richiesta per una versione corretta del codice se viene trovato un CWE. Questo approccio è stato ispirato da Maiche hanno proposto che la richiesta di rilevamento CWE e una soluzione congiunta potrebbe creare un “circolo virtuoso” e costringere il LLM a un “autocontrollo” o a riflettere più profondamente sui passaggi necessari per identificare accuratamente le vulnerabilità, in modo simile alla sollecitazione della catena di pensiero . Lo abbiamo fatto costruendo esempi di codice vulnerabile nel contesto con suggerimenti di correzione del codice tratti da esempi di codice non vulnerabile per gli stessi scenari.

Richiesta

You are a brilliant software security expert. 
You will be provided with a python code delimited by triple backticks.
If it contains any CWE security vulnerabilities, write Vulnerable.
If the code does not contain any vulnerabilities, write Not Vulnerable.
If the code has the vulnerability, write a repaired secure version of the
code that preserves its exact functionality.
Format your response as a JSON object with "label" as the key
for vulnerability status, "cwe" as the vulnerability found,
and "fix" for the fixed code snippet.
Think about the answer step by step, and only answer with JSON.

Python code: ```{example_0}```

Answer: {answer_0}

Python code: ```{example_1}```

Answer: {answer_1}

Python code: ```{example_2}```

Answer: {answer_2}

Python code: ```{code}```

Answer:

Risultati

Precisione: 0,80
Precisione: 0,73
Richiamo: 0,90
Punteggio F1: 0,81

KNN Matrice di confusione per correzione a pochi colpi

Oltre al rilevamento CWE, questo esperimento ha il vantaggio di produrre soluzioni suggerite. Non ne abbiamo ancora valutato la qualità, quindi questa è un'area per il lavoro futuro.

Sul nostro piccolo campione di dati, la precisione di GPT4 era del 67% e il suo punteggio F1 era del 71% senza complessi adattamenti immediati. Piccoli miglioramenti sono stati offerti da alcune delle tecniche di prompt che abbiamo testato, tra cui spiccano il metodo “low-shot” e la richiesta di correzione del codice. La combinazione di tecniche ha aumentato la precisione e il punteggio F1 di circa dieci punti percentuali ciascuno rispetto al valore di base, entrambi i parametri hanno raggiunto o superato l’80%.

I risultati possono essere molto diversi tra modelli, set di dati e prompt, quindi sono necessarie ulteriori indagini. Ad esempio, sarebbe interessante:

  • Prova modelli più piccoli
  • Testare un modello di prompt che includa l'etichetta CWE, per esaminare il potenziale di combinazione di LLM con analisi statica
  • Testare set di dati più grandi e diversificati
  • Valutare la sicurezza e la funzionalità delle correzioni del codice proposte da LLM
  • Studia tecniche di suggerimento più avanzate come esempi di catene di pensiero contestualizzate, AutocoerenzaE Scoperta di sé

Se desideri vedere il codice che ha prodotto questi risultati, eseguirlo sul tuo codice o adattarlo alle tue esigenze, controlla il richiesta pull in OpenAI Cookbook (attualmente in fase di revisione).

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *