50H属性结构

50H类型属性即$SECURITY_DESCRIPTOR属性,也就是安全描述符,主要用于保护文件以防止没有授权的访问,但Windows 2000/XP中已将安全描述符存放在$Secure元数据中,以便于共享(早期的NTFS将其与文件目录一起存放,不便于共享)。

安全描述属性的结构见表4-44。

表4-44 50H属性描述表

50H($SECURITY_DESCRIPTOR)属性分析-数据恢复迷

在一个标准属性头后是一个50H特有的属性头,其后跟一个或两个ACL(Access Control List,访问控制列表)和两个SID(Security Identifier,安全ID)。

ACL即访问控制列表,它赋予或拒绝特定用户或组访问某个对象的权限的对象安全描述符的组成部分。只有某个对象的所有者才可以更改ACL中赋予或拒绝的权限,这样,此对象的所有者就可以自由访问该对象。

SID即安全标识符,它是用来识别用户、组和计算机账户的不同长度的数据结构。在第一次创建该账户时,将给网络上的每一个账户发布一个唯一的SID。Windows中的内部进程将引用账户的SID而不是账户的用户名或组名。

第一个ACL(Access Control Entry)包括审核信息,即访问对象时要审核的组和用户账户,但也可能没有;第二个ACL包括权限,即授予的每个组或用户的权限的每个访问事件的成功或失败属性。

每一个ACL可能包括一个或多个ACE,ACE即访问控制项,它是授予用户或组权限的ACL中的一个项目。ACE也是对象的系统访问控制列表(SACL)中的项目,该列表指定用户或组要审核的安全事件,每一个ACE包括一个SID。

SACL是表示部分对象的安全描述符的列表,该安全描述符指定了每个用户或组的哪个事件将被审核。审核事件的例子是文件访问、登录尝试和系统关闭。

最后两个SID表示对象的所有者即用户和组。

为能防止对文件的未经授权的访问,安全描述必须存储文件所有者、文件所有者授予其他用户的访问许可、什么行为需要日志记录(审核)等信息。该属性没有最小最大长度要求。

50H属性中属性头的结构

50H类型属性中属性头的结构见表4-45。

表4-45 50H属性头描述表

字节偏移 字段长度(字节) 含义
0x00 1 头1(通常总是01)
0x01 1 头2(通常总是00)
0x02 1 头3(通常为0x04或0x14,前者表示无审计,后者表示有审计)
0x03 1 头4(通常总是80H)
0x04 4 用户SID的偏移
0x08 4 组SID的偏移
0x0C 4 ACL审核
0x10 4 ACL权限

50H属性中ACL的结构

ACL的结构见表4-46。

表4-46 ACL描述表

字节偏移 字段长度(字节) 含义
0x00 1 ACL版本
0x01 1 常为“00”,无意义
0x02 2 ACL长度
0x04 2 ACE合计
0x06 2 常为“00 00”,无意义

50H属性中ACE的结构

ACE的结构见表4-47。其中的标志包括3种情况,见表4-48。

表4-47 ACE描述表

字节偏移 字段长度(字节) 含义
0x00 1 类型
0x01 1 标志
0x02 2 大小
0x04 4 访问掩码
0x08 V SID

表4-48 ACE的标志

描述
0x00 访问允许
0x01 访问拒绝
0x02 系统审核

该标志可能的取值依赖于类型的值(偏移00H)。对于目录,其访问允许和访问拒绝有表4-49所列标志。

表4-49 目录的ACE标志描述

描述
0x01 对象继承的ACE
0x02 容器继承的ACE
0x04 不传播继承的ACE'
0x08 只继承ACE

如果是系统审核,标志则可能是表4-50中的情况。

表4-50 系统审核的ACL标志描述

描述
0x40 审核成功
0x80 审核失败

32位访问掩码即访问权限用于列举所有的允许及不允许的行为,其含义见表4-51。

表4-51 ACL访问掩码

位偏移 含义 描述
0~15 对象特殊访问权限 读数据、执行、添加数据
16~22 标准访问权限 删除、修改ACL、修改所有者
23 可以访问ACL
24~27 保留
28 所有(读、写、执行) 所有事情
29 执行 执行程序所需的所有权力
30 写文件所需的所有权力
31 读文件所需的所有权力

50H属性中SID的结构

典型的SID形如:S-1-5-21-646518322-1873620750-619646970-1110,由'S-p-q-r-s-t-u-v'组成,其意义见表4-52。

表4-52 SID的结构

S 安全
p 版本号(目前为1)
q NT域,该数值占6个字节
r~v NT子域(可能有几个这样的子域)

SID在磁盘上的存储形式如:S-1-5-21-646518322-1873620750-619646970-1110,用十六进制表示就是S-1-5-15-26891632-6fad2f0e-24ef0ffa-456(5个子域),其在磁盘上的存储见表4-53。

表4-53 SID在磁盘上的存储

50H($SECURITY_DESCRIPTOR)属性分析-数据恢复迷

但要注意的是这是一个可变长度的结构,它可能长一些,或短一些,子域会使结构变得大一些或小一些。

例如,在S-1-5-21-646518322-1873620750-619646970-1110这个SID中,“S”是SID简称,“1”为版本号,“5”为标识授权,“21”为子授权,“646518322”为SA(Security Association,安全协会),“1873620750”为SA的域ID,“619646970”也是SA,“1110”为用户ID。其中标识授权的含义见表4-54。

表4-54 安全标识的组成部分

标识授权 缩写
无效SID S-1-0
全球SID S-1-1
本地SID S-1-2
创建者SID S-1-3
非唯一SID S-1-4
NT SID S-1-5

子授权中的R表示相关ID(Relative Identifiers),用以和标识授权一起组成知名SID,其含义见表4-55。

表4-55 相关ID

50H($SECURITY_DESCRIPTOR)属性分析-数据恢复迷

常见的知名域用户见表4-56。

表4-56 常见知名域用户

域用户 代码
Admin(管理员) 500
Guest(来宾) 501
Kerberos Target(安全验证用) 502

常见的知名域组见表4-57。常见的知名域别名见表4-58。

表4-57 常见知名域组

域组 代码
Admins(管理员组) 512
Users(用户组) 513
Guests(来宾组) 514
Computers(计算机组) 515
Controllers(控制员组) 516
Cert Admins(确定管理员组) 517
Schema Admins(计划管理员组) 518
Enterprise Admins(企业管理员组) 519
Policy Admins(策略管理员组) 520

表4-58 常见知名域别名

域别名 代码
Admins(管理员组) 544
Users(用户组) 545
Guests(来宾组) 546
Power Users(高级用户组) 547
Account Ops(账号操作) 548
System Ops(系统操作) 549
Print Ops(打印操作) 550
Backup Ops(备份操作) 551
Replicator(复制操作) 552
RAS Servers 553
Pre W2K Comp Access 554

安全描述符的控制标志见表4-59。

表4-59 SID的控制标志

标志 描述 标志 描述
0x0001 默认所有者 0x0200 SACL自动继承Req
0x0002 默认组 0x00400 DACL自动继承
0x0004 DACL存在 0x0800 SACL自动继承
0x0008 DACL默认值 0x1000 DACL保护
0x0010 SACL存在 0x2000 SACL保护
0x0020 SACL默认值 0x4000 RM控制有效
0x0100 DACL自动继承Req 0x8000 自相关标志

其中默认所有者是一个布尔标志,设置时表示通过默认机制由所有者域来指示SID,而不是采用由最初的安全描述符所显式指定的SID。它将对所有者继承的处理方式产生影响。默认组的设置同默认所有者一样。

DACL存在是一个布尔标志,设置时表示安全描述包含一个自由的ACL。如果设置了该位,而安全描述的DACL域为空,则将此空ACL列入清单。

DACL(任意访问控制列表)默认值是一个布尔标志,设置时表示通过默认机制由DACL域来指示ACL,而不是由最初的安全描述指定ACL。它将对ACL继承的处理方式产生影响。如果DACL存在没有设置,则忽略该标志。

SACL存在是一个布尔标志,设置时表示安全描述包含一个由SACL域指定的系统ACL。如果设置了该位,而安全描述的SACL域为空,则将此空ACL(但确实存在)列入清单。

SACL默认值是一个布尔标志,设置时表示通过默认机制由SACL域来指示ACL,而不是由最初的安全描述指定ACL。它将对ACL继承的处理方式产生影响。如果SACL存在没有设置,则忽略该标志。

自相关标志是一个布尔标志,设置时表示安全描述是一个自相关表。在该表中,安全描述的所有域在内存中都是连续的,所有的指示域都明确的用从相对安全描述的起始处的偏移来表示。

在NTFS 4.0以上版本中,所有的安全描述都集中存储在$Secure文件中,通过标准信息属性中的安全ID属性来找到正确的安全描述。每个唯一的安全描述都指派一个唯一的安全标识(security_id,但不是SID),卷中的security_id是唯一的,作为$SII索引的一个索引来使用,并存储为$SDS的数据流属性。$SII索引按security_id的升序进行存储。

50H属性可以常驻,也可以非常驻,一个常驻50H的例子如图4-420所示。

50H($SECURITY_DESCRIPTOR)属性分析-数据恢复迷

图4-420 常驻50H的例子