tags: windows - kernel
Windows10 - Custom Kernel Signers
1. Что такое Custom Kernel Signers?
Мы знаем, что в Windows10 есть строгие требования к драйверу режима ядра. Одним из требований является то, что драйверы должны быть подписаны EV сертификатом, которому доверяет Microsoft. Более того, начиная с выпуска 1607, новые драйверы надо загружать на Windows Hardware Portal для получения подписи от Microsoft. Даже если драйвер использует самоподписанный сертификат, без включения режима TestSigning, Windows10 все равно отказывается его загружать, даже если сертификат был установлен в Windows Certificate Store (certlm.msc или certmgr.msc). Это означает, что в Windows10 есть независимое хранилище сертификатов для драйвера режима ядра.
Custom Kernel Signers(CKS) - это политика, поддерживаемая Windows10 (возможно, начиная с выпуска 1703). Полное название политики - CodeIntegrity-AllowConfigurablePolicy-CustomKernelSigners. Она позволяет пользователям решать, каким сертификатам в ядре доверять, а каким нет. Кстати, эта политика может потребовать включения другой политики - CodeIntegrity-AllowConfigurablePolicy.
Обычно CKS отключается по умолчанию во всех редакциях Windows10, кроме Windows10 China Government Edition.
Если ПК с Windows10 удовлетворяет следующим условиям:
-
Включена политика
CodeIntegrity-AllowConfigurablePolicy-CustomKernelSigners. (ВозможноCodeIntegrity-AllowConfigurablePolicyтакже необходима). -
Включена функция SecureBoot.
если у пользователя есть UEFI Platform Key, то можно добавить сертификат в хранилище сертификатов ядра, для запуска любого драйвера, подписанного сертификатом на этом ПК.
Если вы заинтересованы в других политиках, то можете поискать тут.
2. Как включить данную опцию?
2.1 Требования
-
У вас должны быть права администратора.
-
Вам временно необходима Windows10 версии Enterprise или Education.
Почему? Потому что вам надо выполнить команду
ConvertFrom-CIPolicyв Powershell, которую нельзя выполнить в других версиях Windows 10. -
Вы можете устанавливать UEFI Platform Key.
2.2 Создание сертификатов и установка Platform Key(PK)
Пожалуйста, проследуйте этой инструкции, чтобы создать сертификаты. После этого вы получите следующие файлы:
// самоподписанный корневой сертификат удостоверяющего центра
localhost-root-ca.der
localhost-root-ca.pfx
// сертификат уровня ядра, выпущенный самоподписанным корневым сертификатом удостоверяющего центра
localhost-km.der
localhost-km.pfx
// сертификат UEFI Platform Key, выпущенный самоподписанным корневым сертификатом удостоверяющего центра
localhost-pk.der
localhost-pk.pfx
Установку Platform Key в UEFI вам придется сделать самим, так как разные UEFI требуют разных действий. Здесь я вам покажу, как это делать в VMware.
2.2.1 Установка PK в VMware
Если имя вашей виртуальной машины VMware - TestVM и у нее есть SecureBoot, то в ее папке будет два файла: TestVM.nvram и TestVM.vmx. Вы можете установить PK следующим образом:
-
Выключите виртуальную машину.
-
Удалите
TestVM.nvram. Это сбросит настройки UEFI виртуальной машины, при следующем запуске. -
Откройте
TestVM.vmxтекстовым редактором и добавьте в конец следующие две строки:uefi.allowAuthBypass = "TRUE" uefi.secureBoot.PKDefault.file0 = "localhost-pk.der"Первая строка позволяет вам управлять ключами SecureBoot в UEFI.
Вторая строка делает файл
localhost-pk.der, в папке виртуальной машины, стандартным UEFI PK. Еслиlocalhost-pk.derнаходится вне папки виртуальной машины, то укажите полный путь.
Теперь запустите TestVM и ваш PK будет установлен.
2.3 Создание правил сертификата подписи кода уровня ядра
Запустите Powershell от имени администратора в Windows10 версии Enterprise/Education.
-
Выполните
New-CIPolicyдля создания новой CI (Code Integrity - Целостность Кода) политики. Убедитесь, что ОС не заражена вредоносными программами.New-CIPolicy -FilePath SiPolicy.xml -Level RootCertificate -ScanPath C:\windows\System32\Данная команда просканирует всю папку
System32и займет некоторое время. Если вы не хотите запускать процесс сканирования, вы можете использовать мой готовый файл SiPolicy.xml. -
Выполните
Add-SignerRuleдля добавления нашего сертификата подписи кода уровня ядра вSiPolicy.xml.Add-SignerRule -FilePath .\SiPolicy.xml -CertificatePath .\localhost-km.der -Kernel -
Выполните
ConvertFrom-CIPolicyдля сериализацииSiPolicy.xmlи получения бинарного файлаSiPolicy.binConvertFrom-CIPolicy -XmlFilePath .\SiPolicy.xml -BinaryFilePath .\SiPolicy.bin
На данном этапе, наши правила созданы. Сгенерированный файл можно использовать в любых версиях Windows 10, как только он будет подписан PK сертификатом. С этого момента, нам больше не требуется Windows 10 версии Enterprise/Education.
2.4 Правила политики подписания и применение политик
-
Для подписи
SiPolicy.bin, мы должны использовать PK сертификат. Если у вас есть Windows SDK, вы можете подписать его, используяsigntool.signtool sign /fd sha256 /p7co 1.3.6.1.4.1.311.79.1 /p7 . /f .\localhost-pk.pfx /p <password of localhost-pk.pfx> SiPolicy.binПожалуйста, пропишите пароль от вашего
localhost-pk.pfxв<password of localhost-pk.pfx>.После этого вы получите файл
SiPolicy.bin.p7в текущей директории. -
Переименуйте
SiPolicy.bin.p7вSiPolicy.p7bи скопируйтеSiPolicy.p7bвEFI\Microsoft\Boot\# run powershell as administrator mv .\SiPolicy.bin.p7 .\SiPolicy.p7b mountvol x: /s cp .\SiPolicy.p7b X:\EFI\Microsoft\Boot\
2.5 Включение CustomKernelSigners
Переменная, отвечающая за состояние CKS, хранится в значении ProductPolicy, чей ключ - HKLM\SYSTEM\CurrentControlSet\Control\ProductOptions.
Хотя администраторы могут изменять это значение, оно будет сброшено сразу же после изменения. Это происходит потому, что это значение является просто отображением переменной в ядре после того, как ядро инициализировано. Единственный способ изменить переменную - это вызвать ExUpdateLicenseData. Однако, этот API может быть вызван только в режиме ядра или косвенно путем вызова NtQuerySystemInformation, с помощью SystemPolicyInformation. К сожалению, последний способ успешно работает только тогда, когда вызов делает защищенный процесс.
Таким образом, мы можем модифицировать значение только тогда, когда ядро не завершило инициализацию. Есть ли у нас шанс? Да, в этом нам поможет Windows Setup Mode.
Я написал программу, которая облегчит включение CKS. Код находится в папке EnableCustomKernelSigners, а саму программу EnableCKS.exe можно скачать здесь. Конечно, вы можете написать такую программу сами.
Два раза кликните на EnableCKS.exe и вы увидите
[+] Succeeded to open "HKLM\SYSTEM\Setup".
[+] Succeeded to set "CmdLine" value.
[+] Succeeded to set "SetupType" value.
Reboot is required. Are you ready to reboot? [y/N]
Введите y для перезагрузки. Система войдет в Setup Mode. EnableCKS.exe запустится автоматически и включит следующие две политики
CodeIntegrity-AllowConfigurablePolicy
CodeIntegrity-AllowConfigurablePolicy-CustomKernelSigners
По окончанию работы, система перезагрузится еще раз и вернется в нормальный режим работы.
2.6 Постоянный CustomKernelSigners
Теперь Вы сможете загружать драйвера, подписанные с помощью localhost-km.pfx. Но подождите минутку. В течение 10 минут, CKS будет сброшен до выключенного состояния, с помощью sppsvc, за исключением случаев, когда у вас стоит Windows10 China Government Edition. Не волнуйтесь, сброс вступает в силу только при следующем запуске системы.
Поэтому мы должны загрузить драйвер для непрерывного вызова ExUpdateLicenseData, чтобы сохранить CKS. Я собрал драйвер с именем ckspdrv.sys, который можно скачать [на этой странице]](https://github.com/HyperSine/Windows10-CustomKernelSigners/releases). Код находится в папке CustomKernelSignersPersistent.
ckspdrv.sys не подписан. Вы должны подписать его, с помощью localhost-km.pfx, чтобы его можно было загрузить в ядро.
signtool sign /fd sha256 /ac .\localhost-root-ca.der /f .\localhost-km.pfx /p <password of localhost-km.pfx> /tr http://sha256timestamp.ws.symantec.com/sha256/timestamp ckspdrv.sys
Пожалуйста пропишите пароль в <password of localhost-km.pfx> от вашего localhost-km.pfx.
Затем скопируйте ckspdrv.sys в c:\windows\system32\drivers и запустите cmd от имени администратора:
sc create ckspdrv binpath=%windir%\system32\drivers\ckspdrv.sys type=kernel start=auto error=normal
sc start ckspdrv
Если все сделали правильно, ckspdrv.sys будет успешно добавлен, что также подтверждает, что наша политика применилась правильно.
Теперь вы можете загрузить любой драйвер, подписанный localhost-km.pfx. Развлекайтесь и наслаждайтесь~
