Windows操作系统----安全机制----对象

这篇博客深入探讨了Windows操作系统中的对象结构,包括对象头部的字段如HandleCount、Owner和Group,以及安全描述符的组成部分。重点讨论了对象类型的安全性,尤其是如何通过对象头部的TypeIndex防止类型混淆攻击,并介绍了Windows10为缓解这种威胁所采取的保护措施。此外,提到了对象目录对于命名对象的重要性。
摘要由CSDN通过智能技术生成

对象结构

对象是对操作系统中需要保护和集中管理的资源的一种抽象,对象拥有统一的固定头部,保存着抽象出来的信息。此外还有可选头部和对象体。

nt!_OBJECT_HEADER
   +0x000 PointerCount     : Int8B
   +0x008 HandleCount      : Int8B
   +0x008 NextToFree       : Ptr64 Void
   +0x010 Lock             : _EX_PUSH_LOCK
   +0x018 TypeIndex        : UChar
   +0x019 TraceFlags       : UChar
   +0x019 DbgRefTrace      : Pos 0, 1 Bit
   +0x019 DbgTracePermanent : Pos 1, 1 Bit
   +0x01a InfoMask         : UChar
   +0x01b Flags            : UChar
   +0x01b NewObject        : Pos 0, 1 Bit
   +0x01b KernelObject     : Pos 1, 1 Bit
   +0x01b KernelOnlyAccess : Pos 2, 1 Bit
   +0x01b ExclusiveObject  : Pos 3, 1 Bit
   +0x01b PermanentObject  : Pos 4, 1 Bit
   +0x01b DefaultSecurityQuota : Pos 5, 1 Bit
   +0x01b SingleHandleEntry : Pos 6, 1 Bit
   +0x01b DeletedInline    : Pos 7, 1 Bit
   +0x01c Spare            : Uint4B
   +0x020 ObjectCreateInfo : Ptr64 _OBJECT_CREATE_INFORMATION
   +0x020 QuotaBlockCharged : Ptr64 Void
   +0x028 SecurityDescriptor : Ptr64 Void
   +0x030 Body             : _QUAD

 

对象的头部包含着指向安全描述符的指针。

安全描述符

安全描述符保存着作为访问权限检查客体的对象的主要信息。它包含着4个关键成员,根据这4个成员可以嵌入在结构体的尾部,也可以引用自外部缓存位置。根据这个差异可以分为两种不同的结构形式:

kd> dt _SECURITY_DESCRIPTOR
ntdll!_SECURITY_DESCRIPTOR
   +0x000 Revision         : UChar
   +0x001 Sbz1             : UChar
   +0x002 Control          : Uint2B
   +0x008 Owner            : Ptr64 Void
   +0x010 Group            : Ptr64 Void
   +0x018 Sacl             : Ptr64 _ACL
   +0x020 Dacl             : Ptr64 _ACL
kd> dt _SECURITY_DESCRIPTOR_RELATIVE
nt!_SECURITY_DESCRIPTOR_RELATIVE
   +0x000 Revision         : UChar
   +0x001 Sbz1             : UChar
   +0x002 Control          : Uint2B
   +0x004 Owner            : Uint4B
   +0x008 Group            : Uint4B
   +0x00c Sacl             : Uint4B
   +0x010 Dacl             : Uint4B

Owner和Group代表了该安全描述符的属主Sid,Sacl是系统访问控制表(System Access Control List)的简称,里面可以包含当前对象的审计(Audit)、完整性级别(Integrity Level)以及可信赖级别(Trust Level)等信息,与前面提到的Dacl共用同一结构体。

对象目录

只有部分对象拥有名称信息,它们被称为命名对象。命名对象的主要作用是方便对象在不同的进程中共享,它们被按类别编纂成对象目录,因此可以通过在对象目录中的路径信息找到该对象。对象目录的实现如下图所示:

 

对象类型

对象类型是对象中非常重要的信息,Windows将对象的类型信息从同一类对象中抽象出来,保存成一个单独的类型对象。系统中全部的类型对象被集中放置在一个表中,对象通过维护一个指向该表的索引(TypeIndex)来表明当前对象的类型。这个索引值直接保存在对象的头部,而对象体与对象头部直接相邻,如果对象体被损坏,有可能导致头部的索引值被改变,使所谓的类型混淆(Type Confusion)利用成为可能。为了缓解这一问题,Windows 10对该索引值做了特殊保护,如下图所示:

这种保护方式简单而强大,新的索引值由3部分经过异或操作得到:类型对象在类型对象表中的真实索引值,对象头部地址的第二个字节(即第8到第15位),保存在ObHeaderCookie全局变量中的因每次系统启动而异的Cookie字节。其中,ObHeaderCookie的引入,使同一类型的对象在不同机器上,甚至是同一机器上两次启动之间的索引值不同,然而这样并不足以缓解类型混淆利用,我们还可以利用信息泄露(Info Leak)来绕过(Bypass)该保护,因此还引入了对象头部地址,使得在同一时刻、同一系统中的两个相同类型对象的不同实例间的索引值也不相同,从而有效地缓解类型混淆利用。 

欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值