miércoles, septiembre 28, 2022

Copilot y su código inseguro o cómo la IA aprende a programar (también) metiendo "Bugs"

A estas alturas ya prácticamente todo el mundo sabe qué es Copilot, la Inteligencia Artificial (IA) de OpenAI y GitHub que genera código fuente de forma automática en varios lenguajes de programación. Además, ahora ya está accesible de forma gratuita para todos los desarrolladores y así echarles una mano durante el proceso de programación. 

Figura 1: Copilot y su código inseguro o cómo la IA
aprende a programar (también) metiendo "Bugs"

Que Copilot sea capaz de generar código es un hito increíble dentro del mundo de la IA (uno más, mañana tendremos otro nuevo). Y además es el primer paso que acerca a la IA a la auto programación y por lo tanto a generación propia de programas, es decir, autorreplicación (¿alguien ha dicho reproducción?).

Pero la seguridad del código también importa

Hoy vamos a centrarnos en un punto de vista importante, más allá de la eficiencia, la utilidad o incluso la metafísica que rodea a la generación de código. Estamos hablando de la seguridad o vulnerabilidad del código generado. Este tema del código inseguro generado por Copilot no es nuevo, ya en octubre de 2021 la NYU presentó un artículo contundente, donde indicaba que el 40% del código generado por Copilot es inseguro. La prueba se realizó contra 1.692 programas en diferentes escenarios y usando MITRE TOP 25 CWE como base para comprobar la fiabilidad del código. 

Y esto es realmente preocupante, este porcentaje es demasiado alto como para que Copilot se convierta en una herramienta utilizada por millones de desarrolladores de todo el mundo. No es sólo cuestión de programar bien, sino también seguro. Y por ese motivo escribimos este libro llamado “Machine Learning aplicado a la Ciberseguridad”, de 0xWord, donde explicamos la importancia de la ciberseguridad dentro de la detección de amenazas utilizando Inteligencia Artificial:

Figura 3: Libro de Machine Learning aplicado a Ciberseguridad de
Carmen TorranoFran Ramírez, Paloma Recuero, José Torres y Santiago Hernández

La raíz del problema

Copilot
está basado en una familia de modelos NLP de OpenAI Codex. El núcleo del modelo es el famoso GPT-3 el cual funciona como base del lenguaje. Pero claro, tenemos que enseñarle a programar. Por lo tanto, la parte de "fine tunning", es decir, ajustar el modelo a la salida que queremos, tenemos que entrenarlo con ejemplos de programación. Por este motivo la fase de "fine tunning" se realizó directamente aprendiendo del código publicado en GitHub. Y claro, este código no siempre está optimizado para evitar problemas de seguridad como SQL Injection, XSS, etcétera.


Copilot no sólo se entrena con código fuente de Github, también tiene otras fuentes Open Source los cuales pueden contener bugs, referencias a APIs inseguras, etcétera. Es decir, el dataset que le “enseña” a programar contiene todos estos problemas, bugs, vulnerabilidades, etcétera. Copilot programa de manera insegura porque la mayoría de nosotros programamos de esa forma, no es un error de Copilot, es un problema nuestro.

El problema persiste un año después …

Recientemente GitHub ha publicado un estudio donde nos cuenta la experiencia después de un año de usar Copilot. Se entrevistó a unos 2.000 programadores que han estado utilizándolo de manera habitual durante un año. El resultado es que la mayoría, entre el 60% y 75% se mostraron contentos, menos frustrados y más satisfechos con su trabajo utilizando Copilot. Esto es en parte porque Copilot elimina el tiempo perdido buscando “soluciones en Internet" (es decir, en Stack Overflow) o centrándose en otras partes menos repetitivas del código. Pero este nuevo estudio no dice nada sobre la seguridad del código generado.
GitHub sí que menciona que sigue mejorando el modelo intentando excluir todo el código inseguro o no eficiente que genera. Eso sí, recomienda analizar siempre todo el código generado y que sea siempre el programador el que tenga la última palabra. Pero hoy día podemos comprobar que todavía tiene bastantes problemas de seguridad.

Hemos seleccionado la base de datos de Sonar donde podemos encontrar muchos ejemplos de código inseguro en varios lenguajes, pero vamos a centrarnos en Python y en concreto en tres bastante sencillos que son auto explicativos (sólo tenemos que ver la parte de Sonar que dice “Noncompliant Code Example” (ejemplo de código no conforme) y compararlo con la salida de Copilot. Pero el paper que hemos mencionado antes tiene en detalle todo un estudio completo comprobando las vulnerabilidades entre varios lenguajes de programación por si quieres comprobarlo mejor.

Figura 9: Salida generada por Copilot.

EJEMPLO 3: https://rules.sonarsource.com/python/type/Vulnerability/RSPEC-4426


Copilot:

Figura 11: Salida generada por Copilot.

Estos son sólo tres ejemplos muy sencillos, pero puedes simplemente acceder a la web de Sonar e ir comprobando uno a uno todos los ejemplos que ofrecen en su web.

Conclusiones

Copilot es una fantástica herramienta, que estamos seguros será de gran ayuda al programador. Pero también puede ser un gran problema de seguridad si no se entrena de la manera adecuada para generar el código más seguro posible. Esta herramienta cada vez más será utilizada por desarrolladores de todo el mundo y por lo tanto debe de ofrecer el código más seguro y optimizado posible. 

Para ello será necesario ir etiquetando todas las salidas inseguras del código generado (esto podría ser una buena “feature” para Github, reportar código inseguro de Copilot desde el mismo plugin de VStudio por ejemplo) y de esta forma crear un entrenamiento más adecuado a la seguridad del código. De momento, si usas Copilot, debemos utilizar alguna herramienta de análisis de código para comprobar que el código generado no tiene vulnerabilidades.

Figura 12: Libro de "Hacking Web Technologies Silver Edition" 3ª Edición
de 0xWord, escrito por Enrique RandoPablo Gonzalez, Ricardo Martin,

Si ya nos cuesta escribir código seguro (los problemas actuales de seguridad lo demuestran) lo que nos faltaba es una herramienta que automatizara la programación y encima de forma insegura ;). Estamos seguros que poco a poco este problema se irá solucionado, pero de momento, mucho cuidado.

Saludos,  

Fran Ramírez
(@cyberhadesblog) es investigador de seguridad y miembro del equipo de Ideas Locas en CDO en Telefónica, co-autor del libro "Microhistorias: Anécdotas y Curiosidades de la historia de la informática (y los hackers)", del libro "Docker: SecDevOps", también de "Machine Learning aplicado a la Ciberseguridad” además del blog CyberHades. Puedes contactar con Fran Ramirez en MyPublicInbox.

 Contactar con Fran Ramírez en MyPublicInbox

1 comentario:

Eduard dijo...

Solo falta que copilot se entrene, de forma especifica, con los KB de Sonar y posiblemente el resultado supere en calidad, seguridad, y velocidad a muchos programadores senior :)

Entrada destacada

Tokenomics 101: Una explicación con gráficos

He tenido que explicar muchas veces por qué alguien va a pagar algo por un Token . Es verdad que cuando se habla de Tokens , es muy diferent...

Entradas populares