Skip to main content

Corregir automáticamente las vulnerabilidades del código con IA

Escrito por

14 de octubre de 2024

0 minutos de lectura

En la biblioteca de talleres para clientes de SecRel de Snyk, tenemos uno llamado Breaking AI. En este taller se explica cómo los asistentes de IA generativa, como Copilot y Codium, pueden ayudar a los desarrolladores a escribir código más rápido. El gran truco del taller es que los asistentes de IA son como los desarrolladores noveles recién salidos de sus cursos de programación: muy impacientes y serviciales, pero... realmente conviene comprobar su código (sin ánimo de desprestigiar a los desarrolladores noveles: los necesitamos y son increíbles). En el taller, mostramos cómo la combinación de asistentes de IA y Snyk te da un superpoder: escribir código de forma rápida y segura.

Citando a un famoso chef, Snyk “subió la apuesta” con su funcionalidad Deep Code AI Fix. Snyk Code siempre da buenos consejos de remediación cuando encuentra una vulnerabilidad de seguridad. Incluso te daría tres buenas referencias de otros proyectos de código abierto con la misma vulnerabilidad y te mostraría cómo la solucionaron esos proyectos. Ahora, gracias a los datos cuidadosamente seleccionados del equipo de investigación de seguridad de Snyk, un modelo híbrido de IA que combina el poder de la IA generativa y simbólica, así como modelos de aprendizaje automático, Snyk puede corregir automáticamente muchas vulnerabilidades de seguridad comunes desde la comodidad de tu IDE favorito.

En este blog, demostraré cómo se puede sacar el máximo provecho de Deep Code AI Fix (DCAIF) en un proyecto Java de ejemplo que utilizamos en nuestros talleres. El código fuente puede consultarse aquí. NOTA: Este proyecto es deliberadamente vulnerable en varios aspectos y no es adecuado para su uso en ningún entorno de producción.

Diversión con una aplicación de programación de conferencias

Si alguna vez fuiste a una conferencia de tecnología o hablaste en una, sabrás que uno de los aspectos más desafiantes es crear y presentar el programa.

La aplicación de referencia es una pésima versión de lo anterior (¡NO soy un buen desarrollador front-end!) pero, es útil para mostrar cómo el código puede funcionar desde el punto de vista técnico y ser inseguro al mismo tiempo.

Es una aplicación Spring Boot que utiliza el motor de plantillas Thymeleaf. Al iniciarse, genera oradores, títulos de charlas y datos de descripción de charlas al azar utilizando la popular biblioteca faker. Todos los títulos y descripciones de las charlas proceden del texto del libro La guía del autoestopista galáctico. NOTA: Es posible que no todos los títulos y descripciones sean 100 % seguros para el trabajo. ¡Estás avisado!

Cada orador generado para el evento también tiene una página dedicada donde se puede ver una lista de sus charlas en la conferencia. Nos centraremos en esta parte de la aplicación.

Para compilar y ejecutar la aplicación, ejecuta lo siguiente:

mvn clean install
mvn spring-boot:run

Cuando ejecutes la aplicación, además del banner habitual de Spring Boot y otros resultados, verás algo como esto:

Access talks for heath.davis at: http://localhost:8081/talks?username=heath.davis
Access talks for russell.bernier at: http://localhost:8081/talks?username=russell.bernier
Access talks for kenyetta.jones at: http://localhost:8081/talks?username=kenyetta.jones
Access talks for howard.bailey at: http://localhost:8081/talks?username=howard.bailey
Access talks for buddy.jast at: http://localhost:8081/talks?username=buddy.jast
Access talks for jeanice.kertzmann at: http://localhost:8081/talks?username=jeanice.kertzmann
Access talks for deborah.hamill at: http://localhost:8081/talks?username=deborah.hamill
Access talks for horacio.renner at: http://localhost:8081/talks?username=horacio.renner
Access talks for winfred.schuster at: http://localhost:8081/talks?username=winfred.schuster
Access talks for tommie.hane at: http://localhost:8081/talks?username=tommie.hane
Access talks for micah at: http://localhost:8081/talks?username=micah

NOTA: No será exactamente así, ya que los oradores y sus charlas se generan aleatoriamente cada vez que se inicia la aplicación.

Si haces clic o copias/pegas uno de los vínculos, verás una página de oradores con una lista de sus charlas:

Juguemos: encuentra la vulnerabilidad

Echa un vistazo a TalkController.java. Así se muestra la página de un orador. ¿Puedes detectar la vulnerabilidad?

No queremos que tengas que confiar en tus ojos. Queremos que los desarrolladores se muevan rápido Y escriban código seguro.

Utilizo IntelliJ Idea para escribir mis aplicaciones Java. También utilizo la extensión IDE de Snyk. La buena noticia es que hay extensiones de IDE de Snyk para todos los IDE populares, compatibles con una amplia gama de lenguajes de programación.

Si quieres seguirnos y no tienes cuenta en Snyk, puedes crear una gratis aquí.

¿Ya mencioné que esta aplicación tiene muchas vulnerabilidades? Eso es porque la usamos en nuestros talleres. En el que quiero centrarme es en el de TalkController.java:

  1. Muestra que se encontró una vulnerabilidad de secuencia de comandos en sitios cruzados (XSS).

  2. Muestra un diff de uno de los tres proyectos de código abierto con la misma vulnerabilidad. Aquí se muestra cómo se corrigió (la parte verde).

  3. La línea roja ondulada indica dónde se encuentra la vulnerabilidad en el código.

Toda esta información es muy útil para resolver el problema. Sin embargo, observa un pequeño ícono en forma de rayo (⚡️) a la izquierda de la vulnerabilidad en n.º 1. Esto indica que esta vulnerabilidad puede solucionarse automáticamente.

Si pasas el cursor por encima de la línea roja ondulada, verás la opción Fix this issue (Solucionar este problema):

Antes de ver el resultado de Deep Code AI Fix, veamos qué haría Copilot por nosotros.

Aquí está la consulta que le di a Copilot en la línea 42 y el código que inyecta:

// guard against XSS
username = username.replaceAll("<", "&lt;").replaceAll(">", "&gt;");

Esto puede funcionar contra ataques ingenuos, pero ¿funcionará contra todos los tipos de ataques XSS? No lo creo. De hecho, cuando vuelvo a ejecutar el escaneo de Snyk, la vulnerabilidad XSS sigue ahí.

Echemos un vistazo a la solución de Snyk:

String usernameStr = "<h1>" + HtmlUtils.htmlEscape(username) + "'s talks<h1>";

Esto sí me gusta. Utiliza un enfoque idiomático y esperado con una biblioteca Spring Boot incorporada: HtmlUtils. Estoy seguro de que esto va a limpiar a fondo la entrada: username. Un nuevo escaneo de Snyk muestra que la vulnerabilidad ya no existe.

¡Bien hecho! La corrección automática de Snyk no solo resolvió la vulnerabilidad, sino que lo hizo de una forma que se ajusta al marco utilizado, que en este caso es Spring Boot.

DCAIF no te retrasará

En este post, te mostré cómo Deep Code AI Fix de Snyk va más allá de un simple consejo de remediación y puede hacer una corrección por ti. También puedes confirmar el beneficio de la corrección viendo que la vulnerabilidad de seguridad original ya no existe.

En Snyk, nos encantan los asistentes de IA, pero no son muy buenos en seguridad. Nuestras investigaciones demuestran que las IA generativas tienden a generar código inseguro en una proporción similar a la de los humanos: en torno al 40 %. Esto tiene sentido, ya que las soluciones de IA generativa pura como Copilot entrenan sus modelos principalmente con código existente. El enfoque híbrido de Snyk, que incluye IA simbólica, IA generativa, aprendizaje automático y capacitación curada de nuestro equipo de seguridad, aporta a los resultados un enfoque que da prioridad a la seguridad.

Comienza a proteger el código generado por IA

Crea tu cuenta gratuita de Snyk para empezar a proteger el código generado por IA en cuestión de minutos. O reserva una demostración con un experto para ver cómo Snyk puede adaptarse a tus casos de uso específicos de seguridad como desarrollador.

Best practices for AI in the SDLC

Download this cheat sheet today to learn best practices for how to leverage AI in your SDLC, securely.