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 — PoC exploit in Python per CVE-2026-85706, una lettura arbitraria di file non autenticata in GitLab CE/EE tramite bypass della codifica del percorso di Workhorse, con writeup e varianti di bypass. | Kitploit
Strumenti/GitHubGitHub/guneykabel/cve-2026-85706
Analisi delle VulnerabilitàExploitSfruttamento di Applicazioni WebRaccolta InformazioniVirtualizzazione per la SicurezzaSicurezza WebPenetration Testing
GitHubguneykabel/cve-2026-85706

cve-2026-85706

PoC exploit in Python per CVE-2026-85706, una lettura arbitraria di file non autenticata in GitLab CE/EE tramite bypass della codifica del percorso di Workhorse, con writeup e varianti di bypass.

Vedi Repository
412h 9m 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 locali non autenticata in GitLab CE/EE. Interessa 18.7–19.1.7, 19.2.0–19.2.5, 19.3.0–19.3.1. Corretta in 19.1.8 / 19.2.6 / 19.3.2 (2026-09-10). CVSS 10.0, presumibilmente sfruttata attivamente. Report originale di s3ntago e questo repo è solo il mio writeup + PoC.

disclaimer

Questa PoC è pubblicata solo a scopo didattico e di ricerca difensiva, per aiutare amministratori e ricercatori a comprendere e testare la vulnerabilità. Eseguila esclusivamente contro sistemi di tua proprietà o per i quali hai un'esplicita autorizzazione scritta al test. Se la tua istanza rientra nell'intervallo interessato, smetti di leggere e applica prima la patch a 19.1.8 / 19.2.6 / 19.3.2.

come funziona

Tre endpoint di repository (POST :id/repository/commits, POST/PUT :id/repository/files/:file_path) si trovano dietro il requestBodyUploader di Workhorse. L'handler Rails legge il percorso su disco direttamente dal campo raw file.path della richiesta ed esegue File.open su di esso prima di qualsiasi autenticazione. non funge da autenticazione perché il signing round-tripper di Workhorse allega un JWT valido a ogni richiesta che proxa, quindi tutto ciò che ricade nel proxy API generico supera quel controllo.

require_gitlab_workhorse!
Gitlab-Workhorse-Api-Request

L'unico motivo per cui questa non è una LFI istantanea per tutti è che Workhorse dovrebbe riscrivere prima la richiesta. Ma la sua regex di routing fa match sul percorso escaped (EscapedPath() più un clone path.Clean che non decodifica mai %XX), mentre Puma decodifica %XX prima del routing di Grape. Quindi percent-encoda qualsiasi carattere di un segmento statico (%63ommits, %72epository, %66iles), aggiungi uno slash finale, oppure accoda .json che la regex di Workhorse non intercetta, e Rails instrada comunque verso l'handler vulnerabile. Quel mismatch di encoding è dove sta il bypass. (Le varianti //, /./, %2F, ; come queste non funzionano perché path.Clean normalizza le prime due e Puma rifiuta %2F.)

Poi basta inviare metadati di upload non firmati falsificati come query param:

root@kitploit:~
POST /api/v4/projects/1/repository/%63ommits?file=&file.path=<ABSOLUTE_PATH>&file.size=1&Content-Type=application/x-www-form-urlencoded

file= vuoto soddisfa la validazione requires :file, WorkhorseFile (il vuoto viene convertito in nil). La lettura avviene pre-auth. Ottenere i byte indietro è la parte divertente: sul ramo urlencoded l'helper esegue Rack::Utils.parse_nested_query(File.read(path)) e interpola gli errori del parser nel body 400. Qualsiasi % non seguito da due cifre esadecimali solleva InvalidParameterError: invalid %-encoding (<raw file bytes>) e il contenuto del file torna dentro il messaggio di errore. Il ramo JSON (Oj) non fa trapelare nulla, ed è per questo che il content type urlencoded qui è importante.

La correzione (master 0d9ce3e7, backport 1fe30154 / b43c8b26 / 0ff7b6b2) aggiunge authenticate! a tutti e tre gli endpoint più il pre-step /authorize, si fida solo dell'UploadedFile prodotto dal middleware per path/size, e smette di rimandare in output gli errori del parser. Il bug è stato introdotto a dicembre 2025, ed è per questo che l'intervallo interessato parte da 18.7.

utilizzo

root@kitploit:~
./exploit.py --url http://localhost:8080 --file /etc/hostname
./exploit.py --url http://localhost:8080 --file /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

Lo script cicla su tutte le forme di bypass verificate (segmenti encodati, slash finale, .json; endpoint commits + files, POST e PUT) e classifica ogni risposta così puoi capire dove nella catena è morta una probe. Solo su target autorizzati, ovviamente.

difetti / limitazioni / pre-condizioni

  • L'echo scatta solo se il file contiene un % non seguito da due caratteri hex.
  • La regex di leak è greedy ((.*) fino all'ultima ) nel body). Va bene contro l'errore JSON standard, sovra-catturerà se qualcosa davanti avvolge la risposta in HTML. La correzione corretta è parsare il campo message del JSON.
  • L'API commits necessita di un project id leggibile anonimamente (altrimenti il blocco before restituisce 404).

riferimenti

  • commit di fix (master): https://gitlab.com/gitlab-org/gitlab/-/commit/0d9ce3e758a85f0690be751e213625f7902c0361
  • note di rilascio della patch: https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-3-2-released/
  • writeup: https://securityonline.info/gitlab-vulnerabilities-cve-2026-85706-cvss-10/
Scarica lo strumento