Относительно недавно на хабре появилась статья «Стилер паролей в антивирусном ПО Avira Free Antivirus» от пользователя Veliant. Автор обнаружил, что в стандартной поставке упомянутого антивируса присутствует компонент, который позволяет простым образом извлечь пароли из хранилища браузера Chrome.
В комментариях произошла дискуссия, можно ли считать это уязвимостью. Но меня зацепил один комментарий автора:
нельзя ли это было реализовать например в виде DLL, которая при вызове её API проверяла бы цифровую подпись вызывающей программы?
Дело в том, что буквально перед этим я исследовал несколько программ, которые точно так же полагались на проверку цифровой подписи. И такую проверку было очень легко обойти.
Цифровая подпись файла соответствует только самому исполняемому файлу, но работающая программа это не только исполняемый файл. Существует несколько способов повлиять на работу программы, не меняя исполняемый файл: можно подменить библиотеки, которые загружаются или сделать инъекцию кода прямо в памяти.
Я посмотрел на профиль автора: «Работает в: Доктор Веб». А что если посмотреть, не используется ли в продуктах этой компании проверка, о которой говорит автор? Я решил посмотреть и, спойлер, нашел уязвимость, которая позволяет повысить свои привилегии до системных пользователю Dr.Web Security Space для Windows.
Разведка
Я не разбираюсь в продуктах Доктор Веб, поэтому взял первое попавшееся, что можно было скачать на сайте — это был Dr.Web Security Space 12 для Windows. При настройках по-умолчанию данный продукт проводит проверку обновлений каждые полчаса. И в механизме обновления была обнаружена уязвимость.
Ниже я предлагаю видео эксплуатации с описанием того, что происходит на видео с привязкой ко времени. Там же будет описание, в чем же конкретно состояла уязвимость.
Видео эксплуатации
Демонстрация проходит на ОС Windows 10 x64 от пользователя без прав администратора.
0:00-0:12 через консоль Windows показываю, что текущий пользователь не является администратором
0:12-0:24 показываю установленную версию Dr.Web Security Space
0:24-0:29 в папке на рабочем столе находится файл drweb_eop_upd_dll.dll (исходные коды и файл приложены к тикету)
0:29-0:34 показываю, что в папке C:ProgramDataDoctor WebUpdateretc находится 3 файла
0:34-0:47 копирую библиотеку drweb_eop_upd_dll.dll в папке на рабочем столе и один экземпляр называю version.dll, другой — cryptui.dll
0:47-0:56 копирую файл C:Program FilesCommon FilesDoctor WebUpdaterdrwupsrv.exe в папку на рабочем столе, рядом с dll.
0:56-1:00 запускаю скопированный файл
Запускаемый файл drwupsrv.exe из папки на рабочем столе загружает расположенную рядом version.dll. Данная библиотека создает файл C:ProgramDataDoctor WebUpdateretcdrwupsrv.xml.new. На папку C:ProgramData и вглубь у пользователя есть права на создание файлов, поэтому это легальная операция. Если попробовать создать такой файл вручную, то, вероятно, защитные механизмы Dr.Web предотвращают такую операцию. Но в эксплуатации создание файла проходит от имени drwupsrv.exe, что вероятно обходит внутренние проверки и файл создается. Фактически, это обход той самой проверки подписи о которой и идет речь в начале статьи.
1:00-1:22 демонстрирую созданный файл и его содержимое. В общем смысле файл совпадает по содержимому с файлом C:ProgramDataDoctor WebUpdateretcdrwupsrv.xml, но все пути указывают папку на рабочем столе (C:UsersUserDesktopdwtest)
1:22-2:00 ничего не происходит (на этом этапе я ожидаю процесса обновления ПО, который по-умолчанию происходит раз в полчаса и ожидаемое время можно найти в логах)
2:00-2:14 судя по всему, взяв созданный файл конфигурации, обновлятор видит, что в папке C:UsersUserDesktopdwtest нет файлов ПО Dr.Web, начинает туда файлы ПО копировать.
Среди копируемых файлов есть файл dwservice.exe, который запускается в момент обновления от имени пользователя NT AUTHORITYSYSTEM. Данный файл загружает в себя библиотеку cryptui.dll, которая была в папке C:UsersUserDesktopdwtest. Код библиотеки просто запускает интерактивную консоль, которую и видно на экране. Командой whoami убеждаюсь, что получены права системы.
Итог
Отчет об уязвимости был отправлен в Доктор Веб и, вроде бы, разработчики все поправили.
Таймлайн:
15.05.2020 — Обращение в техподдержку с просьбой предоставить security-контакт.
20.05.2020 — Получаю ответ, что можно передать отчет в данном обращении
20.05.2020 — Передаю отчет
14.06.2020 — Получаю ответ, что для 12 версии уязвимость исправлена. Ожидают портирование для версии 11.
07.07.2020 — Разработчики подтверждают, что исправления выпущены.
Автор: Кравец Василий