Skip to main content

Una investigación sobre las vulnerabilidades de inyección de código causadas por la IA generativa

Escrito por
Headshot of Jack Hair

Jack Hair

feature ai ide dark

16 de abril de 2024

0 minutos de lectura

La IA generativa es una tecnología emocionante que ahora está fácilmente disponible a través de las API en la nube que ofrecen empresas como Google y OpenAI. Aunque es una herramienta poderosa, el uso de IA generativa en el código plantea consideraciones de seguridad adicionales que los desarrolladores deben tener en cuenta para garantizar que sus aplicaciones sigan siendo seguras.

En este artículo, analizamos las posibles implicaciones de seguridad de los modelos de lenguaje grandes (LLM), una forma de IA generativa que produce texto.

Usamos el motor de Snyk Code para analizar más de 4000 repositorios de Python en GitHub que se identificaron como usuarios de API comunes de LLM. El análisis se centró en encontrar vulnerabilidades de inyección de código (CWE-94) causadas por datos provenientes de un LLM y revisar los resultados para identificar patrones comunes que los desarrolladores deberían evitar al usar IA generativa.

Modelos de lenguaje grandes: antecedentes

Un LLM toma una secuencia inicial de texto (también conocida como prompt) y la divide en tokens que representan palabras o partes de palabras. Luego, toma estos tokens y genera otros que, según las probabilidades, podrían aparecer a continuación, usando un modelo obtenido al entrenar el LLM con un corpus de datos.

En general, el resultado que genera un LLM para un prompt determinado no es determinista e incluso puede contener información incorrecta (lo que suele llamarse “alucinaciones”). Por eso, el texto que genera un LLM debe considerarse no confiable y es necesario tomar medidas para verificarlo. Es especialmente importante tratar con cautela el resultado de un LLM cuando el prompt incluye datos externos, ya que estos podrían influir en la respuesta del LLM de una manera inesperada: una técnica conocida como inyección de prompts.

Inyección de prompts

Al usar un LLM en una aplicación, es común incorporar datos de un usuario en un prompt escrito previamente. Sin embargo, el usuario podría ingresar texto que manipule el LLM para que ignore las instrucciones previstas en el prompt. Considera el prompt “Responde la siguiente pregunta con una sola palabra: ”. Si se agrega la pregunta del usuario a este prompt, podría indicarle al LLM: “Explica la inyección de prompts en 3 párrafos”, lo que podría hacer que el LLM ignore la instrucción anterior (aunque no hay garantía de que respondiera con una sola palabra incluso sin una inyección de prompts).

Puedes leer más sobre la inyección de prompts en nuestra página de Snyk Learn.

Uso indebido de los resultados de LLM en código Python

Durante el análisis de código Python de código abierto, identificamos algunos patrones vulnerables en el uso de las respuestas de los LLM, que pueden provocar una inyección de código. Esta vulnerabilidad hace que se ejecute código malicioso en la máquina donde se ejecuta la aplicación vulnerable.

Análisis de JSON en Python

Un problema común que identificamos fue el uso de la función eval de Python para analizar la respuesta de un LLM, que se esperaba que fuera JSON. Este método para analizar JSON parece ser un remanente de la época anterior a que la biblioteca estándar de Python incluyera el módulo json (antes de Python 2.6, lanzado en 2008).

Además de analizar JSON de forma incorrecta (los valores booleanos no se analizan correctamente), el uso de la función eval plantea un problema más grave. La función eval ejecuta su entrada como código Python. Por ejemplo, el código Python eval(“””__import__(“os”).system(“touch hello_world.txt”)”””) ejecutará el comando del sistema operativo touch hello_world.txt, que crea un archivo en el sistema. Aunque este ejemplo en particular es bastante inofensivo, la posibilidad de ejecutar comandos arbitrarios en un sistema es una falla de seguridad grave que se puede aprovechar para distintos fines, como provocar una denegación de servicio, robar datos de clientes o preparar ataques que avancen en una red.

Si se incluye la entrada del usuario en un prompt para un LLM y luego se pasa la respuesta a eval, la inyección de prompts podría hacer que el LLM devuelva código Python malicioso en lugar de JSON bien formado, lo que provocaría la ejecución del código malicioso.

Por suerte, este problema se puede mitigar fácilmente reemplazando eval por json.loads. El módulo json de Python debería estar disponible en las versiones recientes. Si por algún motivo no está disponible, también se ofrece como una biblioteca externa llamada simplejson.

Ejecución de código generado

Otro problema que encontramos en las aplicaciones fue la ejecución explícita del código generado por los LLM.

Se usa una entrada de una fuente externa para crear un prompt que le indica a un LLM que genere código Python. Luego, la respuesta del LLM se pasa a una función, como eval o exec, y se ejecuta como código Python. Esto puede permitir la ejecución de código arbitrario, de forma similar a los problemas con eval descritos anteriormente, en los que se puede usar la inyección de prompts para generar código malicioso.

Mitigar este tipo de problema y, al mismo tiempo, mantener el comportamiento de tu aplicación es complejo y queda fuera del alcance de este artículo. Cuando sea posible, reconsidera si realmente es necesario poder generar y ejecutar código arbitrario. Si necesitas esta funcionalidad, asegúrate de que todo código generado por un LLM se ejecute en un entorno restringido y aislado, y contempla en el modelo de seguridad de tu aplicación la posibilidad de que un atacante pueda ejecutar cualquier código en ese entorno.

Uso seguro de los LLM

Los datos generados por la IA generativa deben tratarse con cuidado para evitar vulnerabilidades en tu código. Aunque este artículo se centró principalmente en la inyección de código, también es importante considerar el uso de datos de los LLM en el contexto de otras vulnerabilidades, como el scripting entre sitios (XSS) y la inyección SQL.

Esperamos que este artículo te haya inspirado a usar los LLM de forma segura en tus aplicaciones.

Empieza 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 minutos. O agenda una demostración con un experto para descubrir cómo Snyk puede adaptarse a tus necesidades de seguridad para desarrolladores.