GitLab security CVE patching CI/CD

Łatanie GitLab CVE-2026-110264: inwentaryzacja, wersje z poprawką, migracje i detekcja

Załataj self-managed GitLab przeciwko CVE-2026-110264: zinwentaryzuj każdą instancję, sprawdź serwowaną wersję per metoda instalacji, zaktualizuj do wydania z poprawką dla swojej gałęzi minor (uwzględniając migracje bazy w 19.4.3 i 19.3.6) i uruchom reguły detekcji GitLaba, aby sprawdzić próby wykorzystania.

Jerzy Kopaczewski ·
CVE-2026-110264 to nieuwierzytelnione RCE o ocenie CVSS 10.0 w self-managed GitLab CE/EE, dotyczące każdego wydania aż do 7.0, załatane 21 października 2026. Nie ma obejścia. Ten runbook prowadzi od „jakie instancje mamy" do załatanej i zweryfikowanej floty, w tym pułapki łatki z 12 października i dwóch wydań z migracjami bazy. Tło luki opisaliśmy w artykule o CVE-2026-110264.

Ten runbook dotyczy wyłącznie self-managed GitLab. GitLab.com i GitLab Dedicated są już załatane. Po pomoc w zaplanowaniu aktualizacji z niewspieranej wersji zobacz Migrację do chmury lub umów konsultację.

Objawy

Nie ma błędu, na który można czekać. Luka jest cicha: udana próba niekoniecznie wywołuje awarię serwera. O podatności decyduje wersja, a nie wpis w logu.

  • Dowolna instancja self-managed GitLab CE/EE na wersji od 7.0 aż do poprawki z 21 października jest podatna.
  • Instancje załatane 12 października (19.4.2, 19.3.5, 19.2.8) są nadal podatne na tę lukę. Tamta poprawka naprawiała inny błąd (CVE-2026-97229).
  • GitLab.com i GitLab Dedicated (na załatanych buildach wewnętrznych) nie są dotknięte.

Krok 1: zinwentaryzuj każdą instancję

Wypisz każdy serwer GitLab, który prowadzisz, w tym te łatwe do przeoczenia:

  • Repliki Geo (tylko do odczytu)
  • Instancje staging, QA i demo
  • Serwery zapasowe disaster-recovery
  • Stare lub „tymczasowe” instancje, których nikt już nie pilnuje

Zapomniana instancja na podatnej wersji to pełne, nieuwierzytelnione wejście RCE. Potraktuj inwentaryzację jako właściwy rezultat tego kroku.

Krok 2: sprawdź wersję serwowaną przez każdą instancję

Sprawdź, co aplikacja faktycznie uruchamia, per metoda instalacji:

# Pakiet Linux (Omnibus)
sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

# Docker
docker exec <container> cat /opt/gitlab/embedded/service/gitlab-rails/VERSION

# Helm chart: odczytaj kolumnę APP VERSION, nie wersję chartu
helm list --all-namespaces | grep -i gitlab

# API (dowolna instalacja) - wymaga tokenu
curl --header "PRIVATE-TOKEN: <twoj-token>" \
  "https://gitlab.example.com/api/v4/version"

Zalogowani użytkownicy mogą też odczytać wersję pod /help w przeglądarce. Dla Helm chart: jeśli ustawiłeś global.gitlabVersion, ta wartość ma pierwszeństwo przed wersją aplikacji z chartu.

Krok 3: wybierz wersję z poprawką dla swojej gałęzi

Porównaj działającą wersję z tabelą i zaktualizuj w obrębie bieżącej gałęzi minor. Aktualizacja na poziomie patcha (np. 19.4.1 do 19.4.3) nie wymaga dodatkowych przystanków.

Jeśli masz Zaktualizuj do Uwagi
19.5 19.5.1 Wszystkie 12 poprawek
19.4 19.4.3 Wszystkie 12 poprawek, zawiera migracje bazy
19.3 19.3.6 Wszystkie 12 poprawek, zawiera migracje bazy
19.2 19.2.9 Tylko poprawka krytyczna
19.1 19.1.9 Tylko poprawka krytyczna
19.0 19.0.10 Tylko poprawka krytyczna
18.11 18.11.13 Tylko poprawka krytyczna
18.10 i starsze Brak załatanego wydania Przejdź na wspieraną gałąź (Krok 6)

Wydania 19.2, 19.1, 19.0 i 18.11 to backporty zawierające tylko poprawkę krytyczną. Pozostałe 11 poprawek z tego dnia (dwie o wysokiej wadze) jest tylko w 19.3.6, 19.4.3 i 19.5.1. Jeśli jesteś na 19.2 lub starszej i chcesz pełen zestaw, zaplanuj przejście na 19.3.6 lub nowszą, co może wymagać przystanków.

Krok 4: zastosuj poprawkę (uważaj na migracje)

Tylko 19.4.3 i 19.3.6 zawierają migracje bazy danych. Na serwerze jednowęzłowym GitLab pozostaje niedostępny do zakończenia migracji, więc zaplanuj krótkie okno. Instalacje wielowęzłowe mogą skorzystać z procedury zero-downtime GitLaba.

# Pakiet Linux (Omnibus) - Debian/Ubuntu
sudo apt update && sudo apt install gitlab-ce=19.4.3-ce.0   # lub gitlab-ee=19.4.3-ee.0
# Pakiet Linux - RHEL/Amazon Linux
sudo dnf install gitlab-ce-19.4.3-ce.0

# Docker: pobierz dokładny tag i odtwórz kontener
docker pull gitlab/gitlab-ce:19.4.3-ce.0
# następnie odtwórz kontener z tymi samymi wolumenami/konfiguracją

# Helm: ustaw tag obrazu na wersję z poprawką i zaktualizuj
helm upgrade gitlab gitlab/gitlab --reuse-values \
  --set global.gitlabVersion=19.4.3

# Po instalacji pakietu zrekonfiguruj (Omnibus)
sudo gitlab-ctl reconfigure

Przypnij dokładną wersję z poprawką zamiast „latest”, żeby każdy węzeł floty wylądował na tym samym buildzie.

Krok 5: zweryfikuj poprawkę

# 1. Potwierdź, że serwowana wersja odpowiada wydaniu z poprawką
sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
# Oczekiwane: 19.4.3 (lub wersja, którą wybrałeś)

# 2. Potwierdź zakończenie migracji i zdrowie aplikacji (Omnibus)
sudo gitlab-ctl status
sudo gitlab-rake db:migrate:status 2>/dev/null | tail -5
# Oczekiwane: wszystkie usługi "run", brak oczekujących migracji

# 3. Potwierdź, że instancja odpowiada po HTTP
curl -s -o /dev/null -w "%{http_code}\n" https://gitlab.example.com/-/health
# Oczekiwane: 200

Powtórz kroki 2 do 5 dla każdej instancji z inwentaryzacji, w tym replik Geo i staging.

Krok 6: jeśli jesteś na 18.10 lub starszej

Poniżej gałęzi 18.11 nie ma załatanego wydania, więc nie da się załatać w miejscu. Zaktualizuj do wspieranej wersji. Aktualizacje GitLaba przez kilka wersji minor wymagają etapowych przystanków (konkretnych wersji pośrednich, przez które trzeba przejść), więc to zaplanowana migracja, a nie jednorazowe apt upgrade. Do czasu jej zakończenia zmniejsz ekspozycję: zdejmij instancję z publicznego internetu albo przynajmniej ogranicz widoczność projektów publicznych, bo ścieżka nieuwierzytelniona potrzebuje publicznego projektu ze spreparowanym plikiem .org. To zawęża atak; nie zamyka luki.

Krok 7: sprawdź próby wykorzystania

GitLab opublikował dwie reguły detekcji (format Sigma, w otwartym frameworku TLDR), które działają na logach aplikacji:

  • Seria błędów renderowania Org-mode: jeden klient powodujący pięć lub więcej timeoutów renderowania Org-mode w ciągu 30 minut (exceptions_json.log).
  • Awaria natywnego workera Onigmo: worker GitLaba padający wewnątrz silnika regex (puma_stderr.log).

Możesz też przeszukać checkouty repozytoriów pod kątem podrzuconych ładunków (zbyt długie linie #+TODO: w plikach .org):

# Uruchom wewnątrz checkoutu podejrzanego repozytorium
rg -l --glob '**/*.org' '^\#\+(TODO|SEQ_TODO|TYP_TODO):.{500,}'

Awaria to powód do zbadania, a nie dowód kompromitacji. Jeśli znajdziesz ślady udanego ataku, potraktuj serwer jako skompromitowany: kod działa z uprawnieniami konta, na którym działa GitLab, więc zrotuj zmienne CI/CD, tokeny runnerów, klucze deploy i tokeny dostępu trzymane na serwerze. Pamiętaj, że wiele instancji domyślnie nie zapisuje puma_stderr.log, więc potwierdź wymagane źródła logów dla każdej reguły, zanim na niej polegniesz.

Self-managed GitLab trzyma Wasz kod źródłowy i często sekrety wdrożeniowe, więc nieuwierzytelnione RCE o maksymalnej wadze jest bliskie najgorszego scenariusza. Załataj dziś, zweryfikuj każdą instancję (nie tylko tę, o której myślisz) i zachowaj datowany zapis wersji przed i po dla audytorów.

Potrzebujesz wsparcia przy załataniu wszystkich instancji GitLab?

Pomagamy zespołom zinwentaryzować self-managed GitLab, bezpiecznie przeprowadzić aktualizacje z migracjami bazy i zaplanować ścieżkę zejścia z niewspieranych wersji. Umów bezpłatny sanity check.

 

Jerzy Kopaczewski

Self-managed GitLab do załatania lub aktualizacji?

Umów bezpłatną 30-minutową rozmowę. Potwierdzimy, co jest narażone, przeprowadzimy aktualizacje z migracjami bazy i zaplanujemy bezpieczne zejście z każdej niewspieranej wersji.

Umów rozmowę