
TeamViewer: PoC повышения привилегий от пользователя до ядра. CVE-2024-7479 и CVE-2024-7481. ZDI-24-1289 и ZDI-24-1290. TV-2024-1006.
Этот репозиторий содержит доказательство концепции эксплуатации уязвимости в TeamViewer, которая позволяет непривилегированному пользователю загрузить произвольный драйвер ядра в систему. Я хотел бы поблагодарить Zero Day Initiative за координацию со мной при ответственном раскрытии уязвимости.

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