CVE-2026-97229, el fallo con CVSS 10 en el compilador de expresiones regulares de CI/CD que GitLab corrigió el 12 de octubre, entró el 29 de octubre al catálogo de vulnerabilidades explotadas conocidas (KEV) de CISA, con fecha límite federal el 1 de noviembre, dos semanas después de que Rapid7 publicara una prueba de concepto funcional. Shadowserver todavía contaba más de 1.000 servidores vulnerables en internet durante el fin de semana, y el arreglo tiene una trampa que le costó cara a Alpine Linux: es un parche al Ruby que GitLab incluye en sus paquetes, así que un GitLab que corre sobre su propio Ruby sigue siendo explotable después de actualizar.
En mi resumen del día de seguridad del 21 de octubre este fallo ocupó una línea, y su sucesor CVE-2026-110264, una tarjeta. Desde entonces sumó un exploit público, un ataque documentado contra el GitLab de Alpine Linux y una fecha límite federal de tres días. Abajo: qué cambió, qué implica y el trabajo de esta semana: chequeos de solo lectura, actualización por tipo de instalación y qué hacer si hoy no podés parchear. Las versiones y los comandos salen de los avisos y la documentación de GitLab, del anuncio de Ruby, del feed KEV de CISA y de mi propia lectura de los tags de release de omnibus-gitlab del 3 de noviembre.
1. Contexto: De Nota de Parche a Entrada del KEV en 17 Días
El aviso de GitLab del 12 de octubre describe el fallo en una oración: un usuario no autenticado podía ejecutar código arbitrario en el servidor ‘via a specially crafted regular expression in a CI/CD configuration, due to insufficient regular expression validation.’ Afecta a CE y EE 19.2 antes de 19.2.8, 19.3 antes de 19.3.5 y 19.4 antes de 19.4.2, tiene CVSS 3.1 10.0 y lo reportó joaxcar a través de HackerOne. Además es un bypass: las notas de detección de GitLab dicen que el arreglo del 23 de septiembre para CVE-2026-93577 quedó incompleto. Por debajo, los dos son el mismo desbordamiento de enteros en Onigmo, el motor de regex integrado en Ruby, que Ruby corrigió upstream el 23 de octubre en 3.3.13, 3.4.12 y 4.0.9.
Desde entonces cambió el panorama de amenazas. El 13 de octubre Rapid7 publicó una prueba de concepto que ejecuta comandos como el usuario git sobre la imagen oficial de la 19.4.1 CE. El 20 y el 21 de octubre, una cuenta recién registrada mandó configuraciones de CI manipuladas al GitLab de Alpine Linux y tiró abajo sus workers ocho veces; Alpine no encontró pruebas de que el código se ejecutara, pero reconstruyó el servidor. El 29 de octubre CISA sumó el CVE a su catálogo KEV con fecha límite el 1 de noviembre para las agencias federales de EE. UU., la ventana de tres días que la BOD 26-04 le da a un fallo automatizable, que da control total y está en un activo expuesto a internet.
Cronología (fechas tal como las publica cada fuente)
Cómo lo califica cada fuente
| Fuente | Calificación | Cómo leerla |
|---|---|---|
| GitLab (CNA, registro del CVE) | CVSS 3.1 10.0, Critical | PR:N, UI:N: sin privilegios ni interacción del usuario |
| Rapid7 | RCE reproducido, PoC pública | Su camino necesita permiso de escritura en un proyecto público, algo que ‘conflicts with GitLab’s PR:N rating’ |
| CISA KEV | Agregado el 29 oct, límite el 1 nov | CWE-190, triaje forense obligatorio, uso en ransomware ‘Unknown’ |
| CISA SSVC | Activa, automatizable, impacto total | La combinación que dispara una fecha límite de tres días en activos expuestos a internet |
| Equipo de Ruby | Sin CVE propio | Seguí el arreglo con los cuatro CVE de GitLab |
| Debian | ruby3.3, ruby3.1 vulnerables | Sin paquete corregido cuando revisé el 3 de noviembre |
El arreglo es un parche a Ruby, no código de GitLab
El aviso de GitLab del 21 de octubre lo dice con todas las letras sobre CVE-2026-110264: ‘The fix … is a patch to Ruby, not to GitLab code, and it is only included in official GitLab Linux packages and container images.’ CVE-2026-97229 funciona igual: las notas del 12 de octubre listan ‘Add Ruby regexp program size patch for 3.3 and 3.4’, y la guía self-compiled de GitLab ahora dice que actualizar solo GitLab no aplica el arreglo.
Dónde estamos (revisado el 3 de noviembre de 2026)
Versiones corregidas
Los avisos de GitLab, los registros de los CVE y los tags de release de omnibus-gitlab coinciden en 19.4.2, 19.3.5 y 19.2.8, y en las versiones del 21 de octubre para CVE-2026-110264. El parche más nuevo de cada línea es del 29 de octubre.
Inclusión en el KEV
Según el feed JSON del KEV de CISA: agregado el 29 de octubre, límite el 1 de noviembre, triaje forense ‘Yes’, y una nota que dice que ‘other products can potentially be affected by the same underlying Ruby/Onigmo Integer Overflow issue’.
Explotación real
CISA no publica su evidencia. El relato público es el de Alpine: ocho caídas de workers, cuatro en las que el atacante ‘got partway through the exploit and failed at the next step’, y ninguna prueba de éxito. No encontré ningún compromiso confirmado, lo que es ausencia de evidencia, no evidencia de ausencia.
Exposición
BleepingComputer, citando a Shadowserver el 1 de noviembre: más de 1.000 instancias vulnerables a CVE-2026-97229 y más de 11.300 a CVE-2026-110264, sobre unas 39.000 instancias de GitLab vistas por día.
Pendiente
Rapid7 no sabe cómo el reporte privado evita el paso de escritura; los issues de GitLab se hacen públicos 90 días después de cada arreglo. CVE-2026-110264 no está en el KEV, y el Ruby de Debian todavía no tiene arreglo.
Regla de oro
Juzgá un servidor GitLab por quién compiló su Ruby. En paquetes, imágenes y charts oficiales, la versión de GitLab es el arreglo; en todo lo que trae su propio Ruby, el arreglo es la versión de GitLab más Ruby 3.3.13, 3.4.12 o 4.0.9, o una posterior de la misma serie.
2. Cinco Implicaciones para Equipos que Administran GitLab
El análisis técnico de Rapid7 y las reglas de detección que publicó GitLab son los dos mejores mapas de cómo se llega al fallo y de qué rastro deja un intento. Leídos junto con el informe de Alpine, cambian cómo lo priorizaría.
La fecha límite del KEV ya pasó
CISA KEV · BOD 26-04
La fecha límite federal fue el domingo 1 de noviembre, tres días después de la inclusión. Para todos los demás, leelo como ‘hoy’: un GitLab expuesto a internet en 19.2 a 19.4 por debajo de las versiones corregidas enfrenta un exploit público, y puede que lo vengan sondeando desde mediados de octubre.
‘Sin autenticación’ en la práctica es ‘cualquiera que pueda registrarse’
Rapid7 · Alpine · detecciones de GitLab
GitLab lo califica PR:N, pero el camino que le funcionó a Rapid7 necesita un archivo de CI commiteado en un proyecto público donde el atacante pueda escribir; solo la petición final de CI lint va sin credenciales. El atacante de Alpine usó una cuenta recién registrada. Con registro abierto y proyectos públicos, asumí que esa condición previa se cumple.
El arreglo vive en Ruby, así que la versión de GitLab puede engañar
Aviso de GitLab · Ruby · Alpine
Los paquetes, imágenes y charts oficiales traen un Ruby que GitLab parcheó por su cuenta; las instalaciones self-compiled y las imágenes de la comunidad traen el suyo, y actualizar GitLab no lo toca. Alpine cometió los dos errores: instaló 19.3.4 en lugar de 19.3.5, después pasó a 19.3.6 sobre su propio Ruby y el 26 de octubre descubrió que el servidor seguía vulnerable.
El 12 de octubre no alcanza, y 110264 es la exposición más amplia
GitLab · Shadowserver
CVE-2026-110264, corregido el 21 de octubre, es un segundo fallo de Onigmo con CVSS 10, al que se llega renderizando archivos Org-mode, y afecta a todas las versiones desde la 7.0. No está en el KEV, pero Shadowserver cuenta unas once veces más servidores vulnerables a él. Un servidor parcheado el 12 de octubre sigue expuesto.
Los exploits dependen del build, y los atacantes bajan el tuyo
Rapid7 · Alpine
Rapid7 validó su cadena en una sola imagen, la 19.4.1 CE oficial para amd64, y dice que otros builds necesitan ajustar los offsets. Eso no consuela a los builds propios: Alpine cuenta que su atacante ‘downloaded our GitLab container image, which suggests they were tuning the exploit to our exact build.’ Los intentos fallidos igual tiran abajo workers de Puma o Sidekiq, tu mejor señal temprana.
Qué versión corrige qué, por línea de GitLab
| Línea | CVE-2026-97229 (12 oct) | CVE-2026-110264 (21 oct) | Último parche (29 oct) | Ruby incluido, según ruby -v |
|---|---|---|---|---|
| 19.5 | No afectada | 19.5.1 | 19.5.3 | 3.3.12, parcheado por GitLab |
| 19.4 | 19.4.2 | 19.4.3 | 19.4.5 | 3.3.12, parcheado por GitLab |
| 19.3 | 19.3.5 (no 19.3.4) | 19.3.6 | 19.3.7 | 3.3.12, parcheado por GitLab |
| 19.2 | 19.2.8 | 19.2.9 | 19.2.10 | 3.3.11, parcheado por GitLab |
| 19.1 · 19.0 | No afectadas | 19.1.9 · 19.0.10 | 19.1.10 · 19.0.11 | 3.3.11, parcheado por GitLab |
| 18.11 | No afectada | 18.11.13 | 18.11.14 | 3.3.10, parcheado por GitLab |
| 18.10 y anteriores | No afectadas | Sin backport | Ruta de actualización a 18.11.14 o posterior | Sin parche |
Dónde vive el arreglo, según el tipo de instalación
| Tipo de instalación | De dónde sale su Ruby | Qué corrige CVE-2026-97229 |
|---|---|---|
| Paquete Linux (deb/rpm) | Incluido en /opt/gitlab/embedded, parcheado por GitLab | Actualizar GitLab a una versión corregida |
| Imagen oficial de Docker (gitlab/gitlab-ce, gitlab/gitlab-ee) | El paquete Linux dentro de la imagen | Bajar un tag corregido y recrear el contenedor |
| Chart de Helm (imágenes cloud-native) | Imágenes CNG, parcheadas por GitLab | Actualizar a una versión del chart asociada a una versión corregida |
| Self-compiled (desde el código fuente) | El Ruby del sistema que instalaste | Actualizar GitLab y Ruby a 3.3.13, 3.4.12 o 4.0.9 o posterior |
| Imágenes de la comunidad o propias, alpinelinux/gitlab incluida | Lo que instale el Dockerfile | Actualizar GitLab y reconstruir sobre un Ruby corregido |
| GitLab.com · GitLab Dedicated | Administrado por GitLab | Nada que hacer: ya están parcheados |
Algunos medios listan 19.3.4 como corregida; el aviso de GitLab y el registro del CVE dicen 19.3.5. Más allá de GitLab, Ruby dice que cualquier app que compile regexps a partir de strings que controla un atacante (Regexp.new, Regexp.union, Regexp.compile, /#{input}/) queda expuesta y que Regexp.timeout no protege; las apps que solo usan sus propias regexps no están afectadas.
3. Qué Hacer Esta Semana
El mismo orden que con cualquier fallo de servidor que está en el KEV: averiguá qué corrés, guardá la evidencia, parcheá como pide tu tipo de instalación y cerrá las puertas que usa el exploit mientras tanto. Todo lo del paso 1 solo lee.
Paso 1: Averiguá qué corrés y de quién es su Ruby
Versión de GitLab según el tipo de instalación
La tarea de rake, el endpoint de la API y el mapeo del chart salen de la documentación de GitLab; la página Help > Help de la app también muestra la versión a los usuarios con sesión iniciada. En un paquete Linux la versión responde la pregunta, porque el Ruby parcheado viene adentro. Poné el nombre de tu contenedor.
# Paquete Linux: mirá 'GitLab information > Version' sudo gitlab-rake gitlab:env:info # Imagen oficial de Docker: la misma tarea dentro del contenedor docker exec gitlab gitlab-rake gitlab:env:info # Cualquier tipo de instalación, desde tu computadora (necesita un token) curl --request GET \ --header "PRIVATE-TOKEN: <your_access_token>" \ --url "https://gitlab.example.com/api/v4/version" # Chart de Helm: las versiones del chart no son las de GitLab, # traducilas con la página de version mappings del chart helm list -n <namespace> # Self-compiled: desde /home/git/gitlab, como el usuario git bundle exec rake gitlab:env:info RAILS_ENV=production # corregidas para CVE-2026-97229: 19.4.2, 19.3.5, 19.2.8 # corregidas para los dos CVE de regex: 19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10, 18.11.13
¿De quién es el Ruby? Contenedores, imágenes propias e instalaciones desde el código
/opt/gitlab/embedded/bin/ruby figura en la lista de archivos del paquete Linux, y version-manifest.txt es donde la documentación de GitLab dice que quedan registradas las versiones incluidas. En un paquete de GitLab, esperá ver 3.3.10 a 3.3.12 aunque esté corregido. En cualquier otro lado, el número de Ruby es la prueba.
# Paquete Linux o imagen oficial: Ruby incluido, parcheado por GitLab
/opt/gitlab/embedded/bin/ruby -v # 3.3.12 en 19.3 a 19.5, aun corregido
grep -iw ruby /opt/gitlab/version-manifest.txt
# Cada contenedor de GitLab en marcha: ¿imagen del paquete Linux o Ruby propio?
for c in $(docker ps --format '{{.Names}} {{.Image}}' | awk 'tolower($2) ~ /gitlab/ {print $1}'); do
if docker exec "$c" test -x /opt/gitlab/embedded/bin/ruby; then
echo "$c: Linux-package image, judge it by the GitLab version"
else
echo "$c: own Ruby: $(docker exec "$c" ruby -v 2>/dev/null || echo 'ruby not on PATH')"
fi
done
# Self-compiled o imagen propia: este número tiene que llegar al arreglo de su serie
ruby -v # corregidas: 3.3.13, 3.4.12, 4.0.9 · NO corregidas: 3.4.10, 3.4.11 · 3.2: sin arreglo
apk info -v 2>/dev/null | grep '^ruby-[0-9]' # Alpine: 3.3.13-r0 (3.21), 3.4.12-r0 (3.22+)
dpkg -l 'ruby3*' | awk '/^ii/ {print $2, $3}' # Debian: ruby3.3 y ruby3.1 sin arreglo al 3 novNo juzgues un paquete de GitLab por ruby -v
Leí los tags de release de omnibus-gitlab: la 19.4.2 y la 19.3.5 parchean Ruby 3.3.12 con regexp-program-size, la 19.4.3 suma regexp-repeat-id-overflow, y el string de versión nunca cambia. Una 19.4.5 con todos los parches sigue trayendo Ruby 3.3.12, por debajo de la 3.3.13 que Ruby da por corregida, así que un escáner que la marca está leyendo el número, no el parche. La trampa inversa es peor: una imagen propia con GitLab 19.3.6 muestra un GitLab corregido sobre un Ruby vulnerable, justo lo que corría Alpine.
Paso 2: Parcheá según el tipo de instalación
Primero guardá los logs (el recuadro amarillo de abajo explica por qué) y después actualizá. Las versiones del 12, 21 y 29 de octubre incluyen migraciones de base de datos, así que las instancias de un solo nodo quedan caídas mientras corren; las multinodo pueden usar el procedimiento de zero-downtime de GitLab. De la 18.11 a la 19.5 no necesitás cambiar de versión menor: el último parche de tu línea corrige los dos CVE de regex.
Paquete Linux (deb/rpm)
docs.gitlab.com/update/package · versiones del 29 oct
Instalá el último parche de tu línea, fijando la versión exacta como muestra la documentación de GitLab. El paquete hace primero un backup de la base de datos, salvo que exista /etc/gitlab/skip-auto-backup; igual mantené tu propio backup, con /etc/gitlab/gitlab-secrets.json incluido. La versión del 29 de octubre también pide GitLab Runner 19.5.1 (cambio de CA de eMudhra).
# Debian/Ubuntu (CE: gitlab-ce=<version>-ce.0) sudo apt update && sudo apt install gitlab-ee=19.4.5-ee.0 # RHEL, AlmaLinux, Oracle Linux 9 (.el8 en la 8) sudo dnf install gitlab-ee-19.4.5-ee.0.el9 sudo gitlab-rake gitlab:env:info # Version: 19.4.5-ee
Imagen oficial de Docker
docs.gitlab.com/update/docker · recreá, no reinicies
Hacé backup de la base de datos y del archivo de secretos, bajá el tag corregido y recreá el contenedor; GitLab se reconfigura y migra en el primer arranque. Los tags 19.5.3, 19.4.5, 19.3.7 y 19.2.10 (CE y EE) llegaron a Docker Hub el 29 de octubre. Fijá un tag exacto, no latest.
# Docker Engine: mantené tu hostname, puertos y volúmenes sudo docker stop gitlab sudo docker rm gitlab sudo docker pull gitlab/gitlab-ee:19.4.5-ee.0 # ...y después el mismo docker run de antes, con el tag nuevo # Docker Compose: poné image: gitlab/gitlab-ee:19.4.5-ee.0, y después docker compose pull docker compose up -d
Chart de Helm (imágenes cloud-native)
docs.gitlab.com/charts · version mappings
Las imágenes CNG también traen los parches de Ruby de GitLab, así que actualizar el chart es el arreglo. Las versiones del chart no son las de GitLab: 19.5.3 es 10.5.3 o 10.5.4, 19.4.5 es 10.4.5 o 10.4.6, 19.3.7 es 10.3.8 o 10.3.9, 19.2.10 es 10.2.10. Exportá tus values, no uses --reuse-values y, para hacerlo sin caída, seguí la secuencia documentada de pausa y reanudación.
helm repo update helm search repo -l gitlab/gitlab | head helm get values gitlab > gitlab.yaml helm upgrade gitlab gitlab/gitlab \ --version 10.4.6 \ -f gitlab.yaml \ --set gitlab.migrations.enabled=true
Instalaciones self-compiled
Guía de instalación self-compiled · Ruby, 23 oct
Dos actualizaciones, no una: GitLab por la ruta documentada, y el Ruby del sistema a 3.3.13, 3.4.12 o 4.0.9 o una posterior de la misma serie, algo que la guía de GitLab ahora exige (compilado desde el código fuente oficial, no con RVM, rbenv o chruby). Después reiniciá todos los procesos de Puma y Sidekiq, porque un worker en marcha conserva el Ruby con el que arrancó.
ruby -v # antes: ruby 3.3.12 en una instalación desde el código es vulnerable # compilá e instalá Ruby 3.3.13 / 3.4.12 / 4.0.9 desde ruby-lang.org, y después ruby -v # 3.3.13 o posterior en tu serie bundle exec rake gitlab:env:info RAILS_ENV=production # mirá 'Ruby Version'
Imágenes de la comunidad y propias, la de Alpine incluida
alpinelinux.org · Docker Hub
Reconstruí sobre un Ruby corregido, no solo sobre un GitLab más nuevo. En bases Alpine, apk upgrade trae ruby 3.3.13-r0 (3.21) o 3.4.12-r0 (3.22 en adelante); las imágenes oficiales de ruby existen como 3.3.13, 3.4.12 y 4.0.9. Sobre alpinelinux/gitlab, Alpine dice que ‘any 19.3.6 image you pulled before October 27, and all older tags, are vulnerable’. Revisá cada tag con ruby -v.
# En tu Dockerfile, fijá una base con Ruby corregido, por ejemplo # FROM ruby:3.4.12-alpine (o 3.3.13 / 4.0.9) docker build --pull --no-cache -t my-gitlab:19.4.5 . docker run --rm --entrypoint ruby my-gitlab:19.4.5 -v
18.10 y anteriores
Upgrade Path tool · paradas obligatorias
No hay backport de CVE-2026-110264 por debajo de la 18.11, así que te toca moverte. Las paradas obligatorias son 18.2, 18.5, 18.8 y 18.11, después 19.2, 19.5, 19.8 y 19.11 (antes, 17.3, 17.5, 17.8 y 17.11). Caé en el último parche de cada parada, planificá con el Upgrade Path tool de GitLab y fijá la versión del paquete en cada paso.
Paso 3: Si hoy no podés parchear
Los avisos de GitLab no ofrecen workaround, y el de Ruby (dejar de compilar regexps a partir de entradas no confiables) no es algo que puedas hacer dentro de GitLab. Lo que sí podés hacer es complicar el camino conocido. Rapid7 sugiere restringir el acceso sin credenciales a proyectos públicos donde un atacante pueda escribir o bloquear la ruta de CI lint; las notas de detección de GitLab suman: limitá quién puede crear cuentas y tokens, y reducí la visibilidad pública donde puedas.
Cerrá el registro abierto
Las dos opciones están en la documentación de restricciones de registro de GitLab, incluida la línea para la consola de Rails. El atacante de Alpine entró con una cuenta recién registrada.
# UI: Admin > Settings > General > New user account restrictions # destildá 'Allow new user accounts' (o tildá 'Require admin approval') # Consola de Rails en una instalación con paquete Linux sudo gitlab-rails console ::Gitlab::CurrentSettings.update!(signup_enabled: false)
Buscá con las consultas de logs del propio GitLab
Estas líneas salen de las reglas de detección que GitLab enlazó en los dos avisos (gitlab-security-oss/tldr), con las rutas del paquete Linux; en Helm, los mismos logs están en los pods de Webservice y Sidekiq. GitLab llama a un 502 de Workhorse cuyo correlation ID nunca llegó a api_json.log ‘the single highest-confidence signal in the set’.
WH=/var/log/gitlab/gitlab-workhorse/current APP=/var/log/gitlab/gitlab-rails/application_json.log PUMA=/var/log/gitlab/puma/puma_stderr.log SIDEKIQ=/var/log/gitlab/sidekiq/current # 1. Workers que murieron en las rutas de lint o GraphQL (la detonación) grep -E '"uri":"[^"]*(ci/lint|/api/graphql)' "$WH"* | grep -E '"status":502|badgateway' # 2. Patrones que frenó la guarda de regexp de CI (el sondeo, registrado tal cual) grep 'Gitlab::Ci::Build::Rules::Rule::Clause::RegexpMatcher' "$APP"* \ | grep -E 'rejected at compile time|match timed out|time budget exceeded' # 3. Caídas nativas de Ruby a través de Onigmo (camino de CI y de Org-mode) grep -B1 -A20 '\[BUG\]' "$PUMA"* \ | grep -E 'org-ruby|headline\.rb|regexp_matcher\.rb|match_at|onig_search_gpos|onig_compile|compile_tree|compile_length_tree|rb_str_sub_bang' grep 'A worker terminated, shutting down the cluster' "$SIDEKIQ"* # 4. El commit disparador: rutas cerca de 255 bytes con un byte no ASCII # (corrélo en un clon de cada proyecto sospechoso) git ls-tree -r --name-only HEAD | awk 'length($0) >= 240' | grep -P '[^\x00-\x7F]'
Qué cubren estas mitigaciones y qué no
- Registro cerrado: frena cuentas nuevas, no las existentes. Revisá las cuentas creadas desde el 12 de octubre y las que subieron archivos de CI a proyectos públicos.
- Proyectos públicos: pasarlos a privados o internos achica el camino de Rapid7 y el camino Org-mode de CVE-2026-110264. GitLab documenta ‘Restricted visibility levels’ como un límite a quién puede crear proyectos públicos, así que cambiá los existentes a mano.
- Bloquear ci/lint: cubre solo el camino de Rapid7; las detecciones de GitLab también vigilan la mutación ciLint de GraphQL y la creación de pipelines, y el camino no divulgado puede ser otro.
- Regexp.timeout y límites de longitud: no sirven; Ruby dice que ninguno protege, y algunos de estos fallos se disparan con patrones cortos.
- Si ya se ejecutó código: rotá lo que listan las notas de respuesta de GitLab: los secretos de gitlab-secrets.json, cada variable de CI/CD, cada token de runner y cada token de acceso.
Guardá la evidencia antes de parchear
Actualizar reinicia todos los workers, y las trazas de las caídas se van con ellos. La guía de la BOD 26-04 de CISA pone la recolección de evidencia antes del parche para las entradas del KEV que requieren triaje forense, como esta, y las notas de GitLab piden preservar el reporte completo de la caída antes de cualquier reinicio. Copiá /var/log/gitlab fuera del servidor y después parcheá. Un éxito silencioso no deja ningún 502, así que buscá también archivos del usuario git en /tmp, procesos hijos inesperados de Puma o Sidekiq, conexiones salientes y crontabs o claves SSH modificadas del usuario git.
El orden en que trabajaría
- 1. Hoy: los GitLab expuestos a internet en 19.2 a 19.4 por debajo de las versiones corregidas. Guardá los logs y pasá al último parche de tu línea; si no podés, cerrá el registro y revisá los proyectos públicos ya mismo.
- 2. También hoy: cada instalación con Ruby propio: servidores self-compiled e imágenes de la comunidad o propias. Revisá ruby -v, actualizá Ruby, reconstruí y reiniciá.
- 3. Antes del viernes 6 de noviembre: cualquier otra línea por debajo de las versiones del 21 de octubre. Lo que esté en 18.7 o posterior y además se haya salteado las versiones de septiembre queda abierto a CVE-2026-85706, en el KEV desde el 11 de septiembre.
- 4. Esta semana: corré las consultas de logs de GitLab hacia atrás hasta el 12 de octubre; tratá cualquier coincidencia como un incidente y rotá secretos y tokens.
- 5. De forma continua: tus propios servicios en Ruby que compilan regexps enviadas por usuarios, el arreglo de Ruby en Debian y los issues de GitLab sobre estos CVE, públicos 90 días después de cada arreglo.
Conclusión
Hace tres semanas CVE-2026-97229 era una línea en una versión de parche. Hoy es una entrada del KEV con una prueba de concepto pública, un ataque documentado contra un proyecto open source bien administrado y más de mil servidores todavía expuestos. La vuelta de tuerca está en dónde vive el arreglo: en un Ruby que GitLab parchea dentro de sus propios paquetes, y así fue como Alpine terminó con un GitLab ‘corregido’ que seguía siendo explotable.
Con el paquete Linux, la imagen de Docker o el chart de Helm de GitLab, es un parche normal: guardá los logs, pasá a la última versión de tu línea y los dos CVE de regex quedan cubiertos. Si traés tu propio Ruby, son dos actualizaciones, y ruby -v es el número que dice la verdad. En cualquier caso, cerrar el registro abierto es el control más barato que podés activar hoy.
Esta semana en una pantalla
Revisá
- • gitlab:env:info o /api/v4/version
- • ¿Paquete oficial o Ruby propio?
- • ruby -v donde el Ruby es tuyo
Parcheá
- • 19.5.3 / 19.4.5 / 19.3.7 / 19.2.10
- • 19.1.10 / 19.0.11 / 18.11.14
- • Ruby 3.3.13 / 3.4.12 / 4.0.9 si lo compilás vos
Vigilá
- • 502 de Workhorse en ci/lint y /api/graphql
- • Caídas [BUG] en puma_stderr.log
- • Registros nuevos y proyectos públicos
Fuentes
- GitLab — Critical Patch Release 19.4.2, 19.3.5, 19.2.8 (12 oct)
- GitLab — Critical Patch Release 19.5.1 y backports (21 oct)
- GitLab — Patch Release 19.5.3 y backports (29 oct)
- GitLab — Critical Patch Release 19.4.1 (23 sep, CVE-2026-93577)
- Seguridad de GitLab — reglas de detección de Onigmo (tldr)
- Documentación de GitLab — Instalación self-compiled
- Documentación de GitLab — Rutas de actualización
- Documentación de GitLab — Restricciones de registro
- Ruby — Arreglos de Regexp para los CVE de GitLab (23 oct)
- CISA — Incorporaciones al KEV del 29 de octubre
- Rapid7 — ETR: CVE-2026-97229 en GitLab
- Rapid7 — Análisis técnico de CVE-2026-97229
- Alpine Linux — Incidente de seguridad en GitLab
- BleepingComputer — Más de 1.000 servidores GitLab vulnerables (2 nov)
- Tracker de seguridad de Debian — CVE-2026-97229
- omnibus-gitlab — definición de build de Ruby (19-4-stable)



