加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

为什么在内核模式下调用ZwCreateKey似乎绕过Windows安全?

发布时间:2020-12-14 03:57:54 所属栏目:Windows 来源:网络整理
导读:我与之合作的团队最近面临着使我们的软件与第三方虚拟化软件兼容的挑战.该软件使用内核驱动程序来执行 Windows本机注册表API(ZwCreateKey等)的挂钩.它通过挂钩Ntdll中的调用来工作.我们的软件也相当低级,在某些情况下需要访问真实的注册表而不会被钩住. 我们
我与之合作的团队最近面临着使我们的软件与第三方虚拟化软件兼容的挑战.该软件使用内核驱动程序来执行 Windows本机注册表API(ZwCreateKey等)的挂钩.它通过挂钩Ntdll中的调用来工作.我们的软件也相当低级,在某些情况下需要访问真实的注册表而不会被钩住.

我们正在探索使用我们自己的内核驱动程序调用ZwCreateKey等的可能性,代表我们绕过他们的钩子.这实际上意味着创建一个NT Legacy驱动程序和一个用户模式库,它提供我们自己的本机注册表功能.库和驱动程序非常简单,我们只需使用IOCTL将ZwCreateKey的所有参数传递给我们的驱动程序,然后调用内核版本的调用并返回结果.

该方法运行良好,我们现在似乎在虚拟化时具有读/写真实注册表的系统.唯一的问题是我们的新系统似乎在注册表对象上传播Windows安全性.

ZwCreateKey采用如下访问掩码:

NTSTATUS ZwCreateKey(
  __out       PHANDLE KeyHandle,__in        ACCESS_MASK DesiredAccess,__in        POBJECT_ATTRIBUTES ObjectAttributes,__reserved  ULONG TitleIndex,__in_opt    PUNICODE_STRING Class,__in        ULONG CreateOptions,__out_opt   PULONG Disposition
);

我的理解是,虽然我们现在在内核模式下运行,但我们仍然拥有用户令牌的上下文.这应该意味着ZwCreateKey的内核版本将失败,就像访问掩码测试失败时的用户一样.实际发生的是,即使使用有限的令牌,当我们的驱动程序被调用时,它也能够在受限用户调用时在受限制的部分HKLM中创建密钥.是什么赋予了?我们应该自己进行ACL检查吗?我们是否需要做一些事情来限制我们在内核模式下的权限?任何帮助非常感谢.

解决方法

检查 this以获得解释.用户模式(ntdll)中的Nt / Zw基本相同 – 它们在实际执行操作之前首先执行大量检查.从内核模式调用Zw函数时(如设备驱动程序的情况),省略那些检查,因为假设默认情况下信任来自内核模式组件(例如驱动程序)的信息

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读