DAC机制:
DAC(DiscretionalAccess Control,自主访问控制),需要先了解下面三个概念:SID、Token和SD。
1、SID
Security identifier,安全标识符,标识系统中执行各种动作的实体,用户,本地用户组,域中用户组,本地计算机,域和域成员都有SID。
详细SID描述见<<深入解析Windows操作系统>>P495。
2、Token令牌,进程或线程访问资源(文件对象,注册表对象,互斥对象,命名管道对象等)的凭证。
图 2,Token内核对象的大致内存布局。关键数据结构如下:
typedef struct_SID_AND_ATTRIBUTES{
PSID Sid;
DWORD Attributes;
}SID_AND_ATTRIBUTES;
typedef struct_LUID_AND_ATTRIBUTES{
LUID Luid;
DWORDAttributes;
} LUID_AND_ATTRIBUTES;
大家可以对照图1和图2来了解Token。
当用户登录系统成功之后,SID和Token的逻辑关系见下图3:
SecurityDescriptor,安全描述符,规定了谁可以在被描述的对象上执行怎么样的动作。
其内核对象的内存布局大致如下:DAC(Discretional Access Control,自主访问控制)。
在下图5中,User4同时属于Group1和Group2。现在,假设User4要创建一个进程Trojan.exe,那么该进程的Token中就有SID1、SID2和SID4,且有特权1和特权2。
Trojan.exe在DAC机制下访问对象的过程如下:
上图5中,虽然SD中允许User4访问该对象,但是,由于拒绝的ACE在前面,Group1已经拒绝访问该对象,所以,User4还是不能访问该对象。
Restricted token功能介绍
受限令牌是通过CreateRestrictedToken函数,在主令牌或模仿令牌的基础上创建的。受限令牌是其来源令牌的一份拷贝,有可能下面的修改:
1) 从该令牌的特权集中删除一些特权;
2) 该令牌的SID可以被标记deny-only;
3) 该令牌中的SID可以 被标记为restricted;
下面是我写的一段基于CUI的代码,其功能有:
1)创建Restricted Token;