
Triaje de solo detección para GitLab CVE-2026-97229 (y CVE-2026-110264): evalúa una versión de GitLab autogestionado junto con su Ruby, y detecta las trampas del parche del 12 de octubre y del Ruby personalizado. Sin payloads, sin sondeos de red.
gitlab-onigmo-scannerTriaje de versiones para las dos fallas de regex de GitLab con CVSS 10.0, CVE-2026-97229 y CVE-2026-110264. Dale una versión de GitLab que poseas, te dice si esa compilación sigue abierta, y detecta las dos trampas que ya están atrapando a la gente. Nunca toca la red, nunca envía un payload, nunca accede a un endpoint de lint de CI, nunca compila una regex manipulada.
La fallaDetalle | Valor |
|---|---|
CVE | CVE-2026-97229, más CVE-2026-110264 calificada junto a ella |
Bug | Desbordamiento de entero (CWE-190) en Onigmo, el motor de regex integrado en Ruby, cuando GitLab compila una expresión regular proporcionada por el usuario |
Impacto | Ejecución remota de código no autenticada en un servidor GitLab autogestionado, bajo ciertas condiciones |
Severidad | 10.0 crítica para ambas, puntuada por GitLab como CNA |
Explotación | CVE-2026-97229 añadida a CISA KEV el 2026-10-29, fecha límite federal 2026-11-01. CVE-2026-110264 no tiene entrada en KEV a la fecha de este escrito, y GitLab no reporta indicios de que se haya usado en ataques |
CVE-2026-97229 es la falla de regex de CI/CD: una expresión regular especialmente manipulada en una configuración de CI/CD, validación de regex insuficiente, corregida el 2026-10-12. CVE-2026-110264 es una segunda falla de regex más amplia, corregida el 2026-10-21, que alcanza todas las versiones autogestionadas hasta la 7.0. Mismo motor, misma puntuación, bug diferente, y esa es exactamente la razón por la que una sola comprobación no basta.
Versiones corregidasCVE-2026-97229 (corregida el 2026-10-12)Línea | Corregida en |
|---|---|
GitLab 19.2 | 19.2.8 |
GitLab 19.3 | 19.3.5 |
GitLab 19.4 | 19.4.2 |
GitLab 19.5, anterior a 19.2 | No listada como afectada por esta CVE |
CVE-2026-110264 (corregida el 2026-10-21)Línea | Corregida en |
|---|---|
GitLab 19.5 | 19.5.1 |
GitLab 19.4 | 19.4.3 |
GitLab 19.3 | 19.3.6 |
GitLab 19.2 | 19.2.9 |
GitLab 19.1 | 19.1.9 |
GitLab 19.0 | 19.0.10 |
GitLab 18.11 | 18.11.13 |
GitLab 18.10 y anteriores | Sin versión corregida, actualizar a 18.11.13 o posterior |
Ruby, para instalaciones desde código fuente e imágenes personalizadasLínea | Corregida en |
|---|---|
Ruby 3.3 | 3.3.13 |
Ruby 3.4 | 3.4.12 |
Ruby 4.0 | 4.0.9 |
Ruby 3.2 y anteriores | Sin corrección, fin de vida, migrar a 3.4 o 4.0 |
Trampa 1: el parche del 12 de octubre no cubre el 21 de octubre19.4.2, 19.3.5 y 19.2.8 corrigieron CVE-2026-97229. Cada una de ellas está por debajo de la corrección de CVE-2026-110264 para su rama (19.4.3, 19.3.6, 19.2.9). Si parcheaste el 12 de octubre y te detuviste, sigues siendo vulnerable, y un escáner que solo conoce la primera CVE te declarará limpio. Esta herramienta evalúa ambas, y nombra la trampa en su salida cuando la detecta.
Trampa 2: actualizar GitLab no corrige tu propio RubyLa corrección de GitLab es un parche al Ruby que incluye en sus paquetes e imágenes oficiales. Una instalación desde código fuente, o una imagen personalizada que instala Ruby por separado, no recibe ese parche con una actualización de GitLab. Alpine Linux vivió esto en carne propia: actualizó a GitLab 19.3.6 el 2026-10-22 y siguió vulnerable, porque su imagen usaba Ruby estándar. Un atacante sondeó su servidor el 2026-10-20 y el 21, tumbó workers ocho veces, llegó a medias en el exploit en cuatro de ellas, y volvió el 25 y el 26. Alpine no encontró prueba de que el exploit tuviera éxito, no pudo descartarlo, reconstruyó la instancia desde cero, reemplazó sus claves secretas y restableció todas las contraseñas. Su imagen corregida, re-descargada después del 2026-10-27, lleva Ruby 3.3.13.
Así que: --install-type official evalúa solo la versión de GitLab, porque el Ruby va con ella. --install-type source o custom también evalúa el Ruby que proporciones con --ruby-version, y una versión de Ruby ausente se evalúa como UNKNOWN, no como limpia. Ruby 4.0.8 es un caso especial que conviene conocer: corrige el fallo CVE-2026-97229 pero no CVE-2026-110264, por lo que aquí se evalúa como VULNERABLE. Ruby no ha solicitado identificadores CVE propios para estas correcciones, por lo que un escáner que compara registros CVE con los paquetes instalados no encuentra ningún Ruby vulnerable en ningún sitio. Esta herramienta comprueba la versión de Ruby directamente.
Qué compruebaGitLab: CVE-2026-97229 y CVE-2026-110264 por separado, y luego un veredicto globalCSV de muchas instancias: name,gitlab_version,ruby_version,install_type,hostingRuby, cuando indicas que la instalación es source o customGitLab.com y Dedicated como ya parcheados, sin acción necesariaCada hallazgo recibe un veredicto: VULNERABLE, FIXED, EOL_NO_FIX, UNKNOWN, o NOT_AFFECTED para un único CVE en una rama que no le afecta. EOL_NO_FIX cuenta como vulnerable: no habrá parche para esa línea.
Lo que nunca haceNinguna solicitud de red. Ningún sondeo de servidores remotos. Ninguna regex elaborada, ninguna solicitud de lint de CI, ningún tráfico de explotación, ningún código PoC. Lee las cadenas de versión que proporcionas y se detiene. Eso es deliberado: los PoC públicos para CVE-2026-97229 ya existen, y reproducir uno aquí no aportaría nada defensivo.
Por qué esto, cuando ya existen PoCs y contadores de versionesEl material público para CVE-2026-97229 es mayoritariamente ofensivo: PoC que ejecutan código como el usuario git, y laboratorios que mapean qué compilaciones son armamentizables. Censys cuenta hosts expuestos por versión. GitLab publicó reglas Sigma para detectar intentos de explotación en los registros. Nada de eso es una herramienta de triaje defensivo independiente que evalúe juntos ambos fallos de octubre de CVSS 10.0 y compruebe el Ruby subyacente en una instalación source o custom. Ese hueco es este repositorio: un comando, ambos CVE, ambas trampas, sin payload. Úsalo junto con las reglas Sigma de GitLab, no en su lugar. Si una instancia fue sondeada, el triaje de versiones no es triaje de compromiso: revisa los registros de caídas de workers y los informes de caídas de Onigmo, y sigue el ejemplo de Alpine si no puedes descartar un intento.
EvaluaciónHallazgo | Severidad |
|---|---|
GitLab por debajo de la corrección de su rama para cualquiera de los CVE | VULNERABLE |
GitLab en 18.10 o anterior, o Ruby 3.2 o anterior en una instalación source/custom | EOL_NO_FIX, cuenta como vulnerable |
GitLab en o más allá de ambas correcciones, y un Ruby corregido cuando aplique | FIXED |
Instalación Source/custom sin versión de Ruby, o una rama más reciente que los datos de esta herramienta (2026-10-30) | UNKNOWN, no limpia |
GitLab.com / Dedicated | FIXED, parcheado por GitLab |
Uso# One instance, official package or image
python3 gitlab_onigmo_scanner.py --version 19.4.2
# One instance, source install with its own Ruby
python3 gitlab_onigmo_scanner.py --version 19.4.3 --ruby-version 3.4.11 --install-type source
# A whole estate, machine-readable output
python3 gitlab_onigmo_scanner.py --list inventory.csv --json
# Tests (version tables only, no network)
python3 -m unittest discover -s tests -v
inventory.csv formato, fila de encabezado opcional:
name,gitlab_version,ruby_version,install_type,hosting
prod,19.4.1,,official,self-managed
staging,19.4.3,,official,self-managed
legacy-source,19.4.3,3.4.11,source,self-managed