
Triage di sola rilevazione per GitLab CVE-2026-97229 (e CVE-2026-110264): valuta una versione self-managed di GitLab insieme al suo Ruby, intercettando le trappole della patch del 12 ottobre e del Ruby personalizzato. Nessun payload, nessuna sonda di rete.
gitlab-onigmo-scannerTriage delle versioni per le due vulnerabilità regex di GitLab con CVSS 10.0, CVE-2026-97229 e CVE-2026-110264. Fornisci una versione di GitLab che possiedi, e ti dice se quella build è ancora esposta, e intercetta le due trappole che stanno già cogliendo le persone. Non tocca mai la rete, non invia mai un payload, non raggiunge mai un endpoint di lint CI, non compila mai una regex artigianale.
La vulnerabilitàDettaglio | Valore |
|---|---|
CVE | CVE-2026-97229, più CVE-2026-110264 valutata insieme ad essa |
Bug | Integer overflow (CWE-190) in Onigmo, il motore regex integrato in Ruby, quando GitLab compila un'espressione regolare fornita dall'utente |
Impatto | Unauthenticated remote code execution su un server GitLab self-managed, in determinate condizioni |
Gravità | 10.0 critica per entrambe, valutata da GitLab come CNA |
Sfruttamento | CVE-2026-97229 aggiunta a CISA KEV il 2026-10-29, scadenza federale 2026-11-01. CVE-2026-110264 non ha alcuna voce KEV al momento della stesura, e GitLab non segnala alcun indizio di utilizzo in attacchi |
CVE-2026-97229 è la vulnerabilità regex CI/CD: un'espressione regolare appositamente costruita in una configurazione CI/CD, validazione regex insufficiente, corretta il 2026-10-12. CVE-2026-110264 è una seconda vulnerabilità regex più ampia, corretta il 2026-10-21, che raggiunge ogni release self-managed fino alla 7.0. Stesso motore, stesso punteggio, bug diverso, ed è esattamente per questo che un solo controllo non basta.
Versioni corretteCVE-2026-97229 (corretta il 2026-10-12)Linea | Corretta in |
|---|---|
GitLab 19.2 | 19.2.8 |
GitLab 19.3 | 19.3.5 |
GitLab 19.4 | 19.4.2 |
GitLab 19.5, precedenti alla 19.2 | Non elencate come affette da questa CVE |
CVE-2026-110264 (corretta il 2026-10-21)Linea | Corretta in |
|---|---|
GitLab 19.5 | 19.5.1 |
GitLab 19.4 | 19.4.3 |
GitLab 19.3 | 19.3.6 |
GitLab 19.2 | 19.2.9 |
GitLab 19.1 | 19.1.9 |
GitLab 19.0 | 19.0.10 |
GitLab 18.11 | 18.11.13 |
GitLab 18.10 e precedenti | Nessuna release corretta, aggiornare a 18.11.13 o successiva |
Ruby, per installazioni da sorgente e immagini personalizzateLinea | Corretta in |
|---|---|
Ruby 3.3 | 3.3.13 |
Ruby 3.4 | 3.4.12 |
Ruby 4.0 | 4.0.9 |
Ruby 3.2 e precedenti | Nessuna correzione, fine del ciclo di vita, passare a 3.4 o 4.0 |
Trappola 1: la patch del 12 ottobre non copre il 21 ottobre19.4.2, 19.3.5 e 19.2.8 hanno corretto CVE-2026-97229. Ognuna di esse si colloca al di sotto della correzione di CVE-2026-110264 per il proprio ramo (19.4.3, 19.3.6, 19.2.9). Se hai applicato la patch il 12 ottobre e ti sei fermato, sei ancora vulnerabile, e uno scanner che conosce solo la prima CVE ti dichiarerà pulito. Questo strumento valuta entrambe, e nomina la trappola nel suo output quando la rileva.
Trappola 2: aggiornare GitLab non corregge il tuo RubyLa correzione di GitLab è una patch al Ruby che esso include nei propri pacchetti e immagini ufficiali. Un'installazione da sorgente, o un'immagine personalizzata che installa Ruby separatamente, non riceve quella patch da un aggiornamento di GitLab. Alpine Linux l'ha vissuta sulla propria pelle: è passata a GitLab 19.3.6 il 2026-10-22 ed è rimasta vulnerabile, perché la sua immagine usava Ruby standard. Un attaccante ha sondato il suo server il 2026-10-20 e 21, ha mandato in crash i worker otto volte, è arrivato a metà dell'exploit in quattro di esse, ed è tornato il 25 e 26. Alpine non ha trovato prove che l'exploit sia riuscito, non ha potuto escluderlo, ha ricostruito l'istanza da zero, sostituito le chiavi segrete e reimpostato ogni password. La sua immagine corretta, ri-scaricata dopo il 2026-10-27, include Ruby 3.3.13.
Quindi: --install-type official valuta solo la versione di GitLab, perché il Ruby viaggia con essa. --install-type source o custom valuta anche il Ruby fornito con --ruby-version, e una versione di Ruby mancante viene valutata UNKNOWN, non pulita. Ruby 4.0.8 è un caso speciale che vale la pena conoscere: corregge il bug CVE-2026-97229 ma non CVE-2026-110264, quindi qui viene valutato VULNERABLE. Ruby non ha richiesto identificatori CVE propri per queste correzioni, motivo per cui uno scanner che confronta i record CVE con i pacchetti installati non trova alcun Ruby vulnerabile da nessuna parte. Questo strumento controlla invece direttamente la versione di Ruby.
Cosa controllaGitLab: CVE-2026-97229 e CVE-2026-110264 separatamente, poi un verdetto complessivoCSV di molte istanze: name,gitlab_version,ruby_version,install_type,hostingRuby, quando indichi che l'installazione è source o customGitLab.com e Dedicated come già corretti, nessuna azione necessariaOgni rilevamento riceve un verdetto: VULNERABLE, FIXED, EOL_NO_FIX, UNKNOWN, oppure NOT_AFFECTED per un singolo CVE su un branch che non tocca. EOL_NO_FIX conta come vulnerabile: non arriverà alcuna patch per quella linea.
Cosa non fa maiNessuna richiesta di rete. Nessun probing di server remoti. Nessuna regex artigianale, nessuna richiesta di lint CI, nessun traffico di exploit, nessun codice PoC. Legge le stringhe di versione che fornisci e si ferma. È deliberato: i PoC pubblici per CVE-2026-97229 esistono già, e riprodurne uno qui non aggiungerebbe nulla in termini difensivi.
Perché questo, quando esistono già PoC e contatori di versioneIl materiale pubblico per CVE-2026-97229 è per lo più offensivo: PoC che eseguono codice come utente git, e laboratori che mappano quali build sono sfruttabili. Censys conta gli host esposti per versione. GitLab ha pubblicato regole Sigma per individuare tentativi di sfruttamento nei log. Nulla di tutto ciò è uno strumento autonomo di triage difensivo che valuti insieme entrambe le falle CVSS 10.0 di ottobre e controlli il Ruby alla base di un'installazione source o custom. Quel vuoto è questo repo: un comando, entrambe le CVE, entrambe le trappole, nessun payload. Usalo insieme alle regole Sigma di GitLab, non al posto loro. Se un'istanza è stata sondata, il triage delle versioni non è il triage della compromissione: controlla i log di crash dei worker e i report di crash di Onigmo, e segui l'esempio di Alpine se non puoi escludere un tentativo.
ValutazioneRilevamento | Gravità |
|---|---|
GitLab al di sotto della correzione del suo branch per una delle due CVE | VULNERABLE |
GitLab su 18.10 o precedente, oppure Ruby 3.2 o precedente su un'installazione source/custom | EOL_NO_FIX, conta come vulnerabile |
GitLab alla pari o oltre entrambe le correzioni, e un Ruby corretto dove applicabile | FIXED |
Installazione Source/custom senza versione di Ruby, o un branch più recente dei dati di questo strumento (2026-10-30) | UNKNOWN, non pulito |
GitLab.com / Dedicated | FIXED, corretto da GitLab |
Utilizzo# One instance, official package or image
python3 gitlab_onigmo_scanner.py --version 19.4.2
# One instance, source install with its own Ruby
python3 gitlab_onigmo_scanner.py --version 19.4.3 --ruby-version 3.4.11 --install-type source
# A whole estate, machine-readable output
python3 gitlab_onigmo_scanner.py --list inventory.csv --json
# Tests (version tables only, no network)
python3 -m unittest discover -s tests -v
inventory.csv formato, riga di intestazione opzionale:
name,gitlab_version,ruby_version,install_type,hosting
prod,19.4.1,,official,self-managed
staging,19.4.3,,official,self-managed
legacy-source,19.4.3,3.4.11,source,self-managed