Как уже писал в апдейте к посту про баг в HNAP DIR-890L, его нашли в начале года, в DIR-645, и выпустили патч. Сейчас D-Link выпустил патч и для DIR-890L.
Патчи для DIR-645 и DIR-890L одинаковые, поэтому я буду писать только про DIR-890L.
Хоть в предыдущем посте я рассматривал только выполнение команд, патч указывает на несколько дыр в безопасности, которые появились из-за использования strstr
для валидации HNAP-заголовка SOAPAction
:
- Использование неутентифицированных пользовательских данных в вызове
system
- Использование неутентифицированных пользовательских данных в вызове
sprintf
- Неаутентифицированные пользователи могут выполнять привилегированные HNAP-запросы (такие, как смена пароля администратора)
Видите, D-Link признала все это в информации об уязвимости, и они ясно представляли все векторы атаки.
Итак, убрали ли они переполнение стека sprintf
?
sprintf(cmd_buf, “sh %s%s.sh > /dev/console”, “/var/run”, SOAPAction);
Убрали ли они вызов system
?
system(cmd_buf);
Конечно нет!
Используют ли они strcmp
вместо strstr
для валидации заголовка SOAPAction
?
if(strstr(SOAPAction, “http://purenetworks.com/HNAP1/GetDeviceSettings”) != NULL)
Пфф, че заморачиваться-то?
Все их решение этих фундаментальных проблем сводится к использованию функции access
для проверки того, что в SOAPAction
допустимое, ожидаемое значение, путем проверки существования файла /etc/templates/hnap/<SOAPAction>.php
:
Вызов sprintf(), затем сразу access()
Ага, это хотя бы защитит от внедрения произвольных данных в sprintf
и system
Однако, они добавили еще один sprintf
до access
; их патч для закрытия неаутентифицированного переполнения стека в sprintf
добавляет еще одно неаутентифицированное переполнение стека в sprintf
.
А вот еще один неожиданный поворот: этот патч не делает ничего для того, чтобы запретить выполнение допустимых административных запросов HNAP, т.к. он только проверяет, допустим ли запрос. Все верно, их патч не закрывает все уязвимости, о которых они писали в информации об уязвимости!
Думаю, никому нет дела до того, что любой неаутентифицированный пользователь может получить информацию о хостах во внутренней сети, просматривать и изменять системные настройки или сбросить роутер на заводские настройки:
$ wget --header="SOAPAction: http://purenetworks.com/HNAP1/GetDeviceSettings/SetFactoryDefault" http://192.168.0.1/HNAP1
Оставайся таким же классным, D-Link.
ссылка на оригинал статьи http://habrahabr.ru/post/256777/
Добавить комментарий