Token
Access Tokens
访问令牌是一个描述进程或线程上下文安全的对象,令牌中的信息包括与进程或线程相关联的用户的 id 信息和权限。当用户登录时,系统会把用户输入的密码和存储在安全数据库中的信息进行比对,来验证用户的密码。如果密码被认证,系统会产生访问令牌。 此用户执行的每个进程都同样有该访问令牌(a copy of user’s access token)。
当线程与安全对象交互或尝试执行需要特权的系统任务时,系统使用访问令牌来标识用户,访问令牌包含以下信息:
- 用户帐户的安全标识符(SID)
- 用户所属组的SID
- 标识当前登录会话的登录 SID
- 用户或用户组所拥有的特权列表
- 所有者 SID。An owner SID
- The SID for the primary group
- 当用户在不指定安全描述符的情况下创建安全对象时,系统默认使用 DACL
- 访问令牌的来源
- Whether the token is a primary or impersonation token
- 限制SID的可选列表
- Current impersonation levels
- Other statistics
每个进程都有一个主令牌,用于描述与该进程关联的用户的安全上下文。默认情况下,当进程的线程与安全对象交互时,系统使用主令牌。此外,线程可以模拟 client account。模拟后,允许线程使用客户端的安全上下文与安全对象交互。模拟客户端的线程同时具有主令牌和模拟令牌。
primary token
主要令牌:通常仅由 Windows 内核创建的访问令牌。它可以分配给一个进程来表示该进程的默认安全信息。
impersonation token
模拟令牌:为捕获客户端进程的安全信息而创建的访问令牌,允许服务器在安全操作中“模拟”客户端进程。
Restricted Tokens
受限令牌:受限令牌是主访问令牌或模拟访问令牌调用 CreateRestrictedToken方法修改而来。处于受限令牌的安全上下文运行的进程或模拟线程访问安全对象或执行特权操作的能力受到限制,CreatereestrictToken函数可以通过以下方式限制令牌:
- 从令牌中删除权限
- 将 deny-only 属性应用于令牌中的 sid,以便它们不能用于访问安全对象
- 指定限制 SID 的列表,该列表限制对安全对象的访问。
系统使用限制 SID 列表来检查令牌对安全对象的访问,当受限进程或线程尝试访问安全对象时,系统将执行两个访问检查:一个是使用令牌已启用的 SID,另一个使用受限SID列表。只有这两个访问检查都被通过的时候,才会授予访问者访问权限。
安全描述符
包含安全对象的安全信息的结构和关联数据。安全描述符标识对象的所有者和主要组。它还可以包含控制对对象的访问的 DACL 和控制对访问对象的尝试的日志记录的 SACL。
SID
Overview
- 在Microsoft Windows NT系列操作系统的上下文中,安全标识符(通常缩写为SID)是用户、用户组或其他安全主体的唯一的、不可变的标识符。SID在 Windows 中首次创建账户时被创建,一个安全主体(在给定域中)终生有一个 SID,主体的所有属性,包括其名称,都与 SID 相关联。
- SID(安全标识符)是计算机或域控制器用来识别你的唯一ID号,它是分配给 Windows 计算机上的每个用户或域控制网络上的每个用户、组和计算机的一串字母数字字符。
- 当我们输入用户名和密码时,Windows 首先会检查我们输入的用户名和其相对应的存储密码是否匹配,之后它会在 Windows注册表中查看与该用户名关联的 SID。用户通过验证后,登陆进程会给用户一个访问令牌,该令牌相当于用户访问系统资源的票证,当用户试图访问系统资源时,将访问令牌提供给 Windows NT,然后 Windows NT 检查用户试图访问对象上的访问控制列表。如果用户被允许访问该对象,Windows NT将会分配给用户适当的访问权限。访问令牌是用户在通过验证的时候有登陆进程所提供的,所以改变用户的权限需要注销后重新登陆,会重新获取访问令牌。
- Windows 2000 中的内部进程将引用帐户的 SID 而不是帐户的用户或组名。如果创建帐户,再删除帐户,然后使用相同的用户名创建另一个帐户,则新帐户将不具有授权给前一个帐户的权力或权限,原因是该帐户具有不同的 SID 号。
SID 解析
SID 如下所示:
1 | PS C:\WINDOWS\system32> WMIC useraccount get name,sid |
微软通常将其分解为以下模式:
1 | (SID)-(revision level)-(identifier-authority)-(subauthority)-(etc) |
S | 1 | 5 | 21-3018282723-2406670630-2225774231 | 1000 |
---|---|---|---|---|
标识为SID | 一直都是 1 | 权限值 | 子权限值 在这种情况下,域 (21) 具有唯一标识符。可能有多个下级机构,特别是如果该帐户存在于域中并且属于不同的群体 | 相对 ID。默认情况下未创建的任何组或用户将具有 1000 或更大的相对 ID。 |
SID: 一直都是 S,这个是 SID 的标识符
Revision level: 一直都是 1
Identifier-authority: 用于标识创建 SID 的权限
可能的值为:
- 0 (
SECURITY_NULL_SID_AUTHORITY
) 是空帐户 SID 的所有者S-1-0-0
。 - 1(
SECURITY_WORLD_SID_AUTHORITY
, everyone group)也仅具有一个SID:S-1-1-0
。 - 2 (
SECURITY_LOCAL_SID_AUTHORITY
, local group ) 也只有一个 SID:S-1-2-0
. - 3 (
SECURITY_CREATOR_SID_AUTHORITY
):SIDS-1-3-0
到S-1-3-5
) - 4 (
SECURITY_NON_UNIQUE_AUTHORITY
) 未使用 - 5 (
SECURITY_NT_AUTHORITY
) 拥有由 NT 安全子系统管理的帐户。 - 9 (
SECURITY_RESOURCE_MANAGER_AUTHORITY
) … - 16 (
SECURITY_MANDATORY_LABEL_AUTHORITY
),见流程完整性等级
- 0 (
Subauthority:这是一个变量号,用于标识SID所描述的用户或组与创建它的机构之间的关系
- 号码由那个计算机或网络所创建
- 此用户是普通用户、访客、管理员还是其他组的一部分
- 该权限创建用户帐户的顺序 (i.e., “This was the first user” or “This is the 231st machine account created”.)
已知 SID
每个用户的 SID 在所有 Windows 中都是唯一的。也就是说,某些 SID 在所有系统上都是通用的,或者以相同的前缀开头。
Capability SIDs
Windows 8 引入了功能安全标识符 (SID)。Capability SIDs 以唯一且不可变的方式标识能力。Capability SIDs 代表了一种令人难忘的权限令牌,它授予通用 Windows 应用程序对资源(例如文档、相机、位置等)的访问权限。具有该 SID 的应用被授予对关联资源的访问权限,反之没有该 SID的应用程序将被拒绝访问资源。
操作系统所知的所有功能SID都存储在以下子项中的Windows注册表中:
1 | HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SecurityManager\CapabilityClasses\AllCachedCapabilities |
此子项还包含由第一方或第三方应用程序添加的任何功能 SID。所有功能 SID 都以S-1-15-3
.
参考
https://en.wikipedia.org/wiki/Security_Identifier
https://renenyffenegger.ch/notes/Windows/security/SID/index
Integrity Level
Overview
完整性级别表示正在运行的应用程序进程和对象(例如应用程序创建的文件)的可信度,由一组特殊的 SID 和 ACL 条目实现的,它们代表五个不断增加的特权级别:untrusted, low, medium, high, system
如果一个对象处于比请求者更高级的信用等级,访问该对象就会受限。
Integrity 级别还实现了用户界面权限隔离,Integrity 性级别的规则应用于在同一桌面下的不同进程之间交换窗口消息
token 可以向更高 level 的 object 读数据,但是不能写数据。
大多数桌面应用程序以 medium integrity (MI)信任等级运行,信任度较低的程序(保护模式下的 IE 和 GPU 的 Sandbox)以 low integrity (LI) 信任等级运行,而 renderer 则以最低的信任等级运行。
Windows 完整性机制的目的是限制同一账户下运行的可信度较低的应用程序的访问权限。主要解决的安全问题是未授权篡改用户数据,间接篡改系统状态,信息泄露。
Windows 安全体系结构主要基于 SID 来构建,SID 代表着每个用户或组所被授予的访问权限(读、写和执行权限)和特权。当用户登录 Windows 时,安全子系统会在
security access token
中添加用户的 SID 和组成员身份 SID,相应的该用户或组下的所有应用程序会被授予同样的访问权限和特权。每次应用程序打开一个对象(如文件或注册表项)时,管理该对象的资源管理器都会访问安全子系统来确定此用户是否具有访问权限,安全子系统会把access token
中的用户和组的 SID 和与对象相关联的 SID 进行比较,如果用户SID在对象的ACL中授予完全访问权限,则用户运行的应用程序进程可以完全访问该对象。
Extending
- Windows 完整性机制通过定义新的访问控制条目(ACE)类型来扩展安全体系结构,新的 ACE (access control entry) 用来代表对象安全描述符中的完整性级别。当访问令牌被初始化时,完整性级别也被分配给安全访问令牌。
- 访问令牌中的完整性级别表示
subject
的完整性级别,使用安全描述符中强制标签 ACE 中的完整性级别 SID 来表示对象完整性级别。当安全子系统(安全参考监视器)执行访问检查时,将 access token (访问令牌)中的完整性级别 与 SID (安全标识符) 中的完整性水平进行比较。 - Windows 根据 Subject 的完整性级别和新访问控制ACE中的完整性策略标志来判断其访问权限。
- 安全子系统将完整性级别实现为强制标签,目的是区分 ACLs所提供给用户的自由控制的
discretionary access
- 强制标签 ACE定义了一个 Object 的完整性级别,但是并不改变现有的安全描述符数的据结构定义和常用的自由访问控制表(discretionary access control list,缩写为DACL),该表通常授予管理员和系统完全控制权限,并授予通过身份验证用户读取和执行权限。
Windows Vista 使用AccessCheck函数来确定安全对象具有哪些访问权限
Access Control Entries(ACE)
ACE 是 ACL 列表当中的一个成员。一个 ACL 中可以有 0 个或多个 ACE。每个ACE控制或监视指定受信者的对象的访问权限。一共有 6 种 ACE,其中 3 种支持所有的安全对象,其他三种类型是目录服务对象支持的Object-specific ACEs。
所有类型的ACE都包含以下访问控制信息:
- 安全标识符(SID),用于标识 ACE 应用的 trustee。
- 由ACE控制的访问权限的访问掩码。
- 表示ACE类型的标志。
- 一组位标志,用于确定子容器或对象是否可以从ACL附加到的主对象继承ACE。
以下是所有安全对象支持的三种 ACE 类型:
Type | Description |
---|---|
Access-denied ACE | 在discretionary access control list (DACL)中用于拒绝对 trustee 的访问权限。 |
Access-allowed ACE | 在DACL中用于允许对 trustee 的访问权限。 |
System-audit ACE | Used in a system access control list (SACL) to generate an audit record when the trustee attempts to exercise the specified access rights. |
Access Control Lists(ACL)
ACL 是 ACE 的一个列表。ACL 中的每个 ACE 都标识一个 trustee,ACE 代表着 trustee 的允许、拒绝或审核的权限。安全对象的安全描述符可以包含两种类型的 ACL 分别是 DACL 和 SACL:
discretionary access control list (DACL) 标识允许或拒绝访问安全对象的受信者(trustee)。当一个进程试图访问一个安全对象时,系统会检查该对象的 DACL 中的 ACE,以确定是否授予对它的访问权。如果该对象没有DACL,系统将授予所有人完全访问权限。如果对象的 DACL 内没有 ACE,系统将拒绝所有进程访问该对象。操作系统按顺序检查 ACE,直到满足以下事件的其中一个:
- access-denied ACE 明确拒绝了线程访问令牌中的某一个 trustee 的所有访问请求
- 线程的访问令牌中列出的 trustee 的一个或多个 access-allowed ACEs 显式授予所有请求的访问权限
- 已检查所有ACE,但仍至少有一个请求的访问权限未被显式允许,在这种情况下,访问将被隐式拒绝。
下图显示了对象的DACL如何允许访问一个线程,同时拒绝访问另一个线程:
线程 A 请求访问 Object,系统按顺序检查 DACL,发现第一个 ACE 明确拒绝了 Andrew 的访问,而 Andrew 在线程 A 的访问令牌中,所以线程 A 被拒绝。当请求的访问被明确授予或拒绝时,系统会停止检查 ACE,所以 DACL 中 ACE 的顺序很重要。
system access control list (SACL) 使管理员能够记录访问安全对象的尝试。每个 ACE 都明确了由指定的受信者(trustee)进行的尝试访问类型,操作系统会在安全事件日志记录下这一行为(无论访问尝试成功、失败或者二者同时发生都会生成记录)。
ACL 还为 Microsoft Active Directory 目录服务对象提供访问控制,
完整性机制的设计
Windows完整性机制是Windows安全体系结构的扩展,它基于内核中的安全引用监视器(the Security Reference Monitor)。安全引用监视器通过将安全访问令牌中的用户和组 SID 与对象安全描述符的ACL中授予的访问权限进行对比,来判断其是否具有访问权限。完整性机制为安全访问令牌和安全描述符中的System ACL(SACL)添加了完整性级别和强制标签访问控制条目。
Integrity levels
Windows 使用 SID 定义完整性级别。完整性级别 SID 具有以下形式:S-1-16-xxxx。表 1 显示了完整性级别 SID 的组成部分。
Table 1 Integrity level SID identifier authority values
Value | Description |
---|---|
16 | 表示强制标签授权 (SECURITY_MANDATORY_LABEL_AUTHORITY). |
xxxx | 表示作为完整性级别的相对标识符(RID)字段。RID是表示完整性级别的十六进制值。 |
Windows Vista中有四个主要完整性级别,具有四个相应的值,表 2 显示了定义的完整性级别及其相应的值。
Table 2 Defined integrity levels and corresponding values
Value | Description | Symbol |
---|---|---|
0x0000 | Untrusted level | SECURITY_MANDATORY_UNTRUSTED_RID |
0x1000 | Low integrity level | SECURITY_MANDATORY_LOW_RID |
0x2000 | Medium integrity level | SECURITY_MANDATORY_MEDIUM_RID |
0x3000 | High integrity level | SECURITY_MANDATORY_HIGH_RID |
0x4000 | System integrity level | SECURITY_MANDATORY_SYSTEM_RID |
例如:S-1-16-8192。 RID值为8192,16 进制为0x2000,代表其具有中完整性级别
定义完整性级别的 SID 具有与其关联的字符串名称。通过调用 API LookupAccountSID
可以返回每个完整性级别 SID 的字符串名称。表3显示了完整性级别的字符串名称。
Table 3 Integrity level string names
Integrity level SID | Name |
---|---|
S-1-16-4096 | Mandatory Label\Low Mandatory Level |
S-1-16-8192 | Mandatory Label\Medium Mandatory Level |
S-1-16-12288 | Mandatory Label\High Mandatory Level |
S-1-16-16384 | Mandatory Label\System Mandatory Level |
Integrity levels and UAC
当管理员处于Approval 模式时,Windows Vista 中的 UAC 在同一桌面上以不同的访问级别运行多个程序。每个程序在创建进程的时候内核会分配一个安全访问令牌,基于此令牌每个程序具有不同的权限。
标准帐户的用户在登录期间会被分配一个中等完整性级别安全访问令牌,相应的这个令牌也会分配给该用户下的几乎所有应用程序。
帐户为Administrators组成员的用户在登录时有两个链接在一起的安全访问令牌。一个是标准用户中等完整性级别的访问令牌,其中Administrators组仅用于拒绝访问检查,并且删除了某些管理权限。第二个访问令牌是一个拥有完整特权、高访问权限的令牌,其被分配为高完整性级别,所以该令牌拥有管理员组和管理权限。两个访问令牌都具有相同的用户 SID 和来自 Active Directory 的相同全局组(域和企业管理的筛选组除外)。
Windows 资源管理器(Shell)所有非管理员任务都被分配为标准用户和中等完整性的访问令牌,对于作为Administrators组成员的用户,几乎所有应用程序都会使用中间完整性访问令牌运行。
完整性机制对于中等完整性级别的应用程序是透明的,除非他们可能会控制更高权限级别上运行的其他进程。例如:Windows UI 自动化是旨在控制其他进程的应用程序的一个示例。
低完整性进程只有通用的执行访问权限。通用的执行访问权限包括以下内容:
1 | SYNCHRONIZE, PROCESS_QUERY_LIMITED_INFORMATION |
一般的,低完整性进程对更高完整性进程的读取访问受到限制(PROCESS_VM_READ access to the virtual memory of a process, and PROCESS_QUERY_INFORMATION),这些内存可能包含用于身份验证的密码数据或其他密钥资料。对较高完整性进程的通用写访问被No_Write_up策略阻止。 通用写入过程访问权限包括:
1 | PROCESS_CREATE_THREAD |
参考
https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/bb625957(v=msdn.10)
https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/bb625963(v=msdn.10)
https://docs.microsoft.com/en-us/previous-versions/dotnet/articles/bb625962(v=msdn.10)
https://docs.microsoft.com/en-us/windows/win32/secauthz/access-control-lists
https://docs.microsoft.com/en-us/windows/win32/secauthz/how-dacls-control-access-to-an-object