Cómo usar la IA para el desarrollo de software y la ciberseguridad
30 de agosto de 2023
0 minutos de lecturaHemos visto cómo la tecnología puede evolucionar a una velocidad vertiginosa, y la IA ha surgido como una fuerza revolucionaria y, a la vez, un enigma fascinante. Tanto si eres un desarrollador con experiencia que busca ampliar sus herramientas como si te apasiona la seguridad y quieres entender mejor el mundo de la IA, emprender el camino para descifrar este campo dinámico puede ser emocionante y abrumador.
Esta publicación es tu brújula para recorrer el laberinto de la IA. Está diseñada para brindarles a desarrolladores y entusiastas de la seguridad las herramientas necesarias no solo para comprender los conceptos fundamentales, sino también para impulsar conversaciones valiosas y trazar un camino hacia una exploración más profunda. Adoptaremos un enfoque de arriba hacia abajo: primero analizaremos las áreas de la IA en las que debemos centrarnos, luego descifraremos su terminología e iluminaremos caminos que vale la pena investigar más a fondo.
Categorías de IA en el desarrollo
Después de hablar con muchas personas sobre la IA, descubrí que una buena forma de organizar las ideas en torno a las capacidades o tecnologías de IA es dividirlas en tres categorías:
Desarrollo asistido por IA: desarrollo que utiliza IA generativa para ayudar a escribir, revisar y documentar código.
Aplicaciones asistidas por IA: capacidades de IA que se incorporan a una aplicación, como un chatbot.
Herramientas asistidas por IA: herramientas que aprovechan la IA integrada para mejorar su eficacia y la de los procesos en los que se utilizan.
En esta publicación nos centraremos en el desarrollo asistido por IA, pero pronto hablaremos de las otras categorías en futuras publicaciones. ¡Mantente al tanto!
Otros términos que debes conocer
¡Definamos algunos términos más!
Conceptos fundamentales de IA
Inteligencia artificial (IA): simulación de procesos de inteligencia humana por parte de máquinas, que les permite aprender de la experiencia, adaptarse a información nueva y realizar tareas que normalmente requieren inteligencia humana.
Procesamiento del lenguaje natural (PLN): rama de la IA que se centra en permitir que las computadoras comprendan, interpreten y generen lenguaje humano.
Aprendizaje automático (ML): rama de la IA que permite que los sistemas mejoren su desempeño en una tarea específica mediante la exposición a datos, sin necesidad de programarlos explícitamente.
Redes neuronales: modelos computacionales inspirados en la estructura y el funcionamiento del cerebro humano, capaces de aprender patrones y relaciones en los datos.
Comprensión del lenguaje y el texto:
LLM (modelo de lenguaje de gran tamaño): tipo de red neuronal artificial entrenada con una enorme cantidad de datos de texto, que le permite generar textos similares a los humanos y comprender el lenguaje hasta cierto punto.
Transformador generativo preentrenado (GPT): arquitectura avanzada de red neuronal que se utiliza para generar textos coherentes, similares a los humanos, a partir de un entrenamiento exhaustivo con lenguaje.
Chatbot: software con tecnología de IA que mantiene conversaciones automatizadas con los usuarios y aprovecha el procesamiento del lenguaje natural para comprender y responder a entradas de texto o voz.
Desarrollo asistido por IA
Esta publicación trata sobre el desarrollo asistido por IA. Hablaremos de cómo la IA nos permite escribir y empaquetar código con mayor rendimiento y eficacia. Empezaremos por la escritura de código y luego pasaremos a las pruebas, la revisión y la documentación.
Escribir código
La aplicación más evidente y comentada del uso de herramientas de IA durante el desarrollo son las sugerencias de código. Algunas herramientas, como ChatGPT, pueden ofrecer ejemplos de código según tus solicitudes específicas. Por ejemplo, podrías pedir en lenguaje conversacional código que realice una tarea:

Veamos el código que genera.
Otras herramientas, como GitHub Copilot, Amazon CodeWhisperer y Tabnine, tres ejemplos populares, ofrecen funciones similares directamente en el IDE que usas. Esto significa que, mientras escribes código, por ejemplo en la definición de un método o en un comentario, los complementos del IDE te sugieren código que puedes aceptar o rechazar.
Como adelanto, el código generado más arriba contiene una vulnerabilidad crítica de gravedad importante. Así es: los LLM aprenden del código de la comunidad, que está plagado de vulnerabilidades, por lo que las sugerencias de código que recibimos también pueden contener vulnerabilidades. Es fundamental que sigamos probando el código con las herramientas habituales para asegurarnos de que tanto el código generado como el que escribimos sean seguros. Vuelve a revisar el código y comprueba si puedes detectar la vulnerabilidad. Sigue leyendo hasta la siguiente sección, Probar código, donde te mostraremos los detalles de la vulnerabilidad y cómo corregirla.
Otras herramientas interesantes son AI Query, que genera consultas SQL a partir de instrucciones en lenguaje natural. Es especialmente útil si, por motivos de seguridad, intentas crear una separación entre tu LLM y tus datos. Así puedes validar que las consultas generadas no hagan nada riesgoso y que sean razonables para que un usuario final las ejecute con su nivel de autorización.
Probar código
¿Llegaste hasta aquí porque encontraste la vulnerabilidad? ¿O ni siquiera lo intentaste y solo quieres saber la respuesta? En cualquier caso, acotemos un poco el problema :) La vulnerabilidad es un ejemplo de un problema de seguridad Zip Slip. Combina el recorrido de directorios con la sobrescritura arbitraria de archivos e incluso puede permitir la ejecución arbitraria de código. Esta es la línea que causa la vulnerabilidad:
Primero, veamos el contenido de un archivo comprimido peligroso; así probablemente entenderás por qué el código anterior es vulnerable. El siguiente archivo puede agregarse legalmente a un archivo ZIP, según la especificación del formato ZIP.
Como probablemente ya dedujiste, cuando concatenamos este nombre de archivo comprimido con el directorio de destino, es probable que la copia del archivo resultante se realice en el directorio temporal del sistema, en lugar de en el directorio de destino. Puede ser un vector de ataque muy peligroso, aunque es un resultado bastante común de las herramientas de generación de código.
Para completar la solución, después de concatenar los nombres de archivo, debemos obtener el nombre canónico y validar que se encuentre dentro del directorio de destino, de la siguiente manera:
Voy a abrir este archivo en el navegador de IntelliJ, donde ya tengo Snyk instalado. Snyk analizará el código fuente y, con sus capacidades de IA simbólica, comprenderá los flujos de datos y código de la aplicación. Como puedes ver en la captura de pantalla de abajo, identificó el problema en el código nuevo (1), proporcionó una descripción completa del problema (2) e incluso incluyó ejemplos de cómo corregirlo, similares a lo que mostramos arriba (3).

Comienza con Capture the Flag
Aprende a resolver desafíos de Capture the Flag con nuestro taller virtual 101 a pedido.
Mencionamos la IA simbólica, uno de los tipos de IA que usa Snyk. También se pueden usar otros tipos de IA, cada uno con distintas ventajas y desventajas según tus objetivos. Para obtener más información, lee nuestra guía para usar distintos modelos de IA. La ola de IA que se popularizó con ChatGPT utiliza:
IA de aprendizaje automático: enfoque de IA que permite que los sistemas aprendan de los datos y mejoren su desempeño en una tarea específica sin necesidad de programarlos explícitamente. Entre sus subtipos se encuentran el aprendizaje supervisado, no supervisado y por refuerzo.
IA de redes neuronales: rama del aprendizaje automático que utiliza redes neuronales artificiales, inspiradas en el cerebro humano, para reconocer patrones, características y relaciones en los datos.
IA simbólica (o razonamiento simbólico): tipo de IA que representa el conocimiento mediante símbolos, reglas y lógica para realizar tareas, a menudo con expresiones legibles para las personas y razonamiento formal.
IA evolutiva (o algoritmos genéticos): enfoque de IA que imita el proceso de selección natural para desarrollar y optimizar soluciones a problemas. Suele usarse en tareas de optimización y diseño.
IA de sistemas expertos: tipo de IA que emula la experiencia humana en un dominio específico mediante una base de conocimiento de hechos y reglas para tomar decisiones o hacer recomendaciones.
Otra herramienta que vale la pena conocer es Codium, una herramienta basada en IA que analiza tu código, te explica qué hace, crea un plan de pruebas e incluso genera las pruebas para que puedas copiarlas y usarlas en tus suites de pruebas unitarias.
Revisar código
Para revisar código que ya se escribió, como un pull request, quizá te interese What the Diff. Es una herramienta basada en Git que puede resumir los cambios realizados en el PR, ayudarte a redactar un resumen e incluso contribuir a la refactorización del código incluido en el PR.
¡Hemos cubierto mucho! Escribir, probar y revisar código… ¿Listo para empezar?
Asegúrate de que los cambios en tu código no provoquen regresiones ni introduzcan problemas de seguridad. Estos pueden ir desde problemas de calidad hasta problemas de seguridad, como los que mencionamos antes.
Asegúrate de seguir usando las herramientas habituales durante todo el proceso de revisión y del SDLC. El uso de IA generativa no debería reemplazarlas; al contrario, deberías apoyarte más en ellas, ya que probablemente se desarrollará y entregará más código y funcionalidad en el mismo tiempo.
Consulta nuestra guía rápida de prácticas recomendadas para usar IA en el SDLC. Las integraciones de Snyk con el SDLC, incluidas nuestras integraciones de PR con repositorios Git, pueden ayudarte a revisar el código como parte de tu flujo de trabajo habitual y asegurarte de no introducir vulnerabilidades propias ni de terceros, contenedores vulnerables o problemas de seguridad o configuraciones incorrectas de IaC.
Toma el control de la seguridad de la IA con Snyk
Descubre cómo Snyk ayuda a proteger el código generado por IA de tus equipos de desarrollo y ofrece a los equipos de seguridad visibilidad y controles completos.
