UAC实现原理
UAC实现原理:
- 当用户登录系统成功后, 系统会为用户生成一个accessToken。该用户调用的每一个进程都会有一个AccessToken copy。当进程要访问某个securable object 时,系统会比对accessToken拥有的权限(previlages 是否能访问securable object)
- 如果安全描述符中不存在DACL,则系统会允许线程进行访问。如果存在DACL,系统会顺序遍历DACL中的每个ACE,检查ACE中的SID在线程的AccessTkoen中是否存在。以访问者中的User SID或Group SID作为关键字查询被访问对象中的DACL。顺序:先查询类型为DENY的ACE,若命中且权限符合则访问拒绝;未命中再在ALLOWED类型的ACE中查询,若命中且类型符合则可以访问;如果前两步后还没命中那么访问拒绝。
相关概念:
ntoskrnl.exe: ntoskrnl.exe 是 Windows 操作系统的一个重要内核程序文件,里面存储了大量的二进制内核代码,用于调度系统。
Windows执行体: Windows执行体是ntoskrnl.exe中的上层(内核是其下层)。
对象管理器(Object Manager): 创建、管理和删除Windows执行体对象和抽象数据类型,他们(抽象数据类型)代表了操作系统资源,比如进程、线程和各种同步对象。
环境子系统: 环境子系统是操作系统中名词。环境子系统向应用程序提供环境和应用程序编程接口(Appplication Programming Interface, API)。Windows 2000/XP支持三种环境子系统:Win32、POSIX和OS/2,其中最重要的环境子系统是Win32子系统,其他子系统都要通过Win32子系统接收用户的输入和显示输出。环境子系统的作用是将基本的执行体系统服务的某些子集提供给应用程序。 用户应用程序调用系统服务时必须通过一个或多个子系统动态链接库作为中介才可以完成。
执行体对象: 每个Windows环境子系统总是把操作系统的不同面貌呈现给它的应用程序。执行体对象和对象服务是环境子系统用于构建其自有版本的对象和其他资源的基础。
安全描述符(Security descriptors): 是安全信息的数据结构(SECURITY_DESCRIPTOR),用于可安全(securable)的Windows对象,这些对象可以被唯一名称辨识。安全描述符可用于任何命名对象,包括文件、文件夹、共享、注册表键、进程、线程、命名管道、服务、工作对象以及其他资源。
- 版本号:创建此描述符的SRM安全模型的版本;
- 标志:一些可选的修饰符,定义了该描述符的行为或特征。表6.5列出了这些标志;
- 所有者SID:所有者的安全ID
- 组SID:该对象的主组的安全ID(仅用于POSIX)
- 自主访问控制列表(discretionary access control list,DACL):规定了谁可以用什么方式访问该对象。
- 系统访问控制列表(System Access Control List,SACL)规定了哪些用户的哪些操作应该被记录到安全审计日志中,以及对象的显式完整性级别。
typedef struct _SECURITY_DESCRIPTOR {
UCHAR Revision;
UCHAR Sbz1;
SECURITY_DESCRIPTOR_CONTROL Control; //其自身的一些控制位
PSID Owner; //Owner安全标识符(Security identifiers) 相当于UUID,标识用户、用户群、计算机帐户
PSID Group; //Group安全标识符(Security identifiers) 相当于UUID
PACL Sacl; //(System Access Control List),其指出了在该对象上的一组存取方式(如,读、写、运行等)的存取控制权限细节的列表。
PACL Dacl; //(Discretionary Access Control List),其指出了允许和拒绝某用户或用户组的存取控制列表。 如果一个对象没有DACL,那么就是说这个对象是任何人都可以拥有完全的访问权限。
} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
typedef struct _ACL {
BYTE AclRevision;
BYTE Sbz1;
WORD AclSize;
WORD AceCount;
WORD Sbz2;
} ACL, *PACL;
安全标识符 (Security Identifier,SID): 是Windows操作系统使用的独一无二的,不变的标识符用于标识用户、用户群、或其他安全主体。
可移植操作系统接口(POSIX): 是IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称。
访问控制项( access control entries,ACE):
安全描述符: 包含自主决定的访问控制表(DACL),里面包含有访问控制项(ACE),因此可以允许或拒绝特定用户或用户组的访问。它们还包含一个系统访问控制列表(SACL)以控制对象访问请求的日志(logging)。[2][3]ACE可以显式应用于对象,或者从父对象继承。ACE的顺序在ACL中很重要,拒绝访问的ACE应该比允许访问的ACE更早出现。安全描述符还包含对象所有者。
访问控制列表(access control list,ACL): 访问控制列表(ACL,access-control list)是由一个头和零个或多个访问控制项(ACE, access-control entry)结构组成的。共有两种类型的ACL: DACL和SACL。在DACL中,每一个ACE包含一个SID和一个访问掩码。