В HTTP-сервере muhttpd, применяемом преимущественно в маршрутизаторах и точках доступа, выявлена уязвимость (CVE-2022-31793), позволяющая неаутентифицированному атакующему через отправку специально оформленного HTTP-запроса загрузить произвольные файлы, насколько это позволяют права доступа, под которыми выполняется HTTP-сервер (во многих устройствах muhttpd запускается с правами root). Например, атакующий может получить доступа к файлам с паролями, настройками беспроводного доступа, параметрами подключения к провайдеру и закрытыми ключами.
Проблема вызвана ошибкой при обработке пути в запросе, что позволяет обратиться к файлам, вне корневного каталога web-сервера. Атака сводится к указанию вначале пути любого дополнительного символа, отличного от точки, слеша и вопроса. Например, для загрузки файла /etc/hosts достаточно отправить запрос “GET a/etc/hosts” или “GET a/etc/hosts” (printf “GET b/etc/hostsnn” | nc server port).
Причина указанного поведения в том, что открытие запрошенного файла производится командой “open(&req->filename[1], O_RDONLY)” с предварительным выполнением функции chdir() для перехода в корень web-сервера. Указание &req->filename[1] приводит к игнорированию первого символа пути (разработчики подразумевали, что первый символ всегда “/”). Таким образом, при запросе “GET /etc/hosts” сервер попытается открыть файл по относительному пути “etc/hosts”, но если указать вначале любой дополнительный символ (“GET a/etc/hosts”) – последующий путь будет обработан полностью.
Проблема присутствует начиная с самой первой версии muhttpd и устранена в выпуске 1.1.7. Из устройств, использующих muhttpd, наличие проблемы подтверждено в
маршрутизаторах SaskTel и Arris. Потенциально проблема также может проявляться в устройствах, выпускаемых компаниями AT&T, Frontier и Windstream. При ограничении доступа к порту HTTP только для внутренней сети атака может быть совершена из внешней сети при помощи техники “DNS rebinding”, позволяющую при открытии пользователем определённой страницы в браузере отправить HTTP-запрос на сетевой порт, недоступный для прямого обращения через интернет.