SeguridadDevOps

GitLab CVE-2026-97229: Explotado, en el KEV de CISA y con el Arreglo en Ruby

3 de noviembre de 2026
14 min de lectura
Un rubí rojo apoyado sobre una tubería de acero, junto a una válvula iluminada por una luz de advertencia naranja, en una sala industrial en penumbra
Compartir:

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)

10–11 sepGitLab corrige CVE-2026-85706, una lectura de archivos sin autenticación (CVSS 10); CISA la suma al KEV al día siguiente.
23 sep19.4.1, 19.3.3 y 19.2.7 corrigen CVE-2026-93577 (CVSS 9.9). El arreglo resulta incompleto.
12 oct19.4.2, 19.3.5 y 19.2.8 corrigen CVE-2026-97229, el bypass, con un Ruby parcheado adentro.
13 octRapid7 publica una prueba de concepto. Alpine actualiza por error a 19.3.4 en lugar de 19.3.5.
20–21 octUn atacante va contra el GitLab de Alpine. GitLab corrige CVE-2026-110264 y avisa que las instalaciones con Ruby propio también tienen que actualizarlo.
22–23 octAlpine pasa a 19.3.6, todavía vulnerable sobre su propio Ruby. Salen Ruby 3.3.13, 3.4.12 y 4.0.9.
27–28 octAlpine reconstruye su GitLab, vuelve a publicar alpinelinux/gitlab con Ruby 3.3.13 y divulga el incidente.
29 octCISA suma CVE-2026-97229 al KEV, con límite el 1 de noviembre. GitLab publica 19.5.3, 19.4.5, 19.3.7 y backports (sin arreglos nuevos de regex).
1 novShadowserver: más de 1.000 instancias vulnerables a CVE-2026-97229, más de 11.300 a CVE-2026-110264.

Cómo lo califica cada fuente

FuenteCalificaciónCómo leerla
GitLab (CNA, registro del CVE)CVSS 3.1 10.0, CriticalPR:N, UI:N: sin privilegios ni interacción del usuario
Rapid7RCE reproducido, PoC públicaSu camino necesita permiso de escritura en un proyecto público, algo que ‘conflicts with GitLab’s PR:N rating’
CISA KEVAgregado el 29 oct, límite el 1 novCWE-190, triaje forense obligatorio, uso en ransomware ‘Unknown’
CISA SSVCActiva, automatizable, impacto totalLa combinación que dispara una fecha límite de tres días en activos expuestos a internet
Equipo de RubySin CVE propioSeguí el arreglo con los cuatro CVE de GitLab
Debianruby3.3, ruby3.1 vulnerablesSin 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íneaCVE-2026-97229 (12 oct)CVE-2026-110264 (21 oct)Último parche (29 oct)Ruby incluido, según ruby -v
19.5No afectada19.5.119.5.33.3.12, parcheado por GitLab
19.419.4.219.4.319.4.53.3.12, parcheado por GitLab
19.319.3.5 (no 19.3.4)19.3.619.3.73.3.12, parcheado por GitLab
19.219.2.819.2.919.2.103.3.11, parcheado por GitLab
19.1 · 19.0No afectadas19.1.9 · 19.0.1019.1.10 · 19.0.113.3.11, parcheado por GitLab
18.11No afectada18.11.1318.11.143.3.10, parcheado por GitLab
18.10 y anterioresNo afectadasSin backportRuta de actualización a 18.11.14 o posteriorSin parche

Dónde vive el arreglo, según el tipo de instalación

Tipo de instalaciónDe dónde sale su RubyQué corrige CVE-2026-97229
Paquete Linux (deb/rpm)Incluido en /opt/gitlab/embedded, parcheado por GitLabActualizar GitLab a una versión corregida
Imagen oficial de Docker (gitlab/gitlab-ce, gitlab/gitlab-ee)El paquete Linux dentro de la imagenBajar un tag corregido y recrear el contenedor
Chart de Helm (imágenes cloud-native)Imágenes CNG, parcheadas por GitLabActualizar a una versión del chart asociada a una versión corregida
Self-compiled (desde el código fuente)El Ruby del sistema que instalasteActualizar 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 incluidaLo que instale el DockerfileActualizar GitLab y reconstruir sobre un Ruby corregido
GitLab.com · GitLab DedicatedAdministrado por GitLabNada 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 nov

No 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. 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. 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. 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. 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. 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

Diego Rodriguez

Diego Rodriguez

Ingeniero Senior Full-Stack & AI

Diego tiene mas de 9 anos de experiencia construyendo aplicaciones potenciadas por IA de produccion, desde orquestacion de LLMs y pipelines RAG hasta deteccion de riesgos con ML y sistemas de trading algoritmico.

Conoce mas sobre Diego →