文章目录
Windows UAC 实现原理
在XP的时代,只要是管理员权限的用户,就基本可以为所欲为了,这给编程者带来的方便(例如编程的时候随便干什么事情都是被允许的),但是给客户的使用带来了很大的危害,因为用户权限太大,如果被别有用心的人利用,那么可以非常容易做所有的事情。
从vista开始,微软引入了UAC,解决了这种不安全性,下面看一下UAC的基础知识信息。
1. 工作流程
UAC 是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。UAC 可以阻止未经授权的应用程序自动进行安装,并防止无意中更改系统设置。
从图上可以看到,如果要获取管理员权限,通过的路径有以下几条:
- 进程已经拥有管理权限控制;
- 进程被用户允许通过管理员权限运行。
2. UAC 实现方法(用户登陆过程)
UAC有如下概念和特性:
- ACL(Access Control List):Windows 中所有资源都有 ACL ,这个列表决定了拥有何种权限的用户/进程能够这个资源。
- 在开启了 UAC 之后,如果用户是标准用户, Windows 会给用户分配一个标准 Access Token.
- 如果用户以管理员权限登陆,会生成两份访问令牌,一份是完整的管理员访问令牌(Full Access Token),一份是标准用户令牌。一般情况下会以标准用户权限启动 Explorer.exe 进程。如果用户同意,则赋予完整管理员权限访问令牌进行操作。
3. UAC 架构
这个UAC的基本框架如下:
4. 触发UAC
UAC需要授权的动作包括:
- 配置Windows Update
- 增加或删除用户账户
- 改变用户的账户类型
- 改变UAC设置
- 安装ActiveX
- 安装或移除程序
- 安装设备驱动程序
- 设置家长控制
- 将文件移动或复制到Program Files或Windows目录
- 查看其他用户文件夹
5. UAC 虚拟化
UAC 虚拟化(Virtualization)也被称为重定向(Data Redirection)。在权限判定的过程中,如果用户的权限没有达到程序所需的权限,UAC 就会重定向该文件夹。例如,如果程序试图写入到 C:\Program Files\Contoso\Settings.ini
目录下,但用户没有写入权限,这个写操作就会被重定向至 C:\Users\Username\AppData\Local\VirtualStore\Program Files\contoso\settings.ini.
UAC 虚拟化分为两个部分,文件虚拟化和注册表虚拟化。
要注意的是,在以下情况下,虚拟化不可用:
- 64 位程序
- 非交互式程序
- 模拟令牌的进程 (Processes that impersonate)
- 内核模式调用方
- 带有 requestedExecutionLevel(请求执行等级)的可执行程序
5.1 文件虚拟化(File Virtualization)
Luafv.sys实现的是改变写入文件位置。
5.2 注册表虚拟化
Ntoskrnl.exe实现的是改变写入注册表位置。
6. UAC进程启动原理
我们在shell中双击一个程序,运行进程,都是通过ShellExecute
来执行的,那么如果执行一个需要管理员权限的程序,那么就会弹出UAC安全保护框,那么这个过程是怎么样的呢?下面看下这个流程。
6.1 ShellExecuteExW的执行过程
执行堆栈如下
# ChildEBP RetAddr Args to Child
00 001febb8 76ff6a04 752069dc 00000002 001fec0c ntdll!KiFastSystemCallRet
01 001febbc 752069dc 00000002 001fec0c 00000001 ntdll!NtWaitForMultipleObjects+0xc
02 001fec58 7641bc8e 001fec0c 001fec80 00000000 KERNELBASE!WaitForMultipleObjectsEx+0x100
03 001feca0 76ef62f9 00000002 7ffdd000 00000000 kernel32!WaitForMultipleObjectsExImplementation+0xe0
04 001fecf4 76ef37f7 00000024 001fedd0 ffffffff user32!RealMsgWaitForMultipleObjectsEx+0x13c
05 001fed10 7574eacc 00000001 001fedd0 00000000 user32!MsgWaitForMultipleObjects+0x1f
06 001fed64 7574ea55 001fedac ffffffff 00000000 shell32!AicpMsgWaitForCompletion+0x3c
07 001fed84 7574e927 001fedac 00000001 ffffffff shell32!AicpAsyncFinishCall+0x33
08 001ff0b4 7574e60f 004285a4 003d4c38 00000000 shell32!AicLaunchAdminProcess+0x39c
09 001ff1a8 75692bda 000701be 00000000 004285a4 shell32!_SHCreateProcess+0x331
0a 001ff1fc 756853c5 00000001 00426818 00000001 shell32!CExecuteApplication::_CreateProcess+0xfc
0b 001ff20c 75685379 00426818 00426820 00000001 shell32!CExecuteApplication::_TryCreateProcess+0x2e
0c 001ff21c 756847d1 00426820 00403170 001ff24c shell32!CExecuteApplication::_DoApplication+0x48
0d 001ff22c 7569f6b1 00426820 00403170 00426818 shell32!CExecuteApplication::Execute+0x33
0e 001ff24c 75684a1c 00426820 00401bfc 00403178 shell32!CExecuteAssociation::_DoCommand+0x88
0f 001ff270 7569f733 00000000 003e11a8 762d3472 shell32!CExecuteAssociation::_TryApplication+0x41
10 001ff290 75684b63 00403178 003d6248 003d6248 shell32!CExecuteAssociation::Execute+0x5f
11 001ff2bc 75692260 003e11a8 003d6248 001ff398 shell32!CShellExecute::_ExecuteAssoc+0x8c
12 001ff2d8 75686772 00000000 00008140 003d6248 shell32!CShellExecute::_DoExecute+0x89
13 001ff2ec 75691efa 001ff398 00008140 001ff398 shell32!CShellExecute::ExecuteNormal+0x8b
14 001ff300 75691e88 001ff398 0000003c 4a135260 shell32!ShellExecuteNormal+0x33
15 001ff318 4a12580f 001ff398 2aeaa614 003cc870 shell32!ShellExecuteExW+0x62
6.2 _SHCreateProcess
这里最终的请求到了shell32!_SHCreateProcess
这里,看一下这个请求的汇编代码:
如果发现【请求的操作需要提升】, 则使用AicLaunchAdminProcess
提权启动。
整个过程为:
- 使用
CreateProcess
尝试启动进程。 - 如果启动失败,并且发现需要提权的话,调用
AicLaunchAdminProcess
,利用UAC启动进程。
6.3 AicLaunchAdminProcess
AicLaunchAdminProcess
构造RPC请求,并等待RPC返回结果;如下:
启动过程其实就是RPC远程调用的过程:
6.4 返回
使用如下两种方式等待返回:
6.5 svchost 服务
RPC远程调用操作的响应进程为:C:\Windows\system32\svchost.exe -k netsvcs
,这个首先启动一个UAC对话框进程:
consent.exe
进程启动之后,将会在桌面显示UAC对话框
此时consent.exe
的堆栈如下:
等待consent.exe
验证完成之后,在启动真实进程,如下:
从堆栈可以看出来,UAC 主要的实现文件在于 appinfo.dll
这个文件;由于svchost按照没有过滤的令牌启动UAC进程,再讲进程句柄信息返回给父进程。
7. 总结
本文写的比较乱,而且很多是参考了网上一些文章然后自己进行了一些验证和调试,有些图片直接取了网友的图片,在此感谢这些网友的分享;如有疑问和指正欢迎评论和联系。
来源:CSDN
作者:xiangbaohui
链接:https://blog.csdn.net/xiangbaohui/article/details/103704153