Уязвимость в HTTP-сервере muhttpd, открываяющая доступ к файлам вне рабочего каталога

В 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-запрос на сетевой порт, недоступный для прямого обращения через интернет.

Источник: http://www.opennet.ru/opennews/art.shtml?num=57601