Для одной повседневной задачи мне понадобилось дать весь доступ любому процессу к созданному мной объекту ядра. Самый простой способ это сделать - повесить на этот объект security descriptor, у которого будет отсутствовать DACL. О таком поведении, в частности, написано в описании функции RtlSetDaclSecurityDescriptor(...):
Сказано-сделано. Но начались жалобы с машин Windows 8/8.1/10. При расследовании оказалось, что некоторые процессы не могут получить доступ к объектам ядра, на который назначен security descriptor без DACL'а. Первый процесс, на котором мне удалось воспроизвести это поведение - Metro-версия IE. После трассировки не-экспортируемой функции nt!SepAccessCheck выяснилось, что в ветке, где проверяется отсутствие DACL'а у security descriptor'а, появился новое условие: если у токена во флагах (nt!_TOKEN::TokenFlags) есть флаг TOKEN_LOWBOX (0x4000), то безусловно возвращается STATUS_ACCESS_DENIED. Процессы с флагом TOKEN_LOWBOX так же называются AppContainer и используются как новый механизм изоляции, в том числе для IE.
Как мотивировано изменение логики применения security descriptor'ов без DACL'а я не нашел. Как не нашел и упоминания изменения самой логики, что и послужило причиной написания это небольшой заметки.
ΞρεΤΙκ