Un integer overflow en el motor de expresiones regulares de CI/CD alcanzó CVSS 10.0 y afectó todas las versiones 19.x hasta el 12 de octubre
GitLab lanzó el 12 de octubre de 2026 tres versiones de emergencia — 19.4.2, 19.3.5 y 19.2.8 — para corregir CVE-2026-97229, un integer overflow en el manejo de expresiones regulares de CI/CD que permite ejecución de código sin autenticación previa. La vulnerabilidad, reportada por el investigador joaxcar a través de HackerOne, recibió un CVSS score de 10.0 por parte de GitLab y afecta tanto a Community Edition como a Enterprise Edition en todas las versiones 19.2 anteriores a 19.2.8, 19.3 anteriores a 19.3.5 y 19.4 anteriores a 19.4.2. GitLab.com fue parcheado antes de la divulgación pública, y los clientes de GitLab Dedicated no requieren acción manual. Al momento de la divulgación, GitLab no reportó explotación en la naturaleza.
Cómo un comentario inline elude las validaciones de tamaño
La cadena de ataque comienza en las reglas de CI/CD que permiten expresiones regulares sobre rutas de repositorio mediante `rules:exists:regexp` y `rules:changes:regexp`. GitLab implementa varias validaciones de seguridad: verifica la longitud del patrón fuente, rechaza llamadas a subrutinas y escanea cuantificadores de repetición para evitar crecimiento estructural descontrolado. El scanner de repeticiones busca dígitos contiguos en patrones como `{5,100}`, pero no reconoce comentarios inline de Onigmo — el motor de expresiones regulares subyacente.
Investigadores de Rapid7 desarrollaron un proof-of-concept end-to-end que explota esta brecha: un cuantificador escrito como `{5(?#)7805}` pasa las validaciones de GitLab como si fuera `{5}`, pero Onigmo ignora el comentario `(?#)` y lee el límite real de 57.805 repeticiones. El patrón malicioso incluye seis clases POSIX `[[:word:]]` que, al compilarse para UTF-8 contra rutas de repositorio con caracteres multibyte válidos, expanden cada clase en tablas de rangos Unicode extensas. GitLab valida el tamaño del programa compilado solo antes de esta recompilación para UTF-8, dejando el bytecode final sin verificar.
De bytecode Onigmo a ejecución nativa como usuario git
Ruby recompila la expresión regular cuando la codificación del patrón no coincide con la del sujeto de búsqueda. Esta recompilación ocurre fuera del timeout de 50 milisegundos que GitLab aplica al matching, permitiendo que el programa de bytecode (pcode en terminología de Onigmo) crezca sin límite temporal. El PoC de Rapid7 cruza desde esta entrada controlada por el atacante en el repositorio hacia el pcode de Onigmo y finalmente a ejecución de código nativo, ejecutando comandos arbitrarios como la cuenta de sistema operativo `git` de GitLab. El exploit fue probado exitosamente en la imagen oficial `gitlab/gitlab-ce:19.4.1-ce.0` para Linux amd64 con ASLR habilitado.
La vulnerabilidad afecta a todos los tipos de despliegue de GitLab salvo indicación contraria en el advisory. Esto incluye instalaciones on-premise en América Latina, donde GitLab CE es una opción frecuente en equipos de desarrollo de Argentina, Brasil y México que priorizan soluciones autoalojadas por requisitos de soberanía de datos o costos de licenciamiento. La combinación de CVSS 10.0 con un PoC funcional público eleva el riesgo de explotación oportunista en instancias expuestas a internet que no hayan aplicado los parches del 12 de octubre.
El patrón de validación que falla antes de la compilación final
GitLab implementa un modelo de defensa en capas: verifica longitud de fuente, rechaza construcciones peligrosas como llamadas a subrutinas, escanea cuantificadores y valida el tamaño del programa compilado dos veces — primero sobre una versión sin alternancia y luego sobre el patrón final. Sin embargo, ninguna de estas validaciones cubre la recompilación que Ruby ejecuta cuando la codificación del sujeto difiere de la del patrón. Esta brecha arquitectónica es característica de integraciones entre lenguajes de alto nivel y motores nativos: las validaciones de seguridad se aplican en el boundary del lenguaje host, pero el motor nativo toma decisiones de compilación adicionales que quedan fuera del alcance de esas validaciones.
El reporte original de joaxcar permanece privado en HackerOne, lo que impide confirmar si el investigador documentó una ruta de ataque completamente no autenticada o si el PoC de Rapid7 — que requiere pushear configuración CI maliciosa y rutas con nombres especiales a un proyecto público antes de la petición final de lint no autenticada — representa la única cadena viable. GitLab calificó la vulnerabilidad como PR:N (sin requisitos de privilegios), lo que sugiere que existe al menos una ruta que no requiere cuenta válida, aunque el análisis técnico público de Rapid7 no la documenta completamente.
Nuestro análisis
CVE-2026-97229 expone un patrón recurrente en la integración de motores nativos de procesamiento de texto: las validaciones de seguridad implementadas en el lenguaje host no cubren transformaciones que el motor nativo ejecuta de forma autónoma. GitLab validó tamaño de bytecode compilado, pero Ruby recompila el patrón para UTF-8 fuera de esa validación y fuera del timeout de matching. Este tipo de brecha — donde el boundary de seguridad se coloca antes de la última transformación crítica — ya se documentó en otros contextos de parsing y compilación JIT, pero sigue siendo difícil de detectar en auditorías de código porque la recompilación ocurre en capas de abstracción que el código de aplicación no controla directamente.
La asignación de CVSS 10.0 y la existencia de un PoC funcional público convierten esta vulnerabilidad en un objetivo prioritario para escaneo automatizado. La ausencia de explotación reportada en la naturaleza al 12 de octubre no garantiza que no ocurra en las próximas semanas, especialmente en instancias GitLab CE autoalojadas en América Latina que operan con equipos de seguridad reducidos o sin procesos formales de gestión de parches. La pregunta que queda abierta es si el ecosistema de GitLab autoalojado en la región tiene visibilidad suficiente sobre sus instancias expuestas como para aplicar estos parches antes de que aparezcan los primeros escaneos masivos.