- Noma Labs descubrió GitLost, una vulnerabilidad de inyección indirecta de prompts en GitHub Agentic Workflows, que permitía exponer datos de repositorios privados de la misma organización en comentarios públicos usando solo issues de repositorios públicos
- Esta función compila workflows en Markdown a archivos YAML de Actions, y funciona con un agente de IA basado en Claude o GitHub Copilot que lee issues, invoca herramientas y accede a repositorios dentro de la organización
- El workflow vulnerable leía el Title y el Body del issue en el evento
issues.assignedy respondía conadd-comment, mientras tenía permisos de lectura sobre repositorios públicos y privados - Al atacante le bastaba con abrir un issue plausible en un repositorio público, sin código, permisos de acceso ni credenciales; en las pruebas, el contenido de
README.mddepocytestlocalse publicó en comentarios de issues públicos - Las barreras de seguridad de GitHub no bloquearon como se esperaba la variante con “Additionally”, y en IA agéntica la propia ventana de contexto debe considerarse superficie de ataque, separando el contenido controlado por usuarios de las instrucciones confiables
El límite de confianza al que apuntó GitLost
- Noma Labs descubrió una vulnerabilidad llamada GitLost en los nuevos Agentic Workflows de GitHub
- Si un atacante no autenticado publicaba un GitHub Issue manipulado en un repositorio público de la misma organización, podía inducir al agente a obtener datos de repositorios privados dentro de la organización
- El método de ataque corresponde a una inyección indirecta de prompts, que oculta instrucciones maliciosas dentro del contenido que lee el agente de IA
- Si las instrucciones ocultas por el atacante se procesan con prioridad sobre las instrucciones previstas por el operador, los datos privados pueden quedar expuestos en comentarios de issues públicos visibles para cualquiera
Cómo funcionan GitHub Agentic Workflows
- GitHub Agentic Workflows permite a los equipos escribir automatizaciones de repositorios en lenguaje natural
- Los workflows se escriben como archivos Markdown
.mdy se compilan a archivos GitHub Actions.ymlen formato YAML - Al ejecutarse, un agente de IA basado en Claude o GitHub Copilot trabaja dentro de los permisos configurados
- Leer GitHub Issues
- Invocar herramientas
- Acceder a otros repositorios dentro de la organización
Condiciones del workflow vulnerable
- La configuración vulnerable identificada por Noma Labs se vuelve problemática cuando se combinan issues públicos y permisos del agente
- El workflow se dispara con el evento
issues.assignedde GitHub - Lee el Title y el Body del issue
- Publica un comentario con la herramienta
add-comment - Tiene permisos de lectura sobre otros repositorios dentro de la organización
- Repositorios públicos
- Repositorios privados
- El workflow se dispara con el evento
- El atacante no necesitaba escribir código adicional ni contar con permisos de acceso o credenciales
- La única condición necesaria era abrir un issue en un repositorio público de una organización que usara GitHub Agentic Workflow
Flujo del ataque
- Los investigadores redactaron un GitHub Issue plausible que parecía solicitado por el VP Sales después de una reunión con un cliente
- Cuando se asignó el issue, se disparó la acción del workflow, y en las pruebas también funcionó de la misma forma con otra GitHub workflow action
- Después de que la automatización de GitHub asignó el issue, el workflow ejecutado por el evento hizo que el agente obtuviera contenido de repositorios
- El agente fue inducido a obtener el contenido de
README.mdde los siguientes repositorios- Repositorio público
poc - Repositorio privado
testlocal
- Repositorio público
- Luego, el agente de GitHub publicó ese contenido como comentario en un issue del repositorio público, dejándolo accesible para cualquiera
Evasión de las barreras de seguridad con “Additionally”
- GitHub tenía barreras de seguridad limitadas para impedir este escenario
- Noma Labs probó iterativamente varias variantes, como lo haría un atacante
- Al agregar la palabra clave “Additionally”, se produjo un comportamiento no deseado: el modelo no se negó y reestructuró la salida
- Con esta evasión, las barreras de seguridad de GitHub no funcionaron como se esperaba y no impidieron la filtración de datos
PoC y datos expuestos
- Noma Labs publicó los hallazgos, el workflow reproducible y evidencia real
- Los datos filtrados incluían el contenido de
README.mdde los siguientes repositoriossasinomalabs/poc: repositorio públicosasinomalabs/remote-ping: repositorio público, se confirmó que no tenía READMEsasinomalabs/testlocal: repositorio privado
Premisas de seguridad que cambian en la IA agéntica
- La ventana de contexto del agente es al mismo tiempo espacio de trabajo y superficie de ataque
- Todo el contenido que lee el agente puede convertirse en arma
- Issues
- Pull Requests
- Comentarios
- Archivos
- Los modelos de seguridad tradicionales suelen asumir que los límites de confianza se aplican mediante código
- En los sistemas agénticos, parte de los límites de confianza se aplica mediante el comportamiento del modelo
- Como los modelos, por naturaleza, siguen instrucciones, la inyección de prompts se convierte en una vulnerabilidad categórica para la IA agéntica, del mismo modo que la inyección SQL lo fue para las aplicaciones web
- Este tipo de vulnerabilidad requiere estrategias y defensas sistemáticas
Defensas recomendadas y proceso de divulgación
- El contenido controlado por usuarios no debe tratarse como entrada de instrucciones confiable para un agente de IA
- Los permisos del agente deben limitarse al mínimo necesario
- Los agentes que pueden acceder a múltiples repositorios se vuelven objetivos de ataque especialmente valiosos
- Debe limitarse lo que un agente puede publicar públicamente, como en los casos en que responde al contenido de un issue
- Antes de pasar entradas de usuario al modelo, deben sanearse o aislarse del contexto de instrucciones
- GitLost fue divulgado de forma responsable a GitHub, y los detalles de la vulnerabilidad se compartieron con conocimiento de GitHub
1 comentarios
Opiniones de Hacker News
La analogía de que la inyección de prompts ocupa en la IA agéntica el mismo lugar que la inyección SQL tuvo en las apps web me parece extraña. Creo que la inyección de prompts es mucho más fatal para los LLM que la inyección SQL
La inyección SQL surgía cuando la entrada del usuario pasaba a formar parte de una cadena de comandos enviada al motor SQL; si una entrada maliciosa cerraba el comando actual con tokens de sintaxis SQL y luego añadía sus propios comandos SQL, el motor ejecutaba ambos. La solución fue usar cadenas de comandos fijas, estáticas y precompiladas, como sentencias preparadas, y aplicar cualquier entrada arbitraria del usuario solo como datos
En un agente, una mitigación similar sería tener acciones fijas como “leer repo 1” y “leer repo 2”, y usar la entrada del usuario solo como datos para elegir qué acción ejecutar; pero esa tecnología ya la llamamos menú. La diferencia es que el valor de un LLM está, en esencia, en ser más que un menú, mientras que el valor de SQL no necesita ir más allá de “lógica predefinida aplicada a datos arbitrarios”
Permitir solo acciones limitadas a un agente cubre solo algunos problemas especiales, y tampoco separa el código de los datos del usuario, así que no es el mismo problema. Tener solo acciones limitadas se parece más a usar permisos de base de datos más estrictos. Si solo se permite el SQL que el usuario de todos modos podría ejecutar, la inyección SQL pierde casi toda relevancia
Hacer que se elija de un menú también es una opción, pero el rango de acciones posibles puede diseñarse de forma más amplia. Si le das una herramienta de email, puede enviar spam a clientes; si la bloqueas para que solo pueda responder, reduces el alcance del accidente. Igual que con vulnerabilidades donde se filtran datos mediante renderizado de imágenes, también hay que limitar la filtración de datos
La solución también es la misma. Aplicar control de acceso basado en roles con privilegio mínimo y exigir aprobación de un administrador para acciones importantes. Entonces lo peor que un LLM puede hacer por sí solo es emitir palabras inapropiadas
Una mitigación son las sentencias preparadas, pero otra es no permitir a ningún usuario acceso completo a toda la base de datos. Un usuario de solo lectura no debería poder hacer
DROP TABLE, independientemente de si hay inyección SQL o noEste agente tiene acceso de lectura ilimitado y no tiene concepto de “destinatario” de la respuesta. Si se incluyeran los permisos del destinatario, hacer que el acceso de lectura se deniegue automáticamente sería bastante simple. No es la única solución, pero no es difícil imaginar soluciones en esa dirección
El ejemplo del “menú” también implica que nada cambió. Ya sea un LLM o un empleado humano, lo permitido es solo un conjunto fijo y controlado de acciones. La libertad está sobre todo en la expresión; la autorización es un conjunto fijo. No veo por qué debería ser más que un menú
No entiendo por qué esto sería una vulnerabilidad de GitHub. Si los investigadores le dieron al agente permisos de acceso a repositorios privados y le pidieron responder preguntas en un repositorio público, obviamente es posible extraer información privada.
Es como crear una tarea común de CI con acceso a secretos y ejecutarla desde un PR público. Si configuras GitHub para que código público o instrucciones de un LLM se ejecuten en un contexto que puede acceder a cosas sensibles, habrá filtraciones. Eso no es culpa de GitHub, sino de quien lo configuró.
Aunque limites estrictamente el alcance del token, el acceso a repositorios públicos siempre queda permitido y, por ejemplo, permanece una ruta de filtración mediante issues de repositorios públicos. Para hacerlo de forma segura, habría que complementarlo con un proxy MITM que implemente controles más estrictos que los que ofrece GitHub.
GitHub Agentic workflows debería ser la solución oficial de primera línea para este tipo de problema, pero parece que todavía queda trabajo por hacer, tanto en el modelo de seguridad como en la usabilidad segura.
Más detalles: https://haulos.com/blog/do-not-give-your-agent-github-access...
Eso también es compatible con el desarrollo público, permite que externos abran issues públicos y refleja el nivel de confianza que quieres asignar a cada usuario. Si se piensa bien, seguramente hay más opciones.
Para eso hace falta soporte técnico para alcances y permisos finos, y dedicar tiempo a evaluar qué se quiere lograr con el agente y cuáles son los permisos y capacidades mínimos necesarios.
Lo primero probablemente llegue. El uso de agentes todavía es como el Lejano Oeste. Será interesante ver qué abstracciones reducen la fricción de descubrir y definir alcances y permisos al diseñar agentes, y qué interfaces logran equilibrar granularidad y usabilidad al limitar las capacidades de un agente.
Lo segundo siempre ha sido el obstáculo central para construir software de alta calidad. Tomarse el tiempo para pensar bien e implementar bien choca de frente con la idea de “moverse rápido y romper cosas” lanzando agentes a cualquier lado.
Si la respuesta a cualquiera de estas preguntas es “no”, entonces hay un problema. Los GitHub Workflows clásicos también tienen un montón de escaladas de privilegios mediante workflows activados por PR, pero ese es otro tema.
La verdadera solución es mejorar la UI de control de permisos por prompt. Así como eliges “búsqueda web sí/no”, debería ser fácil activar o desactivar una opción como “incluir mis repositorios privados”.
Es gracioso ver a los investigadores eludir las barreras de seguridad de las que GitHub presumía con una sola palabra como “Additionally”. Muestra que intentar establecer una frontera de seguridad fuerte dentro de la ventana de contexto de un LLM está condenado al fracaso.
El modelo está hecho, en esencia, para seguir instrucciones, así que si mezclas reglas del sistema con entradas del usuario, ganan las instrucciones más recientes o más insistentes.
¿Por qué en la sección de “divulgación responsable” no aparece cuándo se corrigió, ni si GitHub lo aceptó o lo rechazó? Dice que GitLost fue divulgado responsablemente a GitHub y que comparten los detalles con conocimiento de GitHub, ¿pero todavía no lo arreglaron?
https://github.github.com/gh-aw/reference/cross-repository/#...
Las grandes empresas como Microsoft, por presión de los inversionistas, ahora están metiendo AI en todos sus productos para afirmar que son compañías de AI. Algo similar a lo que hizo Adobe.
Los consumidores se están cansando de estas integraciones de AI a medio hacer, y parece que pronto se llegará a un punto de quiebre.
En serio: al hacer clic por todos lados, todo responde al instante, y CI con runners conectados funciona de maravilla. La documentación para configurar runners podría ser un poco más clara, pero fuera de eso todo fue increíblemente fluido.
Los ingresos realmente existen y son impresionantes, y están reemplazando ingresos basados en consumidores y asientos. El mercado todavía está reduciendo los múltiplos de SaaS, y creo que ese juicio es correcto. Si separas los ingresos en los reportes trimestrales, hay una gran historia de crecimiento derivada de eficiencia real.
No entiendo por qué una action que se ejecuta en el contexto de un repositorio público tenía permisos de acceso a repositorios privados. Al ver el workflow, parece que usa un
github token, que normalmente no concede permisos sobre repositorios privados.¿O será que el propio agente somehow tenía permisos más altos? Si es así, el agente estaba mal configurado. Ya sabemos que no se debe confiar en que un agente imponga restricciones.
Este artículo se lee como marketing de Noma. Tiene un nombre simpático, logo, título clickbait y hasta un tono dramático que parece dirigido a lectores no técnicos.
¿Cuál es la vulnerabilidad real? Que si le das datos privados a un LLM y permites que cualquiera interactúe con él, esos datos pueden filtrarse. Es demasiado obvio.
Este tipo de gente le dará a un LLM permisos de escritura sobre todo el disco y luego se quejará de que hizo operaciones destructivas.
Si no quieres que un agente de AI lea repositorios privados, no le des acceso a repositorios privados. Esto no es un problema de bypass de permisos, sino de prompt injection, y no se puede resolver de forma confiable en la capa del agente.
O bien es un problema ya resuelto, o GitHub todavía no lo ha resuelto y, mientras tanto, actores maliciosos intentarán explotar vulnerabilidades en repositorios.
Como hay muchos repositorios, existe una probabilidad distinta de cero de que ocurra alguna filtración. Pero, como pasa con las víctimas de estafas, casi nadie va a admitir que sufrió una filtración.