Ataque a la cadena de suministro en GitHub: anatomía y controles
Los incidentes de cadena de suministro en GitHub más dañinos de 2026 comparten un rasgo incómodo: ninguno necesitó un exploit ingenioso. Necesitaron una identidad: una credencial con demasiado poder, que vivía demasiado tiempo, en el lugar equivocado. El compromiso de LiteLLM de octubre de 2026, según se informó públicamente, es el ejemplo reciente más claro. Merece la pena recorrerlo no porque el atacante fuera sofisticado, sino precisamente porque no lo era: cada paso fue una capacidad normal de GitHub, alcanzada con una credencial robada, y cada paso tenía un control corriente que lo habría detenido.
Es un recorrido defensivo. Aquí no hay nada que ayude a un atacante, solo la lección que cada salto enseña a un defensor. Para las versiones prácticas, cada etapa enlaza una herramienta de PlayCISO en el navegador con la que puedes revisar tu propia configuración.
La cadena, paso a paso
1. Una clave maestra estaba en un repositorio público y nunca se rotó
El punto de entrada, según se informó, fue una clave maestra de larga duración subida a un repositorio público y olvidada allí. Los secretos acaban en los repositorios constantemente; el fallo aquí fue que nada la detectó y nada la hizo caducar. El escaneo de secretos con protección de push bloquea el commit antes de que llegue, y un calendario de rotación hace que una credencial filtrada caduque antes de ser útil. Si solo arreglas una cosa de esta lista, que sea esta. La GitHub CI Secret Hardening Checklist y el Key Rotation Planner cubren los controles de protección de push y de rotación.
2. La clave abría un token OAuth de gh CLI de un propietario de la organización
La clave filtrada dio al atacante acceso a un token OAuth de gh CLI de un propietario de la organización. Este es el salto que importó. Un token de gh CLI lleva permisos amplios y, a diferencia de una acción sensible en la interfaz web, no está sujeto a 2FA ni a la verificación interactiva del modo sudo. Uno robado actúa en silencio con toda la autoridad del propietario. La lección es el mínimo privilegio: un PAT de grano fino o una GitHub App, limitados a repositorios y permisos concretos, en lugar de un token amplio y de larga duración en una cuenta de propietario. Mira el radio de impacto exacto de cada tipo de token en el GitHub Token Scope Analyzer.
3. Flujos de CI desechables exfiltraron los secretos de los mantenedores
Con acceso de escritura, el atacante subió flujos de trabajo de GitHub Actions desechables cuya única tarea era leer los secretos del repositorio y enviarlos fuera. Un flujo de trabajo que puede leer un secreto puede exfiltrarlo. Los controles que rompen este paso son un GITHUB_TOKEN de mínimo privilegio (por defecto contents: read y escritura concedida por job), la publicación de confianza con OIDC para que no exista un secreto permanente de nube o de registro que robar, las reglas de protección de entornos con revisores obligatorios y las acciones fijadas (un SHA de commit completo, no una etiqueta mutable). La CI Secret Hardening Checklist puntúa los cuatro, y el GitHub Actions Security Auditor los señala directamente a partir del YAML de un flujo de trabajo que pegues.
4. Se publicó una release desde el código de un fork
Después, el atacante sacó una release compilada desde el código de un fork en lugar de la rama principal de confianza. Las ramas protegidas y los rulesets (revisiones obligatorias, sin bypass de administrador, force-push bloqueado) impiden que el código no confiable llegue a una release, y los controles de integridad de las releases (publicación de confianza con OIDC, atestación de artefactos, procedencia SLSA y un entorno de release protegido con una aprobación humana con llave de hardware) impiden que una compilación manipulada se publique como auténtica. Puntúalos con la Branch Protection Checklist y la Release Integrity Checklist.
5. Se borraron los registros de ejecución y se sobrescribió el historial con force-push
Por último, el atacante borró los registros de ejecución de los flujos de trabajo e hizo force-push para borrar sus huellas. No siempre puedes impedir que alguien con nivel de propietario haga esto, pero sí puedes detectarlo. El borrado de ejecuciones de flujos de trabajo, los force-push a ramas protegidas, las anulaciones de la protección de ramas, los secretos nuevos, la creación de tokens y aplicaciones y la desactivación de SSO o 2FA son eventos de alta señal en el registro de auditoría de GitHub. Alertar sobre ellos convierte una toma de control silenciosa en una alerta. El catálogo GitHub Audit Log Monitoring enumera los eventos exactos y una lógica de detección que puedes copiar.
La conclusión: identidad y configuración, no un parche
No hay ningún CVE en el centro de esta historia. Cada solución es un control: escanea y rota los secretos, mantén las credenciales con mínimo privilegio y de corta duración, protege las ramas, publica mediante OIDC con una aprobación humana y alerta sobre el registro de auditoría. Ninguno es exótico; todos son configuración. Esa es la buena noticia: puedes cerrar todas estas brechas esta semana sin esperar a ningún proveedor.
Si te estás replanteando la plataforma entera, ten en cuenta que los controles importan mucho más que el proveedor: GitHub, GitLab y Bitbucket ofrecen ramas protegidas, SSO, registro de auditoría y credenciales de corta duración. La comparación honesta trata del modelo de alojamiento y del encaje, y la tienes, con filtros, en GitHub frente a sus alternativas. Uses la que uses, revisa quién tiene acceso de propietario y de administrador con la GitHub Org Access Review.
Recorre la cadena tú mismo
La cronología completa e interactiva, con cada paso y el control que lo rompe, está en GitHub Supply-Chain Attack Anatomy. Para la información más detallada sobre el incidente en sí, consulta nuestro análisis del compromiso de la cadena de suministro de LiteLLM 1.107.0.
Preguntas frecuentes
¿Qué hizo posible el compromiso de GitHub de LiteLLM? Según se informó públicamente, una clave maestra de larga duración se subió a un repositorio público y nunca se rotó. Esa clave llevó a un token OAuth de gh CLI de un propietario de la organización, que no está sujeto a la verificación interactiva de 2FA o del modo sudo que impone la interfaz web. Con él, el atacante exfiltró secretos de CI, publicó una release compilada desde el código de un fork, borró los registros de ejecución de los flujos de trabajo e hizo force-push para ocultar el cambio. Cada acción fue una capacidad normal de GitHub alcanzada con una identidad robada, no una vulnerabilidad de software.
¿Lo habría detenido la autenticación en dos factores? No. La 2FA y la verificación del modo sudo de GitHub protegen la sesión iniciada en el navegador; un token autentica directamente las llamadas a la API y nunca activa ese aviso. Cuando un atacante tiene un token válido, el segundo factor ya ha quedado atrás. En las credenciales de automatización, la higiene de los tokens y el mínimo privilegio importan más que la 2FA.
¿Qué control habría tenido por sí solo el mayor impacto? No tener en absoluto una credencial de larga duración con permisos de propietario de la organización en una máquina de desarrollo. El escaneo de secretos con protección de push impide que la clave llegue al repositorio; la rotación reduce la ventana si se filtra; un PAT de grano fino o una GitHub App en lugar de un token OAuth amplio de gh CLI contiene el radio de impacto incluso cuando se roba una credencial. Después, las ramas protegidas, la publicación de confianza con OIDC con una aprobación humana y las alertas sobre el registro de auditoría rompen cada una un eslabón posterior.
¿Son seguras las herramientas de este artículo? ¿Atacan algo? Son seguras. Las nueve son explicaciones y listas de comprobación estáticas en el navegador. No hacen llamadas de red, no piden credenciales reales y no realizan ningún ataque. Solo existen para ayudarte a revisar y reforzar tu propia postura en GitHub.
Contenido educativo. PlayCISO no está afiliado a LiteLLM ni a GitHub, y aquí no se atribuye nada más allá de lo que se ha informado públicamente.
Preguntas frecuentes
¿Qué hizo posible el compromiso de GitHub de LiteLLM?
Según se informó públicamente, una clave maestra de larga duración se subió a un repositorio público y nunca se rotó. Esa clave llevó a un token OAuth de gh CLI de un propietario de la organización, que no está sujeto a la verificación interactiva de 2FA o del modo sudo que impone la interfaz web. Con él, el atacante exfiltró secretos de CI, publicó una release compilada desde el código de un fork, borró los registros de ejecución de los flujos de trabajo e hizo force-push para ocultar el cambio. Cada acción fue una capacidad normal de GitHub alcanzada con una identidad robada, no una vulnerabilidad de software.
¿Lo habría detenido la autenticación en dos factores?
No. La 2FA y la verificación del modo sudo de GitHub protegen la sesión iniciada en el navegador; un token (PAT, OAuth, token de instalación, GITHUB_TOKEN o gh CLI) autentica directamente las llamadas a la API y nunca activa ese aviso. Cuando un atacante tiene un token válido, el segundo factor ya ha quedado atrás. En las credenciales de automatización, la higiene de los tokens y el mínimo privilegio importan más que la 2FA.
¿Qué control habría tenido por sí solo el mayor impacto?
No tener en absoluto una credencial de larga duración con permisos de propietario de la organización en una máquina de desarrollo. El escaneo de secretos con protección de push impide que la clave llegue al repositorio; la rotación reduce la ventana si se filtra; un PAT de grano fino o una GitHub App en lugar de un token OAuth amplio de gh CLI contiene el radio de impacto incluso cuando se roba una credencial. Después, las ramas protegidas, la publicación de confianza con OIDC con una aprobación humana y las alertas sobre el registro de auditoría rompen cada una un eslabón posterior.
¿Son seguras las herramientas de este artículo? ¿Atacan algo?
Sí, son seguras. Las nueve son explicaciones y listas de comprobación estáticas en el navegador. No hacen llamadas de red, no piden credenciales reales y no realizan ningún ataque. Solo existen para ayudarte a revisar y reforzar tu propia postura en GitHub.