Detección de código inseguro con LLM |  de Melanie Hart Buehler |  marzo de 2024

Comenzamos con una ejecución de referencia de cero intentos y luego repetimos el experimento unas cuantas veces más aumentando la complejidad del mensaje agregando estrategias como el aprendizaje en contexto de pocos intentos. Solicitamos al LLM que identificara el código vulnerable sin mencionar qué CWE podría estar buscando (es decir, sin etiquetas).

En un mensaje de tiro cero, le pide al modelo que haga una predicción sin ningún ejemplo ni información más que instrucciones. Nuestra plantilla de disparo cero se inspiró en este papel⁴ e incluye una función, un delimitador de código y la solicitud para generar formato json únicamente. También incluye una instrucción para “pensar paso a paso”. El fragmento de código bajo prueba se inserta en {código}.

Inmediato

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:

Resultados

Precisión: 0,67
Precisión: 0,60
Recordar: 0,86
Puntuación F1: 0,71

Matriz de confusión de disparo cero

En el siguiente experimento, agregamos el concepto de en contexto o Aprendizaje de “pocas oportunidades” e incluya algunos ejemplos de códigos de respuesta exitosos antes de pedirle al LLM que realice la misma operación en el código invisible. Estos ejemplos se construyeron a partir del resto del conjunto de datos y se tuvo cuidado de:

  • Utilice escenarios diferentes a los del fragmento de código bajo prueba para evitar la contaminación.
  • Dibuja exactamente dos ejemplos vulnerables y un ejemplo no vulnerable

Inmediato

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:

Resultados

Precisión: 0,76
Precisión: 0,71
Recordar: 0,81
Puntuación F1: 0,76

Matriz de confusión de pocos disparos

Este Publicación del blog de Microsoft describe una técnica interesante llamada selección de ejemplos de pocas tomas basada en KNN que puede mejorar la calidad de la respuesta de LLM cuando se utilizan ejemplos en contexto. Para este próximo experimento, en lugar de tomar muestras al azar, calculamos una puntuación de similitud entre el código de entrada y cada ejemplo candidato y construimos tomas a partir de los candidatos más similares (aún manteniendo los escenarios distintos). Usamos la métrica ROUGE-L, pero también se podrían usar otras métricas. La plantilla de aviso no cambió desde el segundo experimento.

Resultados

Precisión: 0,73
Precisión: 0,70
Recordar: 0,76
Puntuación F1: 0,73

Matriz de confusión de pocas posibilidades de KNN

En esta variación del mensaje, incluimos una solicitud de una versión fija del código si se encuentra un CWE. Este enfoque se inspiró en Nunca, quien propuso que solicitar la detección de CWE y una solución conjunta podría generar un “círculo virtuoso” y obligar al LLM a “autoauditar” o pensar más profundamente sobre los pasos necesarios para identificar con precisión las vulnerabilidades, similar a una cadena de pensamiento. incitación. Lo hicimos construyendo ejemplos de código vulnerable en contexto con sugerencias de corrección de código extraídas de ejemplos de código no vulnerable para los mismos escenarios.

Inmediato

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:

Resultados

Precisión: 0,80
Precisión: 0,73
Recordar: 0,90
Puntuación F1: 0,81

Matriz de confusión de solución de pocas posibilidades de KNN

Además de la detección de CWE, este experimento tiene la ventaja de producir soluciones sugeridas. Aún no los hemos evaluado en cuanto a calidad, por lo que es un área para trabajo futuro.

En nuestra pequeña muestra de datos, la precisión de GPT4 fue del 67 % y su puntuación F1 fue del 71 % sin ninguna adaptación rápida compleja. Algunas de las técnicas de indicaciones que probamos ofrecieron pequeñas mejoras, destacando las de pocas tomas y las de solicitud de corrección de código. La combinación de técnicas aumentó la precisión y la puntuación F1 en aproximadamente diez puntos porcentuales cada una con respecto al valor inicial, y ambas métricas alcanzaron o superaron el 80%.

Los resultados pueden ser bastante diferentes entre modelos, conjuntos de datos e indicaciones, por lo que se necesita más investigación. Por ejemplo, sería interesante:

  • Pruebe modelos más pequeños
  • Pruebe una plantilla de solicitud que incluya la etiqueta CWE para investigar el potencial de combinar LLM con análisis estático.
  • Pruebe conjuntos de datos más grandes y diversos
  • Evaluar la seguridad y la funcionalidad de las correcciones de código propuestas por LLM
  • Estudie técnicas de indicaciones más avanzadas, como ejemplos de cadenas de pensamiento en contexto, Autoconsistenciay Autodescubrimiento

Si desea ver el código que produjo estos resultados, ejecutarlo en su propio código o adaptarlo a sus propias necesidades, consulte el solicitud de extracción en OpenAI Cookbook (actualmente en revisión).