miércoles, enero 04, 2023

Cómo buscar vulnerabilidades en SmartContracts, SQL Injection, XSS o bugs Python con ChatGPT

Hace poco os hablaba del estudio que arrojaba como resultados que los programadores que utilizan asistentes de código basados en inteligencia artificial son más propensos a generar código con fallos de seguridad, y además hemos visto que si pides que te hagan código sin pedirle que mire la seguridad tanto Copilot, como ChatGPT, como otros asistentes, pueden generar código "buggy". Hoy vamos a ver lo contrario, cómo pedirle que nos ayude a hacer seguro nuestro código.

Figura 1: Cómo buscar vulnerabilidades en SmartContracts,
SQL Injection, XSS o bugs Python con ChatGPT.
Imagen hecha con Dall-e 2 (A happy hacker in Picasso style)

Vamos a hacer cuatro ejemplos de corrección de su propio código, de búsqueda de vulnerabilidades, de revisión en profundidad de un código, y de generación de código seguro desde el principio. Vamos a ello.

Ejemplo 1: Un SQL Injection en el código de ChatGPT

En el ejemplo primero, le pedía una función que accediera a una base de datos para comprobar si un usuario había introducido correctamente sus credenciales, y como veíamos, nos daba un código PHP con un SQL Injection de libro.

Figura 2: Código PHP con bug de SQL Injection generado por ChatGPT

Sin embargo, si le pedimos a ChatGPT que corrija el fallo de SQL Injection, lo cierto es que lo corrige perfectamente. 

Figura 3: Le pedimos a ChatGPT que elimine el bug de SQL Injection y lo hace.

Y esto abre muchas posibilidades que podemos aprovechar para securizar nuestro código o para buscar vulnerabilidades en códigos que estemos auditando. Es decir, como una herramienta de análisis de código estático.

Ejemplo 2: Encontrar un bug de Reentrancy Attack en un SmartContract

Para ello, en este ejemplo le he pedido que me busque si este código del mundo Web3 (que es un SmartContract que tiene una vulnerabilidad de Reentrancy Attack) tiene algún fallo de seguridad, pero como veis en la conversación, no le digo si existe o si no existe, ni por supuesto qué tipo de bug puede tener. Y ChatGPT lo encuentra perfectamente.

Figura 4: ChatGPT encuentra el bug de Reentrancy Attack

Así que, ya que lo ha encontrado, vamos a suponer que es nuestro código, así que vamos a darle cariño y pedirle que lo corrija él solito y nos dé el código sin esta vulnerabilidad. 

Figura 5: ChatGPT corrige el bug de Reentrancy Attack

Y listo. En un santiamén tenemos el código correcto de este SmartContract.

Ejemplo 3: Evaluar la fortificación de un código en Pyhton conjuntamente

En la siguiente prueba le doy el código inseguro para generar un fichero temporal que devolvió en la prueba de códigos inseguros generados por CoPilot. Así que le doy el código y le pido que busque si tiene alguna vulnerabilidad esta sección de un programa en Python.

Figura 6: No ha encontrado el bug a la primera

Sorprendentemente me dice que no ve ninguna vulnerabilidad, pero como yo sí sé que hay un problema en el método utilizado para la creación del archivo temporal, le pregunto directamente si ese método no es inseguro.

Figura 7: Insistiendo a ChatGPT sobre el método que sé que es inseguro

Como podéis ver, me ha contestado que no, SI tomo las medidas de prevención adecuadas. Pero claro, como programador de una aplicación, no puedo garantizar la configuración de los permisos del sistema donde esté implantado, así que le pregunto directamente por ese punto tercero.

Figura 8: Ahora sí que ha visto el problema, y me da la solución correcta

Y en ese caso, sí, ve el problema de seguridad, y ya me recomienda utilizar una función segura para evitarlo. Un ejemplo claro que la Mayeuita de Sócrates funciona perfectamente con la Inteligenica Artificial de hoy en día. 

Ejemplo 4: Generar un código JavaScript sin XSS ni bugs de Client-Side Attacks

Como veis, se puede utilizar ChatGPT para encontrar bugs, para evaluar código, pero también se puede utilizar para pedirle que el código que te genere sea seguro. Basta con enfatizar "sin vulnerabilidades de seguridad" en la conversación para que se lo tome muy en serio. Aquí, un caso muy típico donde muchos desarrolladores se comen un Client-Side Attack en forma de XSS, de CSRF, etcétera.

Figura 9: Código de JavaScritp con su entrada escapada para evitar XSS

Y como le hemos pedido que lo haga de forma segura, pues ha hecho un código en el que no deja meter código que pueda ser inyectado, mientras que si no le pides que se preocupe de la seguridad, te puede dar un código bastante buggy.

Conclusiones de estas pruebas

Así que, como decía en el vídeo que hice para explicar esto, no se trata de no utilizar los asistentes de Inteligencia Artificial para hacer código, sino de saber sacarles partido.

@chema_alonso ¿Generan código inseguro los asistentes de inteligencia artificial? #ai #ia #bug #sqli #copilot #chatgpt #seguridad #aprendoentiktok #aprendocontiktok ♬ Terminator 2: Judgment Day Theme - Everrune

ChatGPT, Copilot y todos los que irán apareciendo, son una herramienta de gran utilidad para:
  1. Descubrir vulnerabilidades: Lo que es bueno para los pentesters y auditores.
  2. Securizar código existente y revisarlo en profundidad: Lo que es bueno para QA y DevOps.
  3. Generar código de forma rápida y segura: Lo que es bueno para los desarrolladores.
En definitiva, más vale que vayas aceptando que tu trabajo en el futuro va a requerir de saber sacarle el máximo partido a la Inteligencia Artificial igual que en el pasado tuviste que aprender a sacarle partido a Internet.

¡Saludos Malignos!

Autor: Chema Alonso (Contactar con Chema Alonso)  


2 comentarios:

anso dijo...

Maestro, comenzar el año cuestionando todos los conocimientos es un buen comienzo, a lo Socrates. A por más y a por todas O:)

Jose dijo...

Muy buenas Doctor,

no puedo estar más de acuerdo, aunque es alucinante el partido que le podemos sacar como desarrolladores, es más un punto disruptivo, un "consejero", el amigo friki que sabe de todo... que un gurú para copiar y pegar.
Llevo programando desde los 13 y tengo tu edad, para mi está siendo la p*leche ver su enfoque para luego hacerlo a mi forma.
Pero no es para newbies...

Feliz año

Entrada destacada

10 maneras de sacarle el jugo a tu cuenta de @MyPublicInbox si eres un Perfil Público

Cuando doy una charla a algún amigo, conocido, o a un grupo de personas que quieren conocer MyPublicInbox , siempre se acaban sorprendiendo ...

Entradas populares