Windows操作系统----安全机制----Token
简介
Token结构体是访问权限检查中的代表主体身份的核心数据结构,Windows 10 x64平台下的结构见最后。
我们比较关注其中的特权位图和三个代表主体身份的Sid数组:UserAndGroups,RestrictedSids,Capabilities。
进程主令牌和模拟令牌
每一个进程有一个主要的令牌,它描述了与当前进程相关的用户帐户的安全上下文。默认情况下,系统用主令牌当一个进程的线程与一个安全对象相互作用时。此外,一个线程可以模拟一个客户端帐户。模拟允许此线程与安全对象交互时用客户端的安全上下文。一个正模拟客户端的线程拥有一个主令牌和一个模拟令牌。
用函数:OpenProcessToken 来接收一个指向一个进程的主令牌句柄。用OpenThreadToken函数来得到一个指向线程模拟令牌的句柄。
Privileges位图
特权在用户态是通过LUID来表示,在内核结构体_TOKEN中是使用三个位图来表示:
kd> dt _SEP_TOKEN_PRIVILEGES
nt!_SEP_TOKEN_PRIVILEGES
+0x000 Present : Uint8B
+0x008 Enabled : Uint8B
+0x010 EnabledByDefault : Uint8B
分别代表当前的主体可以选用的特权集合(Present)、已经打开的特权集合(Enabled)和默认打开的特权集合(EnabledByDefault),后两个集合应该是Present集合的子集。
与代表主体身份的Sid数组不同,特权集合的表示简单,而且没有任何保护。从用户态通过API只能打开或者关闭某一项已经存在的特权,而不能增加可选的特权,换句话说,用户态只能修改Enabled特权集合,而不能修改Present特权集合;从内核态可以直接修改Present特权集合,比如给普通进程增加SeAssignPrimaryTokenPrivilege特权,以便为子进程显式指定令牌,而不是继承当前进程的令牌,可以达到扩大子进程权限的效果。
代表主体身份的Sid数组
三个代表主体身份的Sid数组分别是:
UserAndGroups:
代表着主体的普通用户身份和组身份,是不可或缺的成员;
RestrictedSids:
可选成员,如果不为空,则代表着当前的令牌是受限令牌,受限令牌通过从普通令牌中过滤掉一些比较敏感的身份转化而来,受限令牌中的UserAndGroups成员与普通令牌相同,但是RestriectedSids成员不为空,里面保存着过滤后的身份子集;由于在访问权限检查时,三个身份Sid数组要同时进行检查,只有结果都通过才允许该次访问,因此通过增加代表着受限制的权限集合的RestrictedSids成员,既达到了限制令牌权限的目的,又在UserAndGroups成员中保留了原有令牌的完整身份信息。
Capabilities:
可选成员,仅用于AppContainer,其中的Sid代表着与App相关的身份,比如拥有连接网络、访问当前位置等权限的身份。
这三个Sid数组都关联了哈希信息,以保护其完整性,因此,即使从内核态直接修改,也会因为无法通过完整性验证而失败。不过好在哈希的算法非常简单,下面展示的就是Windows 10 x64平台下面该算法的C++演示代码:浅析Windows的访问权限检查机制 – 绿盟科技技术博客
UAC与关联令牌
当用户登录Windows时,操作系统会为用户生成一对初始令牌,分别是代表着用户所拥有的全部权限的完整版本令牌(即管理员权限令牌),以及被限制管理员权限后的普通令牌,二者互为关联令牌;此后,代表用户的进程所使用的令牌都是由普通令牌继承而来,用来进行常规的、非敏感的操作;当用户需要进行一些需要管理员权限的操作时,比如安装软件、修改重要的系统设置时,都会通过弹出提权对话框的形式提示用户面临的风险,征求用户的同意,一旦用户同意,将会切换到当前普通令牌关联的管理员权限令牌,来进行敏感操作。通过这种与用户交互的方式,避免一些恶意程序在后台稍稍执行敏感操作。
关联令牌是通过Logon Session来实现的,下图展示了其大致原理:
Token结构
下面展示的是Windows 10 x64平台下的构成。
kd> dt nt!_TOKEN+0x000 TokenSource : _TOKEN_SOURCE+0x010 TokenId : _LUID+0x018 AuthenticationId : _LUID+0x020 ParentTokenId : _LUID+0x028 ExpirationTime : _LARGE_INTEGER+0x030 TokenLock : Ptr64 _ERESOURCE+0x038 ModifiedId : _LUID+0x040 Privileges : _SEP_TOKEN_PRIVILEGES+0x058 AuditPolicy : _SEP_AUDIT_POLICY+0x078 SessionId : Uint4B+0x07c UserAndGroupCount : Uint4B+0x080 RestrictedSidCount : Uint4B+0x084 VariableLength : Uint4B+0x088 DynamicCharged : Uint4B+0x08c DynamicAvailable : Uint4B+0x090 DefaultOwnerIndex : Uint4B+0x098 UserAndGroups : Ptr64 _SID_AND_ATTRIBUTES+0x0a0 RestrictedSids : Ptr64 _SID_AND_ATTRIBUTES+0x0a8 PrimaryGroup : Ptr64 Void+0x0b0 DynamicPart : Ptr64 Uint4B+0x0b8 DefaultDacl : Ptr64 _ACL+0x0c0 TokenType : _TOKEN_TYPE+0x0c4 ImpersonationLevel : _SECURITY_IMPERSONATION_LEVEL+0x0c8 TokenFlags : Uint4B+0x0cc TokenInUse : UChar+0x0d0 IntegrityLevelIndex : Uint4B+0x0d4 MandatoryPolicy : Uint4B+0x0d8 LogonSession : Ptr64 _SEP_LOGON_SESSION_REFERENCES+0x0e0 OriginatingLogonSession : _LUID+0x0e8 SidHash : _SID_AND_ATTRIBUTES_HASH+0x1f8 RestrictedSidHash : _SID_AND_ATTRIBUTES_HASH+0x308 pSecurityAttributes : Ptr64 _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION+0x310 Package : Ptr64 Void+0x318 Capabilities : Ptr64 _SID_AND_ATTRIBUTES+0x320 CapabilityCount : Uint4B+0x328 CapabilitiesHash : _SID_AND_ATTRIBUTES_HASH+0x438 LowboxNumberEntry : Ptr64 _SEP_LOWBOX_NUMBER_ENTRY+0x440 LowboxHandlesEntry : Ptr64 _SEP_LOWBOX_HANDLES_ENTRY+0x448 pClaimAttributes : Ptr64 _AUTHZBASEP_CLAIM_ATTRIBUTES_COLLECTION+0x450 TrustLevelSid : Ptr64 Void+0x458 TrustLinkedToken : Ptr64 _TOKEN+0x460 IntegrityLevelSidValue : Ptr64 Void+0x468 TokenSidValues : Ptr64 _SEP_SID_VALUES_BLOCK+0x470 IndexEntry : Ptr64 _SEP_LUID_TO_INDEX_MAP_ENTRY+0x478 VariablePart : Uint8B
欢迎关注我的微博:大雄_RE。专注软件逆向,分享最新的好文章、好工具,追踪行业大佬的研究成果。
Windows操作系统----安全机制----Token相关推荐
- 《深入解析Windows操作系统》之系统机制
内容总结: 重难点笔记: 陷阱分发: 中断和异常是导致处理器转向正常控制流之外代码的两种操作系统条件.硬件或者软件都可以检测到这两种条件.术语陷阱(trap)指的是这样一种机制,当异常或者中断发生时, ...
- [笔记]深入解析Windows操作系统《三》系统机制
文章目录 前言 第三章 系统机制 3.1 陷阱分发 实验:将系统调用号映射到函数和参数 实验:查看系统服务的行为 选择"System"对象,再选择"System Call ...
- 全面介绍Windows内存管理机制及C++内存分配实例(三):虚拟内存
本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...
- Windows操作系统深入解析原理
Windows运用程序编写插口(API)是对于Windows电脑操作系统大家族的客户方式系统软件程序编写插口.在32位版本号的Windows营销推广之前,31位版本号Windows电脑操作系统的程序编 ...
- Android4.0窗口机制token分析以及activitiy, dialog, toast 窗口创建过程分析
From 51CTO 一 前言 在谈到这个话题的时候,脑海里面千头万绪,因为它涉及到了方方面面的知识- 比如Activity管理,窗口添加,Token权限验证等等- 既然这么复杂,那么我们就复杂的问 ...
- windows程序消息机制(Winform界面更新有关)--转
1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队 ...
- 详谈Windows消息循环机制
一直对windows消息循环不太清楚,今天做个详细的总结,有说错的地方,请务必指出. 用VS2017新建一个win32 Application的默认代码如下: 这里有几个概念,容易混淆: 1.系统: ...
- Windows消息循环机制详细概述
首先来了解几个基本概念: 消息:在了解什么是消息先来了解什么是事件.事件可分为几种,由输入设备触发的,比如鼠标键盘等等.由窗体控件触发的,比如button控件,file菜单等.还有就是来自Window ...
- windows程序消息机制(Winform界面更新有关)
1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队 ...
- 全面介绍Windows内存管理机制及C++内存分配实例(六):堆栈
本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...
最新文章
- 姿态检测 树莓派_怎样在树莓派上轻松实现深度学习目标检测?
- mysql 39 t.id 39_Day39----MySQL系列
- 【教程】Linux 系统下对目录扩容的方法
- arcgis 分区 属性值_ArcGIS制图之Maplex自动点抽稀
- C语言——猴子吃桃问题
- wireless 时好时断的一些解决的建议
- 软件测试的测试代码,软件测试(示例代码)
- 直播预告丨技术干货:易鲸捷HTAP融合型分布式数据库连接服务层介绍
- 苹果系统简易音乐播放器
- 回答缺点?这样回答HR听完直呼大佬!
- 医院信息系统源码 HIS源码
- DevOps元素周期表——1号元素 Gitlab
- Vscode(arduino框架) 开发ESP32 _01_电容Touch和外部中断
- 微信小程序展开收起通讯录列表
- 深度linux安装cad,在deepin下安装CAD — 原生CAD 看图画图
- 工作java工作总结
- Android开发教程 - 使用Data Binding(七)使用BindingAdapter简化图片加载
- 掌柜星新零售解决方案为母婴亲子行业商家助力
- 游戏修改器的基本工作原理
- C#读写调整UVC摄像头画面-饱和度
热门文章
- 【嵌入式--伺服电机】电磁理论的基础概念
- 水中机器人电控方案设计
- uniapp实现打印PDF文件
- 专业生物信息linux系统,Evvail | Bio-Linux:生物信息专用Linux系统 | Omics - Hunter
- (XWZ)的Python学习笔记Ⅴ——I/O编程
- Java--获取xml头encoding编码方式
- 阿西莫夫机器人三定律或已过时?伯克利教授定义AI发展“新三原则”!
- Word类报表实例 - 质量检测报告
- 计算机中英汉字段如何切换,电脑上中英文切换按哪个键
- 毕业论文word版 格式设置技巧