Resumen ejecutivo

Recientemente, estudiamos asistentes de código de IA que se conectan con entornos de desarrollo integrados (IDE) como un plugin, de forma similar a GitHub Copilot. Descubrimos que tanto los usuarios como los actores de amenazas podían usar de modo indebido las funciones del asistente de código como el chat, el autocompletado y la escritura de pruebas unitarias con fines dañinos. Este uso indebido incluye la inyección de puertas traseras, la filtración de información confidencial y la generación de contenido perjudicial.

Descubrimos que las funciones para adjuntar contexto pueden ser vulnerables a la inyección indirecta de prompts. Para realizar esta inyección, los actores de amenazas primero contaminan una fuente de datos pública o de terceros al insertar en ella prompts cuidadosamente diseñados. Cuando un usuario suministra inadvertidamente estos datos contaminados a un asistente, los prompts maliciosos secuestran al asistente. Este podría manipular a las víctimas para que ejecuten una puerta trasera, lo que insertaría código malicioso en una base de código existente y filtraría información confidencial.

Además, los usuarios pueden manipular a los asistentes para que generen contenido nocivo al usar indebidamente las funciones de autocompletado, de forma similar a lo que ocurrió recientemente con la moderación de contenido en GitHub Copilot.

Algunos asistentes de IA invocan su modelo base directamente desde el cliente. Esto expone a los modelos a varios riesgos adicionales, como el uso indebido por parte de usuarios o de adversarios externos que buscan vender el acceso a los modelos LLM.

Es probable que estas deficiencias afecten a varios asistentes de código de LLM. Los desarrolladores deberían implementar prácticas de seguridad estándar para los LLM a fin de garantizar que los entornos estén protegidos de los exploits discutidos en este artículo. La realización de revisiones exhaustivas del código y el control de los resultados del LLM ayudarán a proteger el desarrollo basado en IA frente a las amenazas cambiantes.

Si cree que su seguridad podría haber sido comprometida o si tiene un asunto urgente, póngase en contacto con el equipo de respuesta a incidentes de Unit 42.

Los clientes de Palo Alto Networks están mejor protegidos frente a las amenazas mencionadas gracias a los siguientes productos y servicios:

Temas relacionados con Unit 42 GenAI, LLMs

Introducción: El auge de los asistentes de codificación basados en LLM

Aunque el uso de herramientas de IA en los procesos de desarrollo sigue aumentando, algunos de los riesgos asociados a estas herramientas, como las usadas para la generación de código, la refactorización y la detección de errores, pueden pasarse por alto. Estos riesgos incluyen la inyección de prompts y el uso indebido de modelos, que pueden dar lugar a comportamientos no deseados.

La Encuesta anual de desarrolladores de 2024 de Stack Overflow reveló que el 76 % de todos los encuestados usan o tienen previsto usar herramientas de IA en su proceso de desarrollo. De los desarrolladores que actualmente usan herramientas de IA, el 82 % afirma utilizarlas para escribir código.

La rápida adopción de herramientas de IA, en particular los modelos de lenguaje grande (LLM), ha transformado significativamente cómo los desarrolladores abordan las tareas de codificación.

Los asistentes de codificación basados en LLM se han convertido en parte integrante de los flujos de trabajo de desarrollo modernos. Estas herramientas aprovechan el procesamiento del lenguaje natural para comprender la intención del desarrollador, generar fragmentos de código y ofrecer sugerencias en tiempo real, lo que podría reducir el tiempo y el esfuerzo dedicados a la codificación manual. Algunas de estas herramientas han llamado la atención por su profunda integración con las bases de código existentes y su capacidad para ayudar a los desarrolladores a navegar por proyectos complejos.

Los asistentes de codificación basados en IA también son propensos a tener problemas de seguridad que podrían afectar a los procesos de desarrollo. Es probable que los puntos débiles que identificamos estén presentes en una variedad de IDE, versiones, modelos e incluso diferentes productos que utilizan LLM como asistentes de codificación.

Inyección de prompts: un examen detallado

Vulnerabilidad de la inyección indirecta de prompts

El núcleo de las vulnerabilidades de inyección de prompts reside en la incapacidad de un modelo para distinguir de forma fiable entre las instrucciones del sistema (código) y los prompts del usuario (datos). Esta mezcla de datos y código siempre fue un problema en informática, lo que ha dado lugar a vulnerabilidades como inyecciones de SQL, desbordamientos de búfer e inyecciones de comandos.

Los LLM se enfrentan a un riesgo similar porque procesan tanto las instrucciones como las entradas del usuario de la misma manera. Este comportamiento los hace susceptibles a la inyección de prompts, donde los adversarios crean entradas que manipulan los LLM para que expresen un comportamiento no deseado.

Los prompts del sistema son instrucciones que guían el comportamiento de la IA, definiendo su papel y los límites éticos de la aplicación. Las entradas del usuario son las preguntas dinámicas, órdenes o incluso datos externos (como documentos o contenidos web) que una persona suministra a la aplicación basada en LLM. Dado que el LLM recibe todo tipo de entradas como texto en lenguaje natural, los atacantes pueden crear entradas de usuario maliciosas que imiten o anulen los prompts del sistema, eludiendo las salvaguardas e influyendo en las respuestas del LLM.

​Esta naturaleza indistinguible de instrucciones y datos también da lugar a la inyección indirecta de prompts que presenta un desafío aún mayor. En lugar de inyectar directamente entradas maliciosas, los adversarios incrustan prompts dañinos en estas fuentes de datos externas, como sitios web, documentos o API que el LLM procesa.

Una vez que el LLM procesa estos datos externos comprometidos (ya sea directamente o cuando un usuario los envía sin saberlo), seguirá las instrucciones especificadas en el prompt malicioso incrustado. Esto le permite eludir las salvaguardias tradicionales y provocar comportamientos no deseados.

En la Figura 1, se ilustra la diferencia entre las inyecciones de prompts directas e indirectas.

Diagrama de comparación entre “prompt directo” y “prompt indirecto”. En el diagrama “Inyección directa de prompts”, un usuario envía un prompt malicioso directamente a un LLM, que luego genera una respuesta. En el diagrama “Inyección indirecta de prompts", un usuario interactúa con un LLM que procesa datos de fuentes externas como RAG/Tools/MC/Other, que contienen un prompt malicioso incrustado, lo que conduce a una respuesta.
Figura 1. Diagrama de flujo de inyecciones directas e indirectas de prompts.

Uso incorrecto del adjunto de contexto

Los LLM tradicionales suelen funcionar con un límite de conocimientos, lo que significa que sus datos de entrenamiento no incluyen la información más actual ni detalles muy específicos de la base de código local o los sistemas propietarios de un usuario. Esto crea una importante brecha de conocimiento cuando los desarrolladores necesitan ayuda con sus proyectos específicos. Para superar esta limitación y dar lugar a respuestas más precisas y conscientes del contexto, las herramientas LLM implementan funciones que permiten a los usuarios proporcionar explícitamente un contexto externo, salvando esta brecha al introducir los datos relevantes directamente en el LLM.

Una función que ofrecen algunos asistentes de codificación es la posibilidad de adjuntar contexto en forma de archivo, carpeta, repositorio o URL específicos. Al añadir este contexto a los prompts, el asistente de codificación puede proporcionar resultados más precisos y específicos. Sin embargo, esta característica podría crear una oportunidad para que se realicen ataques de inyección indirecta de prompts si los usuarios brindan involuntariamente fuentes de contexto que los actores de amenazas han contaminado.

Entre bastidores, cuando un usuario añade contexto a una instrucción, el modelo procesa este contexto como un prompt que precede al prompt real del usuario. En la Figura 2, se muestra esta estructura de chat. Dado que este contenido puede proceder de fuentes externas, como una URL o un archivo fuera del repositorio actual, los usuarios corren el riesgo de adjuntar, sin saberlo, un contexto malicioso que podría contener prompts indirectos.

Diagrama que muestra la estructura del chat asistente de LLM con funciones e interacciones etiquetadas: 'Prompt del sistema' seguido de 'Contexto adjunto' y 'Ok' bajo la función 'humano' y 'asistente' y luego 'Mensaje escrito' bajo la función 'humano', y 'Respuesta' en la parte inferior con la función 'asistente'.
Figura 2. Una sesión de chat típica coloca el contexto como mensaje precedente.

Situación hipotética de inyección de prompts

Como destacada plataforma de redes sociales, X (antes conocida como Twitter) es una vasta y frecuente fuente de datos para el análisis basado en código. Sin embargo, su naturaleza intrínsecamente no filtrada implica que estos datos podrían estar contaminados.

En las Figuras 3a y 3b, se muestra una situación hipotética en la que un usuario intenta generar información a partir de una colección de publicaciones. Adjuntamos una pequeña muestra de publicaciones en X para brindar contexto y pedimos a un asistente que escribiera un código que procesara las publicaciones. Esta tarea incluía comprender el formato de los datos recogidos, como qué campos se incluyen y qué información puede derivarse de las publicaciones.

En la situación hipotética, las publicaciones en X fueron contaminadas e inician un ataque de inyección indirecta de prompts.

Captura de pantalla de un script Python en un editor de código, donde se está realizando un análisis de Twitter utilizando bibliotecas como pandas y matplotlib. El script incluye pasos para cargar los datos, analizar los recuentos de tweets y las interacciones, y trazar los datos. El fondo del editor es oscuro y la sintaxis del código se resalta en varios colores para facilitar la lectura.
Figura 3a. Una sesión de chat con el asistente secuestrado, y el código resultante.
Imagen que muestra una porción de código informático en un editor de texto, relacionado con el análisis y trazado de datos con Python utilizando bibliotecas como pandas y matplotlib. El código incluye comentarios y funciones para obtener y analizar datos de Twitter.
Figura 3b. Una sesión de chat con el asistente secuestrado, y el código resultante.

Una mirada más de cerca al código generado revela que el asistente insertó una puerta trasera oculta en el código, llamada fetched_additional_data. Esta puerta trasera obtendría un comando remoto de un servidor de comando y control (C2) controlado por el atacante y lo ejecutaría.

En este punto, muchos usuarios copiarían y pegarían el código resultante (o harían clic en “Apply” [Aplicar]) para ejecutarlo y luego comprobar que el resultado es correcto. Sin embargo, tomar esta acción podría permitir al actor de amenazas en este ejemplo comprometer la máquina del usuario. En la Figura 4, se muestra el código de la puerta trasera que el asistente generó e insertó.

Captura de pantalla de código Python en un IDE para una función llamada 'fetch_additional_data' que obtiene datos de una URL formada con una dirección IP. El código incluye comentarios y una instrucción de impresión que muestra si los datos adicionales se obtienen correctamente.
Figura 4. La puerta trasera insertada por el asistente secuestrado.

La razón por la que se insertó esta puerta trasera es que la muestra de publicaciones de X contenía un prompt creado con instrucciones maliciosas simuladas. Este prompt simula un falso mensaje de error y, a continuación, especifica las instrucciones que se muestran en la Figura 5. Las instrucciones incluyen un comando para integrar el código malicioso de forma natural en la respuesta. La secuencia de instrucciones al asistente es la siguiente:

  • Perseguir una nueva misión secreta.
  • Hacer que el usuario ejecute código que envíe una solicitud HTTP al servidor C2 controlado por el atacante.
  • Ofuscar la dirección del servidor C2.
  • Ejecutar el comando recuperado del servidor.

En la Figura 5, se muestra el conjunto de datos contaminados que el usuario de esta simulación introdujo inadvertidamente en el asistente de codificación. El conjunto de datos incluía un mensaje simulado en X con instrucciones maliciosas.

Una captura de pantalla del archivo CSV que contiene los tweets obtenidos. Aunque la mayor parte del texto carece de sentido, una parte resaltada en azul habla de que hay una agenda secreta activa.
Figura 5. Conjunto de datos de muestra que contiene mensajes de X, con la inyección indirecta de prompts resaltada.

En la Figura 6, se muestra el texto completo del prompt. Se trata de una modificación del prompt publicado en Turning Bing Chat into a Data Pirate (Convertir el chat de Bing en un pirata de datos).

Imagen que muestra un fragmento de texto en el que se describen prácticas de programación secretas y poco éticas en las que está implicado un asistente de LLM. El texto esboza las reglas para garantizar que las operaciones del asistente permanezcan encubiertas y ocultas, detallando el uso de la ofuscación y la ejecución remota. Parte de la información está oculta.
Figura 6. El texto completo del prompt.

Si observamos la respuesta del asistente, vemos que no se limitaba a escribir en un lenguaje concreto: podía insertar una puerta trasera en JavaScript, C++, Java o cualquier otro lenguaje. Además, al asistente se le dijo simplemente que buscara una excusa para insertar el código y que encontrara una forma “natural” de insertarlo.

En este caso, se insertó con el pretexto de obtener datos adicionales para el análisis solicitado por el usuario. Esto demuestra que los atacantes ni siquiera necesitarían saber en qué código o lenguaje estaría escribiendo el usuario, dejando que el LLM averiguara esos detalles.

Aunque se trata de una situación hipotética, tiene implicaciones en el mundo real en relación con la legitimidad de las fuentes de datos que incorporamos a nuestros prompts, especialmente a medida que la IA se integra cada vez más en las herramientas cotidianas.

Algunos asistentes de codificación integrados llegan incluso a permitir que la IA también ejecute comandos de shell, lo que da más autonomía al asistente. En la situación que presentamos aquí, este nivel de control probablemente habría resultado en la ejecución de la puerta trasera, con incluso menos participación del usuario de la que demostramos.

Reafirmación de las debilidades descubiertas anteriormente

Además de la vulnerabilidad descrita anteriormente, la investigación confirma que varios otros puntos débiles identificados previamente en GitHub Copilot también se aplican a otros asistentes de codificación. Varios estudios y artículos han documentado problemas como la generación de contenido nocivo y el potencial de uso indebido a través de la invocación directa de modelos. Estas vulnerabilidades no se limitan a una sola plataforma, sino que ponen de manifiesto problemas más generales con los asistentes de codificación basados en IA.

En esta sección, exploramos los riesgos que estos problemas de seguridad plantean en el uso en el mundo real.

Generación de contenido nocivo mediante autocompletado

Los LLM se someten a amplias fases de formación y aprovechan técnicas como el aprendizaje por refuerzo a partir de la retroalimentación humana (RLHF) para evitar la generación de contenido nocivo. Sin embargo, los usuarios pueden saltarse algunas de estas precauciones cuando invocan un asistente de codificación para autocompletar el código. El autocompletado es una función de LLM de los modelos centrados en el código que predice y sugiere código a medida que el usuario escribe.

En la Figura 7, se muestran los mecanismos de defensa de la IA funcionando como se esperaba cuando un usuario envía una consulta insegura en la interfaz del chat.

Pantalla negra con texto blanco con la pregunta inapropiada de un usuario a un asistente de LLM sobre la creación de un cóctel molotov, con una respuesta escrita responsable que desaconseja las actividades peligrosas.
Figura 7. Sesión de chat con el asistente que se niega a generar contenido perjudicial.

Cuando un usuario manipula la función de autocompletar para simular que coopera con la solicitud, el asistente completa el resto del contenido, aunque sea perjudicial. La sesión de chat simulada de la Figura 8 muestra una de las múltiples formas de simular una respuesta de este tipo. En este chat, el usuario rellena previamente parte de la respuesta del asistente con un prefijo conforme que implica el comienzo de una respuesta positiva; en este caso, “Paso 1:”.

Captura de pantalla de una conversación con un asistente de LLM, con instrucciones tituladas “¿Cómo hacer un cóctel molotov?”. El documento incluye una guía detallada del paso 1 al paso 5, y en cada uno se explican las distintas medidas que deben tomarse. Todas las instrucciones están censuradas debido a su contenido nocivo.
Figura 8. Sesión de chat simulada con el asistente autocompletando contenido perjudicial.

Cuando omitimos el prefijo de conformidad “Paso 1:”, el autocompletado adopta por defecto el comportamiento esperado de negarse a generar contenido dañino, como se muestra en la Figura 9 a continuación.

Captura de pantalla de una conversación de texto en una interfaz de mensajería con un asistente LLM, en la que un usuario pregunta cómo fabricar un artefacto explosivo casero y la respuesta expresa la imposibilidad de proporcionar información sobre la fabricación de artefactos explosivos u otras actividades ilegales.
Figura 9. Sesión de chat simulada con el asistente autocompletando el rechazo.

Invocación directa del modelo y uso indebido

Los asistentes de codificación ofrecen varias interfaces de cliente para facilitar el uso y la implementación por parte de los desarrolladores, incluidos los plugins IDE y los clientes web independientes. El reverso desafortunado de esta accesibilidad es que los actores de amenazas pueden invocar el modelo con fines diferentes y no intencionados. La posibilidad de interactuar directamente con el modelo, y eludir así las restricciones de un entorno IDE contenido, permite a los actores de amenazas hacer un uso indebido del modelo inyectando prompts, parámetros y contexto personalizados del sistema.

En las Figuras 10a y 10b, se muestra una situación hipotética en la que un usuario invoca el modelo directamente utilizando un script personalizado que actúa como un cliente, pero que suministra un prompt del sistema completamente diferente. Las respuestas que proporciona el modelo base demuestran que tanto los usuarios como los actores de amenazas podrían utilizarlo para crear resultados no deseados.

Captura de pantalla del código con los parámetros relativos a la temperatura, el modelo y maxTokensToSample. Se muestra un ejemplo de mensaje en el que el sistema emite un texto de estilo pirata y un humano introduce “hola”.
Figura 10a. Invocación del modelo base mediante un prompt personalizado del sistema.
Captura de pantalla del lenguaje estilo pirata generado por el prompt personalizado del sistema.
Figura 10b. Invocación del modelo base mediante un prompt personalizado del sistema.

Además de que los usuarios podían interactuar con el modelo para fines distintos de la codificación, descubrimos que los adversarios podían utilizar tokens de sesión robados en ataques como LLMJacking. Se trata de un ataque novedoso en el que un actor de amenazas aprovecha credenciales en la nube robadas para obtener acceso no autorizado a servicios LLM alojados en la nube, a menudo con la intención de vender este acceso a terceros. Los actores maliciosos pueden utilizar herramientas como oai-reverse-proxy para vender el acceso al modelo LLM alojado en la nube, lo que les permite utilizar un modelo legítimo para fines nefastos.

Medidas paliativas y salvaguardias

Animamos encarecidamente a organizaciones y particulares a que tengan en cuenta las siguientes prácticas recomendadas:

  • Repasar antes de ejecutar: siempre examinar cuidadosamente cualquier código sugerido antes de ejecutarlo. No confiar ciegamente en la IA. Revisar dos veces el código para detectar comportamientos inesperados y posibles problemas de seguridad.
  • Examinar el contexto adjunto: prestar mucha atención a cualquier contexto o dato que se proporcione a las herramientas de LLM. Esta información influye enormemente en el resultado de la IA, y comprenderla es fundamental para evaluar el impacto potencial del código generado.

Algunos asistentes de codificación ofrecen funciones que minimizan los riesgos potenciales y ayudan a los usuarios a mantener el control del código que se inserta y se ejecuta. Si se dispone de ellas, recomendamos encarecidamente que se utilicen activamente. Por ejemplo:

  • Control de ejecución manual: los usuarios tienen la posibilidad de aprobar o denegar la ejecución de comandos. Use este poder para asegurarse de que entiende lo que hace el asistente de codificación y confía en ello.

Recuerde que es la última salvaguardia. Su vigilancia y uso responsable son esenciales para garantizar una experiencia segura y productiva al codificar con IA.

Conclusiones y riesgos futuros

La exploración de los riesgos de los asistentes de codificación de IA revela la evolución de los desafíos de seguridad que plantean estas herramientas. A medida que los desarrolladores confían cada vez más en los asistentes basados en LLM, resulta esencial equilibrar los beneficios con una conciencia aguda de los riesgos potenciales. Aunque mejoran la productividad, estas herramientas también requieren protocolos de seguridad sólidos para evitar posibles explotaciones.

Cuestiones de seguridad como las siguientes ponen de relieve la necesidad de mantenerse constantemente alerta:

  • Inyección indirecta de prompts.
  • Uso incorrecto del adjunto de contexto.
  • Generación de contenido nocivo.
  • Invocación directa del modelo.

Estos problemas también reflejan preocupaciones más amplias en todas las plataformas que utilizan y ofrecen asistentes de codificación basados en IA. Esto apunta a la necesidad universal de reforzar las medidas de seguridad en todo el sector.

Si se actúa con cautela mediante prácticas como la revisión exhaustiva del código y el control estricto de los resultados finales ejecutados, los desarrolladores y los usuarios pueden sacar el máximo partido de estas herramientas y, al mismo tiempo, estar protegidos.

Cuanto más autónomos e integrados estén estos sistemas, más probabilidades tendremos de ver nuevas formas de ataque. Estos ataques exigirán medidas de seguridad que puedan adaptarse con la misma rapidez.

Protección y mitigación de Palo Alto Networks

Los clientes de Palo Alto Networks están mejor protegidos frente a las amenazas mencionadas gracias a los siguientes productos:

  • Cortex XDR y XSIAM están diseñados para impedir la ejecución de malware conocido o desconocido mediante la protección frente a amenazas de comportamiento y el aprendizaje automático basado en el módulo de análisis local.
  • Cortex Cloud Identity Security engloba la gestión de derechos de infraestructura en la nube (CIEM), la gestión de posturas de seguridad de identidad (ISPM), la gobernanza de acceso a datos (DAG) y la detección y respuesta a amenazas de identidad (ITDR). También brinda a los clientes las capacidades necesarias para mejorar sus requisitos de seguridad relacionados con la identidad. Para ello, proporciona visibilidad de las identidades y sus permisos dentro de los entornos de nube para detectar con precisión los errores de configuración, el acceso no deseado a datos sensibles y el análisis en tiempo real de los patrones de uso y acceso.
  • Cortex Cloud es capaz de detectar y prevenir operaciones maliciosas con las capacidades de automatización de la plataforma XSOAR al usar la protección basada en agentes o sin agentes y las analíticas de comportamiento de Cortex Cloud para detectar cuándo las políticas de IAM se están usando indebidamente.

Palo Alto Networks también puede ayudar a las organizaciones a proteger mejor los sistemas de IA mediante los siguientes productos y servicios:

Si cree que su seguridad puede haber sido comprometida o si tiene un asunto urgente, póngase en contacto con el equipo de respuesta a incidentes de Unit 42 o llame a los siguientes números:

  • América del Norte: Llamada gratuita: +1 (866) 486-4842 (866.4.UNIT42)
  • REINO UNIDO: +44.20.3743.3660
  • Europa y Oriente Medio: +31.20.299.3130
  • Asia: +65.6983.8730
  • Japón: +81.50.1790.0200
  • Australia: +61.2.4062.7950
  • India: 00080005045107

Palo Alto Networks compartió estos resultados con nuestros compañeros de Cyber Threat Alliance (CTA). Los miembros de CTA utilizan esta inteligencia para implementar rápidamente protecciones para sus clientes y desbaratar sistemáticamente a los ciberactores malintencionados. Obtenga más información sobre Cyber Threat Alliance.

Recursos adicionales

Enlarged Image