Alpine Linux пересобрала свой GitLab с нуля после попытки эксплуатации критической уязвимости CVE-2026-97229 в конце октября. Доказательств успеха атаки разработчики не нашли, но и исключить его не смогли, поэтому заменили сервер целиком.
Атака шла 20 и 21 октября. Недавно зарегистрированная учётная запись отправила на GitLab специально составленные конфигурации CI - механизма непрерывной интеграции, который собирает и проверяет код. Инстанс работал на GitLab 19.3.4 и не получил исправление, выпущенное 12 октября. Рабочие процессы падали восемь раз, в четырёх случаях атакующий прошёл часть пути к выполнению кода и остановился, а контейнерный образ GitLab он скачал, судя по всему, чтобы подогнать эксплойт под конкретную сборку.
По данным проекта, следов запуска кода на сервере не найдено, но уверенного ответа на этот вопрос нет. Успешная эксплуатация не оставляет ни падения, ни записи в веб-журналах, а часть логов за дни атаки утрачена. Исходящие подключения сервер не журналировал, и провайдер их тоже не сохранял.
Уязвимость CVE-2026-97229 получила максимальные 10 баллов по CVSS: ошибка в обработке регулярных выражений в конфигурации CI, в основе - движок Onigmo внутри Ruby. GitLab выпустила исправления 12 октября, но это патч для Ruby, который компания включает в свои пакеты и контейнерные образы; в upstream Ruby он появился 23 октября в версиях 3.3.13, 3.4.12 и 4.0.9. Обновление до GitLab 19.3.6 от 22 октября уязвимость не закрыло: образ Alpine собирается на стандартном Ruby, поэтому патч в него не попал. Образ с тегом 19.3.6 перевыпустили 27 октября уже с исправленным Ruby.
Если атака всё-таки удалась, под угрозой могли оказаться адреса электронной почты, имена и IP-адреса всех пользователей GitLab. В этом списке также хеши паролей, секреты двухфакторной аутентификации, переменные CI/CD и токены раннеров. Отдельно проект назвал учётные данные вебхуков, интеграций и зеркал, приватные репозитории, закрытые задачи и запросы на слияние. Alpine сбросила все пароли и отметила автоматические попытки входа с паролями, утёкшими с других сайтов.
Проверки показали, что репозиторий aports, пакеты и стабильные выпуски от 21 октября (3.21.9, 3.22.7, 3.23.7 и 3.24.3) не изменены. Каждый коммит в aports с 20 по 22 октября пришёл через зафиксированный пуш известного разработчика: проект сверял их с копией репозитория у разработчика и с данными всех 45 сборщиков. Ключи подписи пакетов и релизов на GitLab-сервере не хранятся, поэтому утечки ключей нет.
Сервер пересобрали и открыли заново 30 октября на GitLab 19.3.7 с исправленным Ruby. Аккаунты, проекты и задачи сохранились, но секретные ключи GitLab заменили: пароли, двухфакторную аутентификацию, токены доступа, значения переменных CI/CD и адреса для писем пришлось настраивать заново, а SSH-ключи сервера сменились. Новые учётные записи теперь регистрируются только после подтверждения администратором. В ответ на инцидент Alpine будет ставить критические обновления GitLab в течение суток и проверять каждый релиз на патчи Ruby и других компонентов, добавит журналирование исходящих соединений и будет хранить логи дольше 14 дней.
CISA 29 октября внесла CVE-2026-97229 в каталог Known Exploited Vulnerabilities (KEV) - список уязвимостей с подтверждённой эксплуатацией. Это подтверждает применение уязвимости в реальных атаках, а не только в попытках. Что именно мог получить атакующий в GitLab Alpine и затронуло ли это сторонние проекты, проект не сообщает. Проверки aports и пакетов проект собирается расширить до 27 октября - в этот день GitLab закрыли.