Местная привилегия эскалационная эксплуатация для драйвера ядра CPU-Z.
Приложение CPU-Z установит уязвимый подписанный драйвер для доступа к данным ядра из Usermode. Перед V1.81 драйвер CPU-Z выявил три IOCTL, которые позволяют любому приложению USERMODE считывать регистры управления, читать DWORDS из физической памяти и записывать DWORDS в физическую память. Мы злоупотребляем этой функцией, чтобы получить полное выполнение кода кода ядра и создавать системную оболочку в качестве доказательства концепции.
Этот эксплойт поддерживает Windows XP - Windows 10 1607:
Этот эксплойт был протестирован в следующих системах с CPU-Z v1.76:
* В Windows 1703 и более позднем этапе управления ядрами (CFG) включена по умолчанию [1], что приводит к проверке ошибки kernel_security_check_failure.
Чтобы запустить этот эксплойт, запустите приложение CPU-Z и запустите exploit.exe из командной строки в качестве обычного пользователя. В случае успеха он должен породить новый процесс cmd.exe, работающий как система. Обратите внимание, что этот эксплойт потерпит неудачу в случае запуска из процесса с низкой интеграцией из-за использования Ntquerysysteminformation.
Драйвер ядра CPU-Z до v1.81 позволяет любому приложению USERMODE считывать регистры управления, читать DWORDS из физической памяти и записывать DWORDS в физическую память. Мы злоупотребляем этой функцией, чтобы прочитать CR3 и пересекать таблицы страниц, чтобы создать произвольный примитив для чтения/записи во всем пространстве виртуальной памяти.
При полном чтении/записи мы переворачиваем бит пользователя/супервизора в запись в таблице страниц (PTE), содержащую нашу полезную нагрузку в профилактику выполнения режима Supervisor Supervisor (SMEP). Затем мы перезаписываем указатель функции в NT! Haldispatchtable [1] и запускаем полезную нагрузку, позвонив в NtqueryIntervalProfile.
В качестве доказательства концепции, полезная нагрузка назначит системный токен для приостановленного процесса cmd.exe и возобновить процесс. Это должно привести к тому, что новая командная строка будет работать в качестве Outhory/System. Полезная нагрузка не полагается на статические смещения и, таким образом, должна работать на Windows XP+.
За последние два года был введен ряд смягчения, которые ограничивают эффективность этого эксплойта. Краткое описание ниже.
Начиная с версии 1.81, драйвер, предоставленный CPU-Z, был исправлен для ограничения набора вызывающих абонентов, которые могут открыть объект его устройства, и некоторые реализации IOCTL были удалены. По запросам открыть объект устройства драйвера, он проверит, включен ли текущий процесс seloaddriverprivilege. Если на этом привилевании отсутствует или отключена, драйвер отклонит запрос с помощью status_access_denied. Обратите внимание, что при запуске в качестве администратора тривиально включить эту привилегию от Usermode. Кроме того, IOCTL для чтения регистров управления были удалены (хотя реализации чтения/записи физической памяти остаются). Без возможности читать базу таблицы страниц из CR3 метод эксплуатации в этом проекте больше не осуществим. Обратите внимание, что драйвер CPU-Z предоставляет множество других IOCTL, которые можно использовать для эксплуатации, таких как чтение и написание в произвольных реестрах специфичных для модели.
По состоянию на Windows 10 1703 (обновление Creators), защита потока управления ядрами включена по умолчанию на x86_64. Вызовы через Haldispatchtable приведут к проверке ошибок kernel_security_check_failure, так как он защищен CFG. Если безопасность на основе виртуализации (VBS) не включена, следует добавить полезную нагрузку в качестве действительной цели вызова для обхода CFG.
Если безопасность на основе виртуализации (VBS) включена, она убьет большую часть этого эксплойта. Манипуляция PTE, используемая для отключения панели, больше не будет возможна, так как PTE будут защищены гипервизором. Кроме того, на x86_64 потребуется обход CFG, чтобы получить выполнение кода через Haldispatchtable, так как растровый карта ядра CFG не будет подлежит записи.
Уязвимости, используемые в этом эксплойте, подробно описаны в CVE-2017-15302 и CVE-2017-15303. Другое доказательство концепции можно посмотреть на CPUZ-DSEFIX [5].
[1] https://community.osr.com/discussion/283374/control-flow-guard-question
[2] https://www.cedetails.com/cve/cve-2017-15302/
[3] https://www.cedetails.com/cve/cve-2017-15303/
[4] https://github.com/akayn/bugs/blob/master/cpuid/cve-2017-15302/readme.md
[5] https://github.com/samlarenn/cpuz-dsefix
Кроме того, метод перезаписи Haldispatchtable, используемый в этом эксплойте, является широко используемым вектором для получения выполнения кода из примитива чтения/записи ядра. Для получения дополнительной информации об этой технике см. В приведенном ниже ресурсах.
[6] http://poppoppret.blogspot.com/2011/07/windows-kernel-exploitation-basics-part.html
[7] https://www.abatchy.com/2018/01/kernel-exploitation-7
[8] https://osandamalith.com/2017/06/14/windows-kernel-exploitation-arbitrary-overwrite/
[9] https://rootkits.xyz/blog/2017/09/kernel-write-what-where/