Этот репозиторий содержит доказательство концепции использования уязвимости в TeamViewer, которая позволяет непривилегированному пользователю загружать в систему произвольный драйвер ядра. Я хотел бы поблагодарить Zero Day Initiative за координацию с ними по сообщению и ответственному раскрытию уязвимости.
Подробности об исследованиях, завершившихся этими уязвимостями, можно найти в следующей серии статей в моем блоге, состоящей из трех частей. Они описывают эти уязвимости более подробно, а также показывают, где я потерпел неудачу в процессе. Третья часть самая веселая :P.
Видео эксплойта можно найти здесь:
После того, как удалось подделать (просто простая аутентификация, как подробно описано в блоге) действительный клиент TeamViewer при подключении к IPC службы СИСТЕМЫ, стало возможным запустить произвольную установку драйвера. TeamViewer не проверял подпись устанавливаемого драйвера.
Таким образом, повышение привилегий USER до KERNEL стало возможным благодаря TeamViewer.
Один из лучших подходов — использовать хорошо известную технику BYOD (Bring Your Own Vulnerable Driver), чтобы загрузить действительный подписанный драйвер в ядро Windows, а затем использовать его для выполнения привилегированных действий на уровне пользователя, таких как изменение токена произвольного процесс с привилегированным.
Когда TeamViewer установлен в системе, он создает службу, которая запускается как СИСТЕМА, TeamViewer_service.exe.
Данная услуга является помощником клиента в решении некоторых задач. Таким образом, клиент не запускается с повышенными привилегиями, а некоторые задачи делегируются службе.
Связь со службой (IPC) реализуется через сокеты (с использованием Overlapped I/O и IoCompletionPort ). По умолчанию системные службы TeamViewer прослушивают 5939/tcp на локальном хосте.
TeamViewer не фильтрует параметр, отправленный клиентом для запроса установки драйвера, проверки подписи и т. д.
Итак, идея такова: мы подделаем ТВ-клиент, который запросит установку VPN-драйвера , но укажет другой INF. Я повторно использовал тот же исходный INF-файл TeamViewer, но по другому (непривилегированному) пути, переименовав «плохой» драйвер в teamviewervpn.sys , поскольку это имя драйвера, на которое нацелен исходный INF.
Это также обходит опцию TeamViewer . Для изменения требуются права администратора на этом компьютере .
Эта проверка эффективна только через графический интерфейс, поскольку параметры TeamViewer отключаются при нажатии кнопки непривилегированным пользователем. Но можно подключиться к сокету и выполнить произвольную загрузку драйвера.
Эксплойт зависит от версии, поскольку в сообщении IPC клиент указывает свой PID и другие данные среди версии. Версия клиента должна совпадать с версией службы СИСТЕМА. Эксплойт необходимо изменить (строки 140–143) в файле Main.cpp до целевой версии TeamViewer_service.exe.
Итак, по сути, мы подделываем клиент TeamViewer, подключающийся к СИСТЕМНОЙ службе, и запрашиваем установку произвольного драйвера. Служба TeamViewer любезно загрузит его в ядро.
TeamViewer имеет еще одно сообщение IPC, очень похожее на первое, которое я обнаружил первым (выбрасывается при нажатии кнопки «Установить драйвер VPN» ). Другое сообщение предназначено для установки драйвера принтера .
Таким образом, по сути, CVE-2024-7479 и CVE-2024-7481 одинаковы, но TeamViewer дважды допустил одну и ту же ошибку. Послание хоть и разное, но очень похожее. У них разные идентификаторы метода IPC.
Результат тот же, можно загрузить произвольный драйвер.