Критическая уязвимость CVE-2026-97229 (CVSS 10.0) в движке регулярных выражений Onigmo, встроенном в Ruby, была использована для атаки на GitLab-сервер проекта Alpine Linux. По данным Alpine Linux, 20–21 октября 2026 года вновь зарегистрированная учётная запись отправляла специально сформированные конфигурации CI на сервер gitlab.alpinelinux.org. Ключевая проблема: обновление GitLab до версии 19.3.6 не устранило уязвимость, поскольку образ Alpine использовал стандартный Ruby, а не пропатченный Ruby из официальных пакетов GitLab. Администраторам самостоятельно собранных инсталляций GitLab и пользовательских контейнерных образов необходимо обновить и GitLab, и Ruby до версий 3.3.13, 3.4.12 или 4.0.9. Уязвимость добавлена в каталог CISA KEV 29 октября 2026 года. Мы уже писали об этой уязвимости ранее.
Суть уязвимости
Согласно записи CVE, CVE-2026-97229 — это целочисленное переполнение (CWE-190) в компиляторе регулярных выражений Onigmo, который Ruby использует для обработки regex. GitLab компилирует регулярные выражения из конфигураций CI/CD с помощью Ruby, что позволяет атакующему добиться выполнения произвольного кода на сервере через специально сформированное регулярное выражение в файле .gitlab-ci.yml.
Уязвимость затрагивает GitLab CE/EE версий:
- 19.2 до 19.2.8
- 19.3 до 19.3.5
- 19.4 до 19.4.2
Rapid7 воспроизвела полную цепочку эксплуатации на официальном образе GitLab 19.4.1 CE, получив выполнение команд от имени системного пользователя git. На пропатченном образе 19.4.2 тот же ввод не сработал. Важная деталь: в протестированном Rapid7 маршруте атакующему сначала нужно разместить вредоносную конфигурацию CI и файл с UTF-8 символами в пути в публичном проекте — только финальный запрос CI lint является неаутентифицированным. Это требование снимается на серверах, где новые пользователи могут самостоятельно регистрироваться и создавать проекты.
Хронология атаки на Alpine Linux
По данным Alpine Linux, события развивались следующим образом:
- 13 октября — Alpine обновила сервер до GitLab 19.3.4 вместо 19.3.5 (ошибка при обновлении). Сервер остался без исправления, выпущенного 12 октября.
- 20–21 октября — вновь зарегистрированная учётная запись отправила специально сформированные конфигурации CI, вызвав 8 аварийных завершений рабочих процессов GitLab. В 4 из них атакующий частично продвинулся по цепочке эксплуатации, но не завершил следующий шаг. Атака 21 октября также вызвала ошибки 502 и сбои заданий CI.
- 22 октября — Alpine обновила сервер до GitLab 19.3.6, но уязвимость осталась (стандартный Ruby не был обновлён).
- 23 октября — учётная запись атакующего заблокирована.
- 25–26 октября — атакующий попытался восстановить доступ, но безуспешно.
- 26 октября — Alpine обнаружила, что сервер всё ещё уязвим после обновления GitLab.
- 27 октября — сервер закрыт для всех, кроме разработчиков и серверов сборки.
- 28 октября — сервер полностью пересобран с нуля с Ruby 3.3.13, все секретные ключи заменены, пароли всех учётных записей сброшены.
Alpine также зафиксировала, что атакующий скачал контейнерный образ GitLab проекта, что, по оценке Alpine, указывает на подготовку эксплойта под конкретную сборку.
Почему обновление GitLab не помогло
Это центральный урок инцидента. Исправление GitLab от 12 октября включало пропатченный Ruby внутри официальных Linux-пакетов и контейнерных образов GitLab. Однако Alpine использовала собственный образ с системным Ruby, а не с Ruby из пакетов GitLab. Обновление GitLab не затрагивает отдельно установленный Ruby — уязвимый компилятор регулярных выражений Onigmo остаётся на месте.
Таким образом, граница исправления двумерна: официальные пакеты GitLab содержат пропатченный Ruby, а самостоятельно собранные инсталляции и пользовательские контейнерные образы требуют отдельного обновления Ruby. Исправленные версии Ruby — 3.3.13, 3.4.12 и 4.0.9 — вышли 22–23 октября. При этом, по состоянию на 29 октября, ни один из бюллетеней GitLab для самостоятельно собранных инсталляций не указывал на необходимость обновления Ruby, а руководство по установке из исходников всё ещё указывало Ruby 3.2 как минимальную версию. Ruby 3.2 достигла конца жизненного цикла в апреле 2026 года и не получит исправления — пользователям этой ветки необходима миграция на поддерживаемую версию.
Что удалось и чего не удалось установить
Alpine не обнаружила признаков выполнения кода атакующего: временны́е замеры не показали задержек, не найдено посторонних файлов, ключей, хуков или процессов. Однако Alpine не может исключить успешную эксплуатацию. Как указано в отчёте проекта, успешный эксплойт не оставляет аварийного завершения и следов в веб-логах. Часть логов за дни атаки утрачена, включая логи фоновых задач и файловую систему старого контейнера. Ни Alpine, ни её хостинг-провайдер не вели журнал исходящих сетевых соединений.
Отсутствие исходящей телеметрии и неполнота логов — ключевые факторы, не позволившие провести чистую форензику. Это повышает значимость шести правил обнаружения, опубликованных GitLab для самоуправляемых инстансов, и хостовых проверок.
При условии успешной эксплуатации могли быть скомпрометированы: адреса электронной почты, имена и IP-адреса пользователей; хеши паролей; секреты 2FA; переменные CI/CD и токены раннеров; учётные данные вебхуков, интеграций и зеркал; хеши персональных токенов доступа; приватные репозитории и конфиденциальные задачи. Alpine подчёркивает, что ключи подписи пакетов и релизов никогда не хранились на GitLab-сервере, а все изменения в aports за период атаки верифицированы по внешним записям.
Рекомендации
Для администраторов GitLab
- Официальные Linux-пакеты или контейнерные образы GitLab: обновите до последнего релиза для вашей ветки (19.4.2, 19.3.5, 19.2.8 или новее — релизы от 21 октября также закрывают отдельную уязвимость CVE-2026-110264).
- Самостоятельно собранные инсталляции или образы с собственным Ruby: обновите и GitLab, и Ruby до 3.3.13, 3.4.12 или 4.0.9. Ruby 3.2 исправления не получит.
- Временные меры (по рекомендации Rapid7): ограничьте анонимный доступ к публичным проектам, запретите недоверенным пользователям создание публичных проектов, заблокируйте маршрут CI lint. Эти шаги закрывают только протестированный Rapid7 маршрут эксплуатации.
- Обнаружение: используйте шесть правил обнаружения GitLab в формате Sigma. Проверьте наличие файлов пользователя git в /tmp, неожиданных дочерних процессов Puma или Sidekiq, исходящих соединений, изменённых crontab или SSH-ключей пользователя git.
- При обнаружении признаков выполнения кода — считайте сервер скомпрометированным и ротируйте секреты в gitlab-secrets.json, все переменные CI/CD, токены раннеров и токены доступа.
Для пользователей Alpine Linux
- Пользователи образа alpinelinux/gitlab должны повторно загрузить тег 19.3.6 — образ от 27 октября содержит Ruby 3.3.13, более ранние загрузки уязвимы.
- Пакеты Ruby в Alpine уже исправлены: Ruby 3.4.12 на Alpine 3.22–3.24 и edge, Ruby 3.3.13 на Alpine 3.21. Достаточно выполнить
apk upgrade. - Владельцам учётных записей на gitlab.alpinelinux.org потребуется сбросить пароль при повторном открытии сервера. Если пароль использовался на других сайтах — его следует сменить и там.
Инцидент Alpine Linux демонстрирует конкретный и воспроизводимый сценарий: обновление GitLab без обновления Ruby оставляет сервер уязвимым для CVE-2026-97229. Администраторам самостоятельно собранных инсталляций и пользовательских контейнерных образов GitLab необходимо немедленно проверить версию Ruby на своих серверах и обновить её до 3.3.13, 3.4.12 или 4.0.9 — само по себе обновление GitLab эту уязвимость не закрывает.












