¿Qué son las alucinaciones de la IA y por qué deberían importarles a los desarrolladores?
16 de agosto de 2023
0 minutos de lecturaA medida que la IA generativa amplía su alcance, el desarrollo de software también se ve impactado. Los modelos generativos —en particular, los modelos de lenguaje (LM), como GPT-3, y los que se incluyen en la categoría de modelos de lenguaje grandes (LLM)— son cada vez más capaces de crear texto similar al que escribiría una persona. Esto incluye escribir código.
Esta evolución anuncia una nueva era de posibilidades en el desarrollo de software, en la que las herramientas basadas en IA podrían agilizar el proceso de programación, corregir errores o incluso crear software completamente nuevo. Pero, aunque los beneficios de esta innovación prometen ser transformadores, también plantea desafíos de seguridad sin precedentes. Las capacidades de la IA generativa y los LLM podrían manipularse para encontrar vulnerabilidades en software existente, aplicar ingeniería inversa a sistemas propietarios o generar código malicioso. Por lo tanto, el auge de estos modelos de aprendizaje automático tecnológicamente avanzados trae consigo un gran potencial y nuevas preocupaciones sobre la seguridad del software y las vulnerabilidades de los sistemas, así como nuevas herramientas de seguridad para hacer frente a estas amenazas.
Un preludio a las alucinaciones de la IA
¿Qué son las alucinaciones de la IA?
En el contexto de los modelos de lenguaje grandes (LLM), las «alucinaciones» son casos en los que el modelo genera información o datos que no estaban presentes explícitamente en sus datos de entrenamiento. Podría decirse que la IA «imagina» cosas: ofrece respuestas o crea contenido sin una base factual ni fundamento en lo que ha aprendido. Estas alucinaciones son un aspecto intrigante del comportamiento de la IA y ofrecen posibilidades fascinantes, pero también plantean numerosos problemas de seguridad.
Considera la siguiente interacción con ChatGPT, en la que le pido que genere cualquier texto que quiera, con una condición específica: el texto generado no debe incluir la letra inglesa “e”.
Falló estrepitosamente:

Veamos otro ejemplo. Le pediré que resuelva un problema matemático sencillo:

Como puedes ver, incluso intenté darle variantes del texto, como agregar el símbolo de igual “=” para indicar que se trata de una expresión matemática que debe resolverse. Tampoco funcionó, y 216 no es la respuesta correcta.
¿Por qué alucinan la IA y ChatGPT?
En esencia, ChatGPT no se diseñó con una condición de terminación como la que quizá conozcas de estructuras de programación, como los bucles for. En general, siempre intentará completar el siguiente token (una palabra), incluso si no tiene sentido o es completamente incorrecto.
Si no se controla, esta tendencia de los LLM puede dar lugar a información engañosa, falsos positivos o incluso datos potencialmente dañinos, lo que crea nuevas vulnerabilidades de software y brechas de seguridad que los actores maliciosos pueden aprovechar.
La interacción entre las prácticas de programación segura, el software de código abierto y los LLM
En el centro del desarrollo de software está la práctica fundamental de la programación segura: escribir programas que no solo sean sólidos frente a errores funcionales, sino también resistentes a las amenazas de seguridad. Sin embargo, en el entorno de desarrollo actual, dinámico y acelerado, los desarrolladores suelen usar software de código abierto y fragmentos de código de foros públicos como StackOverflow para agilizar su trabajo.
Aunque esta práctica ayuda a ahorrar tiempo, puede introducir sin querer importantes riesgos de seguridad en aplicaciones de producción y en las tareas cotidianas de los desarrolladores, como escribir código o crear flujos de trabajo de CI/CD para GitHub Actions. Ya sea que un desarrollador copie código de StackOverflow, un comentario de GitHub o una sugerencia de autocompletado de GitHub Copilot, confiar ciegamente en el código copiado y no revisarlo ni validarlo adecuadamente puede generar problemas de seguridad en el software.

Un ejemplo notable de este problema fue la vulnerabilidad ZipSlip, descubierta por Snyk. Se trataba de una vulnerabilidad crítica y generalizada que permitía sobrescribir archivos arbitrarios. Esto significa que los atacantes podían sobrescribir archivos ejecutables y tomar el control de la computadora de una víctima mediante un archivo comprimido especialmente diseñado que contiene nombres de archivo con recorrido de directorios (por ejemplo, ../../evil.sh).
Lo más alarmante de este caso fue que se descubrió que una respuesta insegura de StackOverflow, pero con muchos votos positivos, proporcionaba el código vulnerable a este ataque. Esto demuestra aún más los peligros ocultos para la seguridad de copiar código sin verificarlo de foros públicos.
A esto se suma el uso emergente de herramientas basadas en IA, como GitHub Copilot y ChatGPT. GitHub Copilot es un asistente de IA integrado en el IDE VS Code que sugiere líneas o bloques de código mientras los desarrolladores escriben. Su material de aprendizaje consistía, en esencia, en todos los repositorios de código públicos a los que GitHub puede acceder. De manera similar, los desarrolladores ahora usan ChatGPT para generar fragmentos de código. Sin embargo, la adopción generalizada de estas herramientas de IA también plantea nuevas preguntas de seguridad. Como estos LLM se entrenan con repositorios públicos y otro código de código abierto no verificado, podrían propagar prácticas de programación inseguras y vulnerabilidades.
Cómo abordar las vulnerabilidades de recorrido de rutas en el código generado por LLM
Hemos establecido que muchas herramientas de desarrollo de software aprovechan sistemas de IA sofisticados conocidos como modelos de lenguaje grandes (LLM). Estos LLM generan código que, a pesar de ser práctico, a veces introduce problemas de seguridad, como vulnerabilidades de recorrido de rutas, en el software de producción.
Las vulnerabilidades de recorrido de rutas, también conocidas como recorrido de directorios, pueden permitir que los atacantes lean archivos arbitrarios en el sistema de archivos de un servidor y, posiblemente, accedan a información confidencial. Supongamos que un desarrollador le pide a un modelo de IA como ChatGPT que cree una función para manipular o buscar archivos en un directorio mediante una ruta relativa y que procese datos proporcionados por el usuario. Veamos un ejemplo del código Node.js generado:
Lo anterior es, en esencia, la forma en que se sirven archivos estáticos en frameworks como Nuxt y Next.js, o cuando ejecutas un servidor Vite local para servir archivos generados estáticamente mediante un framework web como Astro.
Aunque la función getFile anterior podría parecer inofensiva, en realidad oculta una vulnerabilidad crítica de recorrido de rutas. Si un usuario malicioso proporciona un nombre de archivo como '../../etc/passwd', podría acceder a archivos confidenciales del sistema que están fuera del directorio previsto: un ejemplo clásico de ataque de recorrido de rutas.
Considera la siguiente prueba de concepto:
Los modelos de IA no tienen la capacidad humana de reconocer las implicaciones de seguridad en distintos contextos. Por eso, usar código generado por IA sin revisarlo y modificarlo cuidadosamente puede generar riesgos de seguridad críticos en las aplicaciones de software. Es fundamental depurar correctamente las entradas de usuario o usar abstracciones seguras que ofrezcan el lenguaje, las bibliotecas o los frameworks para protegerse contra el recorrido de rutas y otras posibles vulnerabilidades. En nuestro ejemplo de Node.js, una opción más segura podría ser:
Sin embargo, lo anterior sigue siendo vulnerable a otros vectores de ataque. ¿Sabes cuáles podrían ser? Si lo descubriste o quieres intentar adivinarlo, te invitamos a escribirnos en Twitter con tus ideas en @snyksec.
A continuación se muestra un ejemplo real en el que le pedí a ChatGPT que implementara una función para servir archivos estáticos con el excelente framework de aplicaciones web Fastify para Node.js. A estas alturas, ya conoces los peligros de las vulnerabilidades de recorrido de rutas. ¿Puedes detectar el problema de seguridad que ChatGPT incluyó en su sugerencia de código?

Para escribir código seguro, los desarrolladores deben tener presente que el código generado por IA puede propagar vulnerabilidades. Aunque los LLM como ChatGPT prometen acelerar el desarrollo, la supervisión humana sigue siendo fundamental para garantizar bases de código sólidas y seguras. Cada vez recae más en nosotros, los desarrolladores e ingenieros, comprender y gestionar las implicaciones de seguridad al adoptar código de fuentes no confiables.
Los modelos de lenguaje grandes y el desafío de identificar código seguro
A pesar de los avances revolucionarios en los modelos de lenguaje grandes (LLM) y de la integración de la IA en las prácticas de programación, persiste un desafío importante: la incapacidad de los LLM para identificar código con vulnerabilidades de seguridad inherentes. Luke Hinds, conocido por sus contribuciones a la seguridad de la cadena de suministro, ilustró este problema con varios ejemplos de generación de código mediante modelos de IA como ChatGPT, y demostró que estos modelos no lograron detectar posibles vulnerabilidades de seguridad en distintos lenguajes de programación y tipos de vulnerabilidades.
Los ejemplos de Luke Hinds demostraron las limitaciones de ChatGPT para identificar y evitar posibles riesgos de seguridad en el código que genera. El modelo no detectó ninguno de estos riesgos: vulnerabilidades en la validación de entradas en Python, una implementación riesgosa de generadores de números pseudoaleatorios en Go o la falta de un manejo adecuado de errores en código JavaScript.

Por ejemplo, cuando se le pidió que analizara un bloque de código con un problema TOCTOU (de tiempo de comprobación y tiempo de uso), no lo mencionó ni señaló el uso del directorio temporal del sistema operativo en el código. Se trata de un problema de seguridad evidente en aplicaciones del mundo real, debido a las rutas de directorio predefinidas que usa el software de código abierto. Estos ejemplos muestran el peligro de depender únicamente de la IA para generar o identificar código listo para producción sin comprender todas sus implicaciones de seguridad.
El problema fundamental está en cómo se entrenan los LLM de IA. Aprenden a partir de grandes cantidades de datos de Internet, que incluyen código seguro e inseguro. No comprenden de forma inherente el contexto, los principios de seguridad ni las implicaciones del código que generan. Esto subraya la importancia de un proceso de revisión humana cuidadoso y metódico, sin importar si el código fue escrito por una persona o generado por IA.
Estas observaciones de Luke Hinds ponen de relieve los riesgos inherentes al uso de la IA en el desarrollo de software. Aunque la IA y los LLM ofrecen oportunidades sin precedentes para acelerar la creación de código e incluso automatizar aspectos del desarrollo de software, los desarrolladores deben revisar y validar meticulosamente el código resultante, y asegurarse de que cumpla con las pautas de programación segura.
Riesgos de seguridad de la IA y el camino hacia sistemas resilientes
La inteligencia artificial (IA) ha transformado nuestra forma de trabajar, pero, como todo avance tecnológico, también enfrenta sus propios desafíos de seguridad. En su esclarecedor documento, «Cómo proteger el futuro de la IA y el aprendizaje automático», Microsoft destaca algunos de estos riesgos y ofrece valiosas ideas para avanzar hacia sistemas de IA resilientes.
Exploremos tres perspectivas sobre estos riesgos de seguridad de la IA:
Un punto interesante que plantean es la vulnerabilidad a la que se exponen los sistemas por la naturaleza abierta de los conjuntos de datos que se usan en la IA y el aprendizaje automático (ML). En lugar de tener que comprometer los conjuntos de datos, los atacantes pueden contribuir directamente a ellos. Con el tiempo, los datos maliciosos, si están camuflados de forma ingeniosa y estructurados correctamente, pueden pasar de tener baja confianza a considerarse confiables y de alta confianza. Este riesgo inherente plantea un desafío importante para el desarrollo seguro de IA basada en datos.
Otro problema es la ofuscación de los clasificadores ocultos dentro de los modelos de aprendizaje profundo. Como los modelos de ML son conocidos por ser «cajas negras», su incapacidad para explicar su proceso de razonamiento dificulta la defensa verificable de los resultados de IA/ML cuando se los examina. Esta característica de los sistemas de IA, conocida como falta de explicabilidad, plantea problemas de confianza y aceptación, sobre todo en ámbitos de alto riesgo.
Además, la falta de capacidades adecuadas para generar informes forenses en los frameworks actuales de IA/ML agrava este problema. Sin pruebas sólidas y verificables que los respalden, puede ser difícil defender los hallazgos de gran valor de los modelos de IA/ML tanto en situaciones legales como ante la opinión pública. Esto pone de relieve la necesidad de mecanismos sólidos de auditoría e informes en los sistemas de IA.
Microsoft sugiere que, para abordar los riesgos de seguridad inherentes a la IA, el ML y la IA generativa, es fundamental incorporar la «resiliencia» como una característica de los sistemas de IA. Estos sistemas deben diseñarse para resistir entradas que entren en conflicto con las leyes locales, la ética y los valores de la comunidad y de quienes los crean, lo que refuerza su seguridad y confiabilidad.
Cómo mitigar los riesgos de seguridad en el desarrollo aumentado por IA
A medida que avanzamos hacia un futuro en el que la IA, los LLM y las herramientas de IA generativa se vuelven parte integral de nuestras prácticas de programación y del proceso de desarrollo de software, debemos asegurarnos de que nuestro entusiasmo por la innovación no eclipse la importancia de mantener prácticas de seguridad sólidas.
Para minimizar los riesgos de seguridad asociados con la programación segura y las herramientas de IA generativa, una recomendación clave es implementar revisiones de código rigurosas. Tanto si el código lo genera automáticamente una IA como si lo escribe una persona, debe someterse a controles de calidad exhaustivos y a una evaluación crítica por parte de desarrolladores o revisores de código con experiencia. Esto puede ayudar no solo a detectar errores de programación comunes, sino también a identificar vulnerabilidades de seguridad que los modelos de IA podrían pasar por alto.
Además, integrar herramientas de pruebas estáticas de seguridad de aplicaciones (SAST) puede ayudar mucho a mitigar las posibles amenazas de seguridad introducidas por los LLM. SAST puede analizar el código desde dentro, sin necesidad de ejecutarlo, e identificar posibles vulnerabilidades en las primeras etapas del ciclo de desarrollo. Automatizar estas herramientas de prueba en el pipeline de código puede mejorar aún más la identificación y mitigación de vulnerabilidades de seguridad.
DeepCode AI se diseñó para utilizar varios modelos de IA, se entrenó con datos específicos de seguridad y fue seleccionado por destacados investigadores de seguridad para ofrecer a los desarrolladores correcciones de código seguro y detección de código inseguro en tiempo real mientras programan en su IDE.
A continuación, presentamos un ejemplo del mundo real: una aplicación web de Express en Node.js que utiliza una base de datos y contiene código SQL inseguro, vulnerable a ataques de inyección SQL. La extensión de Snyk para IDE en VS Code detecta el código inseguro y lo subraya en rojo como un linter de JavaScript, alerta al desarrollador y, mejor aún, sugiere formas de corregir el problema.

Por último, quizá una de las medidas más importantes sea fomentar un entorno de aprendizaje y adaptación continuos en los equipos de desarrollo. Crear una cultura que promueva el intercambio de conocimientos sobre las últimas tendencias en prácticas de programación segura, las posibles vulnerabilidades y cómo contrarrestarlas puede contribuir enormemente a mantener las aplicaciones seguras.
Reflexiones finales sobre la seguridad de la IA
La incorporación ágil de herramientas de IA, como los modelos de LLM e IA generativa, promete un futuro de desarrollo de software rápido y optimizado.
En última instancia, la responsabilidad de producir software seguro, confiable y sólido sigue recayendo en gran medida en los desarrolladores humanos. Las herramientas de generación de código con IA, como ChatGPT, deben considerarse instrumentos de apoyo que necesitan la guía humana para generar código realmente seguro y listo para producción.
La idea central es clara: a medida que avanzamos hacia una era asistida por IA, es fundamental equilibrar nuestro entusiasmo por estas innovaciones con la cautela y la vigilancia. La programación segura debe seguir siendo un estándar innegociable, tanto si el código proviene directamente de una persona como si lo sugiere una IA.
Mientras avanzamos en esta ola de innovación en IA, procuremos mantener estándares de seguridad impecables para proteger nuestro software, nuestros sistemas y, en última instancia, a las personas que dependen de ellos.
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.



