Команда Linux-дистрибутива Alpine Linux сообщила, что 20 и 21 октября злоумышленник пытался взломать сервер GitLab проекта через критическую уязвимость CVE-2026-97229. Следов успешной атаки разработчики не нашли, но исключить ее не могут, поэтому развернули GitLab заново на новом сервере, сбросили пароли всех пользователей и заменили секретные ключи GitLab. По результатам проверки репозиторий aports, пакеты и выпуски Alpine от 21 октября не изменены.

Alpine Linux – компактный дистрибутив на базе библиотеки musl и BusyBox, на нем построены многие образы контейнеров Docker. На сервере GitLab проекта хранятся репозитории, проходят проверка изменений и задачи CI, в том числе для aports – набора сценариев, по которым собираются пакеты Alpine. Поэтому такой сервер – удобная цель для атаки на цепочку поставок: изменения в нем могут попасть в программы, которые зависят от Alpine.
Что за уязвимость
CVE-2026-97229 оценена в 10 баллов из 10 по шкале CVSS. GitLab исправила ее 12 октября в версиях 19.4.2, 19.3.5 и 19.2.8. По описанию компании, в уязвимых версиях пользователь без аутентификации мог выполнить произвольный код на сервере GitLab с помощью специально подготовленного регулярного выражения в конфигурации CI/CD. Причина – целочисленное переполнение в Onigmo, движке регулярных выражений, встроенном в Ruby.
Исправление GitLab – это не изменение собственного кода, а набор патчей к Ruby, который компания включает только в свои официальные пакеты и образы контейнеров. Сам Ruby получил исправление 23 октября в версиях 4.0.9, 3.4.12 и 3.3.13. Как пояснили разработчики Ruby, ошибка затрагивает любые программы, которые компилируют регулярные выражения из строк, полученных извне, а ограничение времени Regexp.timeout от нее не защищает.
29 октября Агентство по кибербезопасности и защите инфраструктуры США (CISA) внесло CVE-2026-97229 в каталог активно эксплуатируемых уязвимостей и обязало федеральные ведомства устранить ее до 1 ноября. Сторонние эксплойты и подтверждения концепции (PoC) публикуются на GitHub с 13 октября. По данным Shadowserver, на 1 ноября более 1000 серверов GitLab, доступных из интернета, все еще оставались без исправления.
Как проходила атака
Alpine обновила GitLab 13 октября, но по ошибке установила версию 19.3.4 вместо 19.3.5, в которой уже было исправление. 20 октября злоумышленник зарегистрировал на сервере новую учетную запись и начал его исследовать, а 21 октября отправил подготовленные конфигурации CI. Рабочие процессы GitLab аварийно завершились 8 раз, пользователи получали ошибку 502, задачи CI не выполнялись. По оценке команды, в четырех случаях атакующий прошел часть эксплойта и остановился на следующем шаге. Он также скачал образ контейнера GitLab, который использует Alpine. Разработчики считают, что так он подгонял эксплойт под их сборку.
22 октября Alpine обновила GitLab до версии 19.3.6, но уязвимость осталась: проект собирает собственный образ со стандартным Ruby, а патч к Ruby GitLab поставляет только в своих пакетах. 23 октября учетную запись атакующего заблокировали, 25 и 26 октября он безуспешно пытался снова попасть на сервер. 26 октября команда обнаружила, что сервер по-прежнему уязвим, а 27 октября закрыла GitLab для всех, кроме разработчиков и сборочных серверов, и начала пересборку. 29 октября GitLab снова открыт, он работает на версии 19.3.7 с Ruby 3.3.13.

Что удалось установить
Все коммиты в aports с 20 по 22 октября поступили от известных разработчиков. Это сверили с данными, к которым у атакующего не было доступа: с копией репозитория одного из разработчиков и с записями всех 45 сборочных серверов. Выпуски 3.21.9, 3.22.7, 3.23.7 и 3.24.3 от 21 октября, включая ISO-образы и архивы minirootfs, из которых собираются официальные образы alpine для Docker, а также все пакеты, собранные с 20 по 24 октября, получены из проверенных коммитов. Эту проверку провели 24 октября. Поскольку GitLab оставался уязвимым до 27 октября, команда распространяет ее и на эти дни. Ключи для подписи пакетов и выпусков на сервере GitLab никогда не хранились.
Признаков того, что код атакующего выполнялся на сервере, не нашли: замеры времени ответа не показали задержек, посторонних файлов, ключей, хуков и процессов нет, ни один веб- или API-запрос не вернул ему закрытых данных. Однако успешный эксплойт не оставил бы ни сбоя, ни записи в веб-журналах. Часть журналов за день атаки не сохранилась, а исходящие сетевые подключения не записывались ни у Alpine, ни у хостинг-провайдера.
Если атака все же удалась, могли быть раскрыты адреса электронной почты, имена и IP-адреса всех пользователей, хеши паролей, секреты двухфакторной аутентификации, переменные CI/CD и токены раннеров, учетные данные вебхуков, интеграций и push-зеркал, хеши персональных токенов доступа, а также закрытые репозитории, конфиденциальные задачи и запросы на слияние. Утечка этих данных не подтверждена.
Что нужно сделать пользователям
Пользователям gitlab.alpinelinux.org нужно задать новый пароль через ссылку «Forgot your password?» на странице входа. Вход через GitHub, GitLab.com и postmarketOS работает как прежде. Двухфакторную аутентификацию нужно настроить заново, старые коды восстановления не действуют. Персональные токены доступа, токены в адресах лент RSS и календаря и адреса для создания задач по почте тоже сброшены. Если пароль от gitlab.alpinelinux.org использовался на других сайтах, его нужно сменить и там: команда фиксировала автоматические попытки входа с паролями, утекшими с других сайтов.
У сервера новые ключи SSH, поэтому при первом подключении по SSH появится предупреждение о смене ключа. Старый ключ удаляется командой:
ssh-keygen -R gitlab.alpinelinux.org
Сопровождающим проектов нужно заново ввести значения переменных CI/CD и данные интеграций, а секреты вебхуков, push-зеркал и приложений OAuth заменить новыми, поскольку старые значения могли быть раскрыты.
Тем, кто разворачивает GitLab со своим Ruby – из исходного кода или в собственном образе контейнера, – одного обновления GitLab недостаточно: нужен Ruby 3.3.13, 3.4.12, 4.0.9 или новее. Пользователям образа alpinelinux/gitlab нужно заново загрузить тег 19.3.6: исправление есть только в образе, опубликованном 27 октября, а все более ранние образы уязвимы. Пакет ruby в Alpine 3.21–3.24 и edge уже содержит исправление, обновить его можно командой:
apk upgrade

Команда Alpine обещает устанавливать критические обновления безопасности GitLab в течение суток и проверять в каждом выпуске патчи к Ruby и другим компонентам, которые нужно применить к своей сборке. Кроме того, проект начнет записывать исходящие подключения и подключения к базе данных, хранить журналы дольше 14 дней и подписывать теги выпусков, чтобы их можно было проверить независимо от GitLab.