невзлом

Срочно · GitLab

GitLab CE/EE — unauth RCE через CI/CD regexp, KEV (CVE-2026-97229)

· CVE-2026-97229

Суть

Integer overflow / wraparound при компиляции регулярных выражений CI/CD (движок Onigmo в Ruby, которым пользуется GitLab). По тексту GitLab и CISA: неаутентифицированный пользователь при определённых условиях может выполнить произвольный код на сервере GitLab, подав специально сформированный regexp в CI/CD-конфигурации. CVSS 3.1 — 10.0 (AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H, CNA GitLab). EPSS ~27.3% (лента).

Точные «certain conditions» вендор публично не детализирует — не домысливаем.

Затронуто и исправлено

По Critical Patch Release GitLab от 12.10.2026:

ЛинияУязвимоИсправлено
19.4≥ 19.4.0 и < 19.4.219.4.2
19.3≥ 19.3.0 и < 19.3.519.3.5
19.2≥ 19.2.0 и < 19.2.819.2.8

Пример: 19.4.1 — уязвима, 19.4.2 — исправлена.

  • Omnibus, source, Helm и прочие типы поставки — все, если не оговорено иное.
  • GitLab.com уже на патче; Dedicated — внутренний релиз до публикации.
  • Версии вне указанного окна для этого CVE в блоке бюллетеня не перечислены — не обобщайте на весь парк без сверки.
  • Родственные баги Onigmo (CVE-2026-89078, 93577, 110264) и фиксы Ruby 4.0.9 / 3.4.12 / 3.3.13 — см. ruby-lang.org; для инстанса GitLab достаточно официального патч-релиза GitLab.

Эксплуатация

  • CISA KEV: добавлено 2026-10-29, due 2026-11-01 (срок уже прошёл).
  • Публичный PoC: факт наличия по ленте; ссылок нет.
  • GitLab: шесть threat detections для self-managed (инфраструктура GitLab-managed остаётся на патче):
    • Onigmo native worker crash
    • Graphql cilint hostile regexp
    • ci regexp oversized non ascii path
    • ci regexp guard rejection
    • ci lint workhorse worker crash
    • ci lint scripted client error burst

Как проверить

# Omnibus
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
gitlab-rake gitlab:env:info | sed -n '1,40p'
  • UI: Admin Area → Overview — номер версии.
  • Helm: helm list / appVersion чарта / тег образа — сверить с 19.2.8 / 19.3.5 / 19.4.2+.
  • Получилось, если версия ≥ исправляющей для своей минорной линии и сервисы поднялись (gitlab-ctl status).

Как исправить

  1. Резервная копия по практике GitLab (backup create) до апгрейда; храните вне инстанса.
  2. Обновите по официальному Upgrade path своей линии до 19.4.2 / 19.3.5 / 19.2.8 (или новее поддерживаемого минора). Не прыгайте через неподдерживаемый path.
  3. Omnibus: стандартный apt/yum + gitlab-ctl reconfigure по доке Upgrade (Docker Omnibus — тот же CE/EE-образ/пакет).
  4. Helm: поднимите chart/appVersion, снимите/обновите pin тега образа (digest), rolling по runbook.
  5. После апгрейда: проверьте версию; CI lint / Sidekiq / Workhorse в норме. Не встало — restore из backup вне инстанса, смотрите лог gitlab-ctl и Upgrade docs.

Подводные камни: DB migrations в патче (в т.ч. post-deploy у 19.3.5); single-node = downtime, multi-node — zero-downtime только при правильной процедуре; пропуск major/minor в upgrade path; pinned chart/digest; совместимость внешней PostgreSQL/Redis.

Если обновить нельзя

Официального workaround в блоке CVE-2026-97229 бюллетеня GitLab нет. Снятие инстанса из интернета / ограничение экспозиции — гигиена, не замена патча. Для своих (не GitLab) приложений на Ruby: не компилируйте regexp из недоверенного ввода; Regexp.timeout и лимит длины не защищают от этих багов (ruby-lang.org).

Признаки взлома и что делать

Имена шести detections — выше; тексты/правила — со страницы Critical Patch Release (ссылка в «Источниках»). Включите/сопоставьте их в SIEM. При срабатывании или подтверждённой компрометации: изоляция хоста, ротация секретов CI/CD и admin tokens, forensic triage, восстановление из чистой точки — одного патча после взлома мало.

Источники