Alpine Linux раскрыла попытку взлома GitLab через CVE-2026-97229
Проект Alpine Linux рассказал об инциденте на своём сервере GitLab (gitlab.alpinelinux.org). 20 и 21 октября атакующий пытался использовать критическую уязвимость CVE-2026-97229 (CVSS 10.0), через неделю после выхода исправления. По словам Alpine, атака была близка к успеху. Свидетельств того, что она удалась, нет, но исключить это нельзя, поэтому инфраструктурная команда сочла сервер скомпрометированным и пересобрала его с нуля. Проверки, по данным Alpine, показали, что репозиторий aports, пакеты и релизы от 21 октября не изменялись.
Уязвимость связана с тем, как GitLab обрабатывает регулярные выражения в конфигурации CI. Первопричина, ошибка в Onigmo, движке регулярных выражений, встроенном в Ruby. GitLab выпустил исправленные версии 12 октября, но само исправление, набор патчей к Ruby, который GitLab поставляет в своих пакетах и контейнерных образах, а не изменение кода GitLab. Основной Ruby получил исправление 23 октября (версии 3.3.13, 3.4.12 и 4.0.9).
Ход атаки: недавно зарегистрированная учётная запись присылала на сервер специально составленные CI-конфигурации. Сервер работал на GitLab 19.3.4 без исправления от 12 октября. Рабочие процессы GitLab упали 8 раз; в 4 из этих случаев атакующий дошёл до середины эксплойта и споткнулся на следующем шаге. Кроме того, он скачал контейнерный образ GitLab от Alpine, по мнению Alpine, чтобы подогнать эксплойт под конкретную сборку. Следов выполнения кода атакующего на сервере Alpine не нашла.
Обновление не помогло: переход на GitLab 19.3.6 22 октября уязвимость не закрыл. Образ Alpine использовал обычный Ruby, а патч GitLab применяет только в собственных официальных пакетах. Закрыли доступ к серверу лишь 27 октября; в тот же день опубликовали образ alpinelinux/gitlab:19.3.6 с Ruby 3.3.13.
Что установлено. Релизы и пакеты не менялись: стабильные релизы 21 октября (3.21.9, 3.22.7, 3.23.7, 3.24.3), включая ISO-образы и minirootfs-архивы для официальных Docker-образов, и все пакеты, собранные с 20 по 24 октября, пришли из коммитов aports, сверенных с записями вне GitLab. Каждый коммит aports за 20-22 октября попал через зафиксированную отправку известного разработчика; сверку делали по клону разработчика и по записям всех 45 сборщиков, до которых атакующий добраться не мог. Проверки проведены 24 октября (коммиты за 20-22 октября, пакеты до 24 октября); раз сервер оставался уязвимым до 27 октября, их продлевают до этой даты. Ключи подписи пакетов и релизов никогда не хранились на сервере GitLab. Таймерные пробы не показали задержек, неожиданных файлов, ключей, хуков или процессов, а через видимые веб- и API-запросы закрытые данные атакующему не отдавались.
Почему нет уверенности: успешный эксплойт не оставил бы ни падения, ни следа в веб-логах; часть логов за день атаки утрачена (журналы фоновых задач, файловая система старого контейнера); исходящие сетевые соединения не логировались ни Alpine, ни хостинг-провайдером. Если бы атака удалась, могли бы оказаться доступны адреса почты, имена и IP-адреса всех пользователей, хеши паролей, секреты 2FA, переменные CI/CD и токены раннеров, учётные данные вебхуков, интеграций и push-зеркал, персональные токены доступа (хранятся в виде хешей), закрытые репозитории и конфиденциальные задачи и запросы на слияние. Это перечень возможного, а не подтверждённой утечки.
Что делать пользователям. Все пароли сброшены: после открытия GitLab нужно задать новый через «Forgot your password?» на странице входа; инструкции опубликуют при открытии. Alpine видела автоматические попытки входа с паролями, утёкшими с других сайтов, поэтому тем, кто использовал тот же пароль где-то ещё, его стоит сменить. Пока GitLab закрыт, зеркала пакетов, cgit, списки рассылки и IRC работают как обычно. Тем, кто запускает GitLab со своим Ruby (из исходников или собственного образа), мало обновить GitLab: нужен Ruby 3.3.13, 4.0.9, 3.4.12 или новее. Пользователям образа alpinelinux/gitlab нужно заново скачать 19.3.6: образы, полученные до 27 октября, и все старые теги уязвимы. Баг в движке регулярных выражений Ruby, поэтому под угрозой любая программа, компилирующая регулярные выражения из недоверенного ввода. В Alpine 3.22, 3.23, 3.24 и edge, Ruby 3.4.12, в 3.21, Ruby 3.3.13, оба с исправлением; достаточно выполнить apk upgrade.
Изменения: пересобранный сервер работает на Ruby с исправлением; критические обновления безопасности GitLab будут ставить в течение суток и проверять, не требуют ли они патчей Ruby или других компонентов; будут логировать исходящие соединения хоста GitLab и соединения с базой данных и хранить логи дольше 14 дней; появятся подписанные теги релизов, чтобы проверять релизы независимо от GitLab.
Ключевые факты
- 20-21 октября новая учётная запись слала на GitLab Alpine Linux специально составленные CI-конфигурации с целью эксплуатации CVE-2026-97229 (CVSS 10.0); рабочие процессы упали 8 раз, в 4 случаях атакующий дошёл до середины эксплойта.
- Следов успеха нет, но исключить его нельзя: сервер пересобрали с нуля, пароли сбросили. По данным проверок, aports, пакеты и релизы 21 октября (3.21.9, 3.22.7, 3.23.7, 3.24.3) не тронуты, ключи подписи на сервере не хранились.
- Исправление, патчи к Ruby, а не к коду GitLab: обновление до 19.3.6 не помогло, потому что образ Alpine использовал обычный Ruby. Нужны Ruby 3.3.13, 3.4.12, 4.0.9 или новее.
- Пока GitLab закрыт, зеркала пакетов, cgit, рассылки и IRC работают; в Alpine 3.21-3.24 и edge Ruby с исправлением ставится через apk upgrade.
- Alpine обещает ставить критические обновления GitLab в течение суток, логировать исходящие соединения, хранить логи дольше 14 дней и ввести подписанные теги релизов.
Почему это важно
Это редкий подробный разбор того, как критическая уязвимость (CVSS 10.0) обошла стандартную меру защиты: Alpine обновила GitLab до 19.3.6, но исправление лежало не в коде GitLab, а в патче к Ruby, который GitLab применяет только в своих официальных пакетах. Alpine использовала обычный Ruby, поэтому обновление уязвимость не закрыло. Кроме того, из minirootfs-архивов Alpine собираются официальные Docker-образы, и вопрос целостности её релизов и пакетов касается многих проектов; по данным проверок, их не затронули.
Кому это важно
Администраторам самостоятельно размещённых GitLab, особенно тем, кто собирает его из исходников или в своём контейнерном образе с отдельным Ruby. Пользователям образа alpinelinux/gitlab. Пользователям gitlab.alpinelinux.org, у которых сброшены пароли. Разработчикам, чьи программы компилируют регулярные выражения из недоверенного ввода: баг в движке Ruby, а не только в GitLab.
Как это применить
Если вы используете GitLab со своим Ruby, обновите и GitLab, и Ruby до 3.3.13, 3.4.12, 4.0.9 или новее. Образ alpinelinux/gitlab:19.3.6 нужно скачать заново: образы до 27 октября и старые теги уязвимы. В Alpine 3.21 установите Ruby 3.3.13, в 3.22-3.24 и edge, Ruby 3.4.12; для этого выполните apk upgrade. Аккаунт на gitlab.alpinelinux.org: после открытия задайте новый пароль через «Forgot your password?», а повторно использованный пароль смените на других сайтах. При выходе критических обновлений GitLab проверяйте, нет ли в них патчей к Ruby или другим компонентам, которые вашей сборке придётся применять самой.
Можно ли доверять
Источник, собственное сообщение команды Alpine Linux, то есть заявления самого пострадавшего; независимого подтверждения в тексте нет. Рассказ откровенно перечисляет неопределённости: нет логов исходящих соединений, часть логов за день атаки утрачена, успешный эксплойт не оставил бы следов в веб-логах. Вывод о том, что атакующий подгонял эксплойт под конкретную сборку, предположение Alpine. Кто стоял за атакой и зачем, в тексте не сказано. Проверки целостности проведены 24 октября, а сервер оставался уязвимым до 27 октября; Alpine продлевает проверки до этой даты.
Риски и подводные камни
Alpine не может исключить, что эксплойт сработал: в этом случае могли быть доступны адреса почты, имена, IP-адреса, хеши паролей, секреты 2FA, переменные CI/CD, токены раннеров и закрытые репозитории; подтверждённой утечки в тексте нет. Образы alpinelinux/gitlab, полученные до 27 октября, остаются уязвимыми. Из-за повторного использования паролей уже зафиксированы автоматические попытки входа с паролями, утёкшими с других сайтов. Дата открытия GitLab не названа; пока он закрыт, остальные сервисы доступны. Уязвимость затрагивает любую программу, компилирующую регулярные выражения из недоверенного ввода, а не только GitLab.
«Мы не нашли свидетельств того, что это удалось, но исключить этого не можем, поэтому сочли сервер скомпрометированным и пересобрали его с нуля.»
— команда Alpine Linux, сообщение об инциденте