Windows UAC 实现原理

为君一笑 提交于 2019-12-26 06:55:28

Windows UAC 实现原理

在XP的时代,只要是管理员权限的用户,就基本可以为所欲为了,这给编程者带来的方便(例如编程的时候随便干什么事情都是被允许的),但是给客户的使用带来了很大的危害,因为用户权限太大,如果被别有用心的人利用,那么可以非常容易做所有的事情。

从vista开始,微软引入了UAC,解决了这种不安全性,下面看一下UAC的基础知识信息。

1. 工作流程

UAC 是微软在 Windows Vista 以后版本引入的一种安全机制,通过 UAC,应用程序和任务可始终在非管理员帐户的安全上下文中运行,除非管理员特别授予管理员级别的系统访问权限。UAC 可以阻止未经授权的应用程序自动进行安装,并防止无意中更改系统设置。

在这里插入图片描述

从图上可以看到,如果要获取管理员权限,通过的路径有以下几条:

  1. 进程已经拥有管理权限控制;
  2. 进程被用户允许通过管理员权限运行。

2. UAC 实现方法(用户登陆过程)

UAC有如下概念和特性:

  1. ACL(Access Control List):Windows 中所有资源都有 ACL ,这个列表决定了拥有何种权限的用户/进程能够这个资源。
  2. 在开启了 UAC 之后,如果用户是标准用户, Windows 会给用户分配一个标准 Access Token.
  3. 如果用户以管理员权限登陆,会生成两份访问令牌,一份是完整的管理员访问令牌(Full Access Token),一份是标准用户令牌。一般情况下会以标准用户权限启动 Explorer.exe 进程。如果用户同意,则赋予完整管理员权限访问令牌进行操作。
    在这里插入图片描述

3. UAC 架构

这个UAC的基本框架如下:
在这里插入图片描述

4. 触发UAC

UAC需要授权的动作包括:

  1. 配置Windows Update
  2. 增加或删除用户账户
  3. 改变用户的账户类型
  4. 改变UAC设置
  5. 安装ActiveX
  6. 安装或移除程序
  7. 安装设备驱动程序
  8. 设置家长控制
  9. 将文件移动或复制到Program Files或Windows目录
  10. 查看其他用户文件夹

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 虚拟化分为两个部分,文件虚拟化和注册表虚拟化。

在这里插入图片描述

要注意的是,在以下情况下,虚拟化不可用:

  1. 64 位程序
  2. 非交互式程序
  3. 模拟令牌的进程 (Processes that impersonate)
  4. 内核模式调用方
  5. 带有 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提权启动。
在这里插入图片描述
整个过程为

  1. 使用CreateProcess尝试启动进程。
  2. 如果启动失败,并且发现需要提权的话,调用AicLaunchAdminProcess,利用UAC启动进程。

6.3 AicLaunchAdminProcess

AicLaunchAdminProcess构造RPC请求,并等待RPC返回结果;如下:
在这里插入图片描述
启动过程其实就是RPC远程调用的过程:

在这里插入图片描述

6.4 返回

使用如下两种方式等待返回:
在这里插入图片描述

6.5 svchost 服务

RPC远程调用操作的响应进程为:C:\Windows\system32\svchost.exe -k netsvcs,这个首先启动一个UAC对话框进程:
image

consent.exe进程启动之后,将会在桌面显示UAC对话框

在这里插入图片描述

此时consent.exe的堆栈如下:
在这里插入图片描述

等待consent.exe验证完成之后,在启动真实进程,如下:

在这里插入图片描述

从堆栈可以看出来,UAC 主要的实现文件在于 appinfo.dll 这个文件;由于svchost按照没有过滤的令牌启动UAC进程,再讲进程句柄信息返回给父进程。

7. 总结

本文写的比较乱,而且很多是参考了网上一些文章然后自己进行了一些验证和调试,有些图片直接取了网友的图片,在此感谢这些网友的分享;如有疑问和指正欢迎评论和联系。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!