Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
cve-2026-85706 — Analisi della causa principale, laboratorio Docker vulnerabile e script PoC per CVE-2026-85706, una lettura arbitraria di file non autenticata in GitLab tramite differenziale del parser. | Kitploit
Strumenti/GitHubGitHub/0xenesbayram/cve-2026-85706
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebSicurezza WebPenetration TestingApprendimento e FormazioneLab e Pratica
GitHub0xenesbayram/cve-2026-85706

cve-2026-85706

Analisi della causa principale, laboratorio Docker vulnerabile e script PoC per CVE-2026-85706, una lettura arbitraria di file non autenticata in GitLab tramite differenziale del parser.

Vedi Repository
9h 24m faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-85706 — Lettura arbitraria di file non autenticata in GitLab

CVSS 10.0 · Non autenticata · Attivamente sfruttata (CISA KEV)

Una differenza di parsing tra GitLab Workhorse (reverse proxy in Go) e Puma/Grape (Ruby) consente a un attaccante non autenticato di aggirare il passaggio di consegne dell'upload accelerato di Workhorse e di raggiungere tre endpoint di upload con un file.path controllato dall'attaccante, ottenendo una lettura arbitraria di file sull'host GitLab.

Codificare un carattere di files come %66iles fa sì che la rotta di upload di Workhorse non trovi corrispondenza (essa confronta sul percorso codificato) mentre Rails lo decodifica e raggiunge il vero handler (instrada sul percorso decodificato). L'handler si fida del parametro grezzo file.path che Workhorse avrebbe dovuto sovrascrivere — quindi file.path=/etc/passwd viene letto dal disco senza credenziali.

root@kitploit:~
POST /api/v4/projects/1/repository/%66iles/x?file=&file.path=/etc/passwd&file.size=1
                                   ^^^^^^  Workhorse misses -> raw file.path survives to Rails

Affette / corrette

Versione
AffetteCE/EE 18.7 → 19.1.8, 19.2 → 19.2.6, 19.3 → 19.3.2
Corrette19.1.8 / 19.2.6 / 19.3.2 (2026-09-10)

Cosa contiene questo repository

PercorsoContenuto
docs/ANALYSIS.mdAnalisi completa della causa radice — differenza di parsing, i due JWT di Workhorse, il bug di fiducia nel file.path grezzo, il diff della patch e il canale di esfiltrazione tramite errore riflesso. Analisi effettuata sul codice sorgente reale (v19.3.1-ee vs v19.3.2-ee).
lab/Laboratorio vulnerabile basato su Docker (gitlab-ce:19.3.1-ce.0) + istruzioni di avvio.
poc/detect.sh (oracolo di esistenza non distruttivo) e exploit.sh (lettura di file tramite errore riflesso). Singolo target, subordinato all'autorizzazione.

Contesto — la pipeline delle richieste di GitLab

Non hai familiarità con le interiora di GitLab? Ecco cosa fa ogni livello — nell'ordine in cui una richiesta li attraversa. Un glossario più approfondito con i concetti chiave è in docs/ANALYSIS.md §0.

root@kitploit:~
  Internet
     │
     ▼
 ┌────────┐     ┌───────────┐     ┌────────┐     ┌──────────────────────┐
 │ NGINX  │────▶│ Workhorse │────▶│  Puma  │────▶│  Grape / Rails app  │
 │(proxy) │     │   (Go)    │     │ (Ruby) │     │      (Ruby)         │
 └────────┘     └───────────┘     └────────┘     └──────────────────────┘
ComponenteCos'è
NGINXReverse proxy più esterno. Termina il TLS, serve i file statici, inoltra tutto il resto verso l'interno. Non direttamente coinvolto in questa vulnerabilità.
WorkhorseUn reverse proxy in Go specifico per GitLab. Il suo compito principale è scaricare il lavoro in cui Ruby è lento — specialmente lo streaming di upload di grandi dimensioni. Per gli endpoint di upload, Workhorse bufferizza il corpo in un file temporaneo, firma un JWT e riscrive file.path in modo che Ruby non veda mai i byte grezzi dell'upload. Inoltre appone un JWT Gitlab-Workhorse-Api-Request per ogni richiesta che inoltra (dimostrando "questo è passato attraverso il proxy", non "questo utente è autenticato").
PumaIl server applicativo Ruby che esegue l'app Rails. Riceve le richieste da Workhorse, esegue il middleware (Rack) e le smista al router.
RackIl livello di interfaccia del web server Ruby. Il middleware Rack gestisce il parsing della query string, la gestione delle sessioni e — cosa critica qui — la verifica del JWT di upload di Workhorse e la costruzione degli oggetti UploadedFile. Rack::Utils.parse_nested_query è la funzione i cui messaggi di errore fanno trapelare il contenuto dei file in questo exploit.
GrapeUn framework per API REST usato da GitLab per tutti gli endpoint /api/v4/*. Fornisce definizioni di rotte e before-filter come require_gitlab_workhorse! (controllo del proxy) e authenticate! (controllo dell'identità dell'utente). Gira dentro Rails, su Puma, dietro Workhorse — quindi vede il percorso URL decodificato.
RailsIl framework web complessivo (Ruby on Rails). GitLab è un monolite Rails — modelli, servizi e middleware girano tutti qui dentro Puma.

La vulnerabilità risiede nel divario tra Workhorse (che confronta le rotte sul percorso codificato) e Grape/Puma (che instradano sul percorso decodificato). Vedi sotto.

TL;DR del meccanismo

  1. Differenza di parsing. Workhorse confronta le rotte su r.URL.EscapedPath() (codificato); Puma/Grape instradano sul percorso decodificato. %66iles ≠ regex files per Workhorse, ma si decodifica in files per Rails.
  2. Passaggio di consegne saltato. Poiché la rotta di upload non ha trovato corrispondenza, Workhorse non bufferizza mai il corpo in un file temporaneo, non riscrive mai file.path in un percorso temporaneo firmato e non imposta mai l'header Gitlab-Workhorse-Multipart-Fields — ma inoltra comunque la richiesta (con un JWT Gitlab-Workhorse-Api-Request valido).
  3. Autenticazione mancante + fiducia nel parametro grezzo. L'endpoint non aveva authenticate!, e l'handler leggeva params['file.path'] direttamente (la stringa dell'attaccante) invece dell'UploadedFile verificato da Workhorse e confinato al percorso params[:file].
  4. Esfiltrazione tramite messaggi di errore. Il contenuto trapela attraverso le stringhe di errore di Rack::Utils.parse_nested_query ("invalid %-encoding (<file bytes>)") — la risposta riflette i byte del file fino al primo % non valido.

La patch aggiunge authenticate!, passa all'UploadedFile verificato e smette di riflettere e.message. Vedi docs/ANALYSIS.md §5.

Avvio rapido

root@kitploit:~
# 1. Stand up the vulnerable lab (see lab/README.md for details)
cd lab && docker compose up -d      # wait ~5 min for GitLab to become healthy

# 2. Non-destructive detection
../poc/detect.sh http://localhost:8929

# 3. File-read PoC against a file you're authorized to read on your own lab
../poc/exploit.sh http://localhost:8929 /var/opt/gitlab/gitlab-rails/etc/gitlab.yml

⚠️ Uso responsabile

Questo è pubblicato per scopi difensivi ed educativi: comprendere, rilevare e applicare la patch a una CVE divulgata e corretta che è nella lista CISA KEV. Gli script qui presenti sono a singolo target e richiedono di specificare esplicitamente il target.

  • Esegui questi script solo contro sistemi di tua proprietà o che sei esplicitamente autorizzato a testare.
  • Il laboratorio è progettato per girare su localhost. Non puntarlo verso host di terze parti.
  • L'accesso non autorizzato a sistemi informatici è illegale nella maggior parte delle giurisdizioni.

Se esegui GitLab, aggiorna a una versione corretta — è l'unico rimedio reale.

Riferimenti

  • watchTowr — Rapid Reaction: GitLab Path Traversal (CVE-2026-85706)
  • Nuclei Templates — PR #17231
  • Diff del codice sorgente primario: gitlab-org/gitlab @ v19.3.1-ee vs v19.3.2-ee

Licenza

MIT — solo analisi e codice PoC. GitLab è un marchio di GitLab Inc.; questo repository non è affiliato né approvato da GitLab Inc.

Scarica lo strumento