UAC是微软为提高系统安全性在Windows Vista中引入的技术。UAC要求用户在执行可能影响计算机运行的操作或者在进行可能影响其他用户的设置之前,拥有相应的权限或者管理员密码。UAC在操作启动前对用户身份进行验证,以避免恶意软件和间谍软件在未经许可的情况下在计算机上进行安装操作或者对计算机设置进行更改。
在Windows Vista及更高版本的操作系统中,微软设置了安全控制策略,分为高、中、低三个等级。高等级的进程有管理员权限;中等级的进程有普通用户权限;低等级的进程,权限是有限的,以保证系统在受到安全威胁时造成的损害最小。
需要UAC的授权才能进行的操作列举如下:
-
增加/删除账户。
-
更改账户类型。
-
更改UAC的设置。
-
安装ActiveX。
-
安装/卸载程序。
-
安装设备驱动程序。
-
文件移动/复制Program Files或Windows目录下。
-
查看其他用户的文件夹。
UAC有如下四种设置要求:
-
始终通知:这是最严格的设置,每当有程序需要使用高级别的权限时都会提示本地用户。
-
仅在程序试图更改我的计算机时通知我:这是UAC的默认设置。当本地Windows程序要使用高级别的权限时,不会通知用户。但是,当第三方程序要使用高级别的权限时,会提示本地用户。
-
仅在程序试图更改我的计算机时通知我(不降低桌面的亮度):与上一条设置的要求相同,但在提示用户时不降低桌面的亮度。
-
从不提示:当用户为系统管理员时,所有程序都会以最高权限运行。
一、使用白名单程序绕过UAC分析
在Windows系统中,默认的UAC设置为仅在程序试图更改我的计算机时通知我,这意味着当本地Windows使用高级别的权限时,不会通知用户。例如mmc.exe、eventvwr.exe、wusa.exe、msra.exe,这类程序是以高权限运行时不会触发UAC的白名单程序。利用这样的程序去启动其他程序,会以管理员权限去执行该程序,这样也就绕过了UAC限制。
CompMgmtLauncher.exe是一个白名单程序,程序在启动时会依次查询如下注册表项:
-
HKCU\Software\Classes\mscfile\shell\open\command
-
HKCR\mscfile\shell\open\command
通过Process Monitor可以很清楚地看到该程序在启动时会查询注册表项HKCU\Software\Classes\mscfile\shell\open\command,如果不存在这继续向下查询,如图所示。

值得注意的是,HKCU\Software\Classes\mscfile\shell\open\command注册表项默认不存在,且普通用户可以修改,所以可以使用如下命令,添加一个不存在的键值cmd.exe,劫持原来的启动流程,即可启动高权限的cmd进程,添加成功后效果如图所示。
reg add HKCU\Software\Classes\mscfile\shell\open\command/ve /t REG_SZ /d cmd.exe

此时,点击CompMgmtLauncher.exe,使用Process Explorer可以看到启动了一个高权限的cmd进程,绕过了UAC的限制,如图所示。

二、使用Com组件绕过UAC分析
COM提升名称(COM Elevation Moniker)技术允许运行在用户账户控制下的应用程序用提升权限的方法来激活COM类,以提升COM接口权限。COM组件是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,人们可以开发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。
CLSID是指Windows系统对于不同的应用程序,文件类型,OLE对象,特殊文件夹以及各种系统组件分配的一个唯一表示它的ID代码,用于对其身份的标识和与其他对象进行区分,应用程序通过CLSID来调用对象。
CMSTPLUA COM 接口存在Com接口{3E5FC7F9-9A51-4367-9063-A120244FBEC7},ICMLuaUtil中实现了 ShellExec 方法可供调用,ShellExec方法被调用时会执行任意命令,由于父进程DllHost.exe(/Processid:{3E5FC7F9-9A51-4367-9063-A120244FBEC7})已经作为高权限进程来启动,所以就绕过了UAC。
CMSTPLUA 的C++实现可以参考https://gist.github.com/api0cradle/d4aaef39db0d845627d819b2b6b30512
绕过启动cmd关键代码如下:
#define T_CLSID_CMSTPLUA L"{3E5FC7F9-9A51-4367-9063-A120244FBEC7}"#define T_IID_ICMLuaUtil L"{6EDD6D74-C007-4E75-B76A-E5740995E24C}"......r = CMLuaUtil->lpVtbl->ShellExec(CMLuaUtil, L"C:\\windows\\system32\\cmd.exe", NULL, NULL, SEE_MASK_DEFAULT, SW_SHOW);
编译后执行即可绕过UAC限制,启动一个高权限的cmd进程,如图所示。

三、UACME的使用
hfiref0x在github上整理了各种UAC绕过技术的实现,链接:https://github.com/hfiref0x/UACME,该项目默认采用C#编写,使用Visual studio即可进行编译。
UACME编译成功将在Source\Akagi\output目录生成Akagi.exe,通过传入不同的调用方法编号,即可测试不同的绕过UAC的方法。如下图所示,采用61号方法,该方法通过劫持slui.exe的注册表项HKCU\Software\Classes\exefile\shell\open,绕过UAC限制,最后成功启动了高权限的cmd.exe进程。

不难看出,该项目整理了众多绕过UAC的方法,攻击者可以从中提炼出特定的方法来进行武器化,防御者也可以通过测试每个方法的情况,来测试主机安全性。
四、针对绕过UAC提权的防御措施
在企业网络环境中,防止绕过UAC的最好的方法是不让内网机器的使用者拥有本地管理员权限,从而降低系统遭受攻击的可能性。
在家庭网络环境中,建议使用非管理员权限进行日常办公和娱乐等活动。使用本地管理员权限登录的用户,要将UAC设置为"始终通知"或者删除该用户的本地管理员权限(这样设置后,会像在Windows Vista中一样,总是弹出警告)。另外,可以使用微软的EMET或MalwareBytes来更好地防范0day漏洞。
补充1:微软EMET:操作系统级漏洞缓解工具
EMET通过强制应用内存防护技术,阻断攻击者利用软件漏洞执行恶意代码的路径,尤其针对未打补丁的漏洞。其核心技术包括:
-
数据执行保护(DEP)
- 标记内存页为"不可执行",阻止攻击者通过缓冲区溢出在数据区域(如堆栈)执行恶意代码。
- 例如:当攻击者注入Shellcode时,DEP会触发异常终止进程。
-
地址空间布局随机化(ASLR)
- 随机化程序加载基址,增加攻击者预测关键函数地址(如ROP指令片段)的难度。
- 对不支持ASLR的旧程序(如某些第三方DLL),EMET通过预分配内存强制其随机加载。
-
结构化异常处理保护(SEHOP)
- 防止攻击者覆盖异常处理程序指针(SEH链),阻断利用崩溃控制程序流的攻击。
-
堆喷射防御(Heap Spray Allocation)
- 预分配常见攻击目标地址(如
0x41414141),阻止恶意代码通过JavaScript/Flash注入到固定内存位置。
- 预分配常见攻击目标地址(如
-
导出地址表过滤(EAF)
- 监控对关键系统DLL(如
kernel32.dll)导出表的访问,阻断Metasploit等工具硬编码API地址的攻击。
- 监控对关键系统DLL(如
部署特点:
- 支持企业级批量部署(如SCCM、组策略);
- 2020年已停止支持,但技术理念被Windows Defender Exploit Guard继承。
补充2:Malwarebytes Anti-Exploit:应用行为监控与漏洞阻断
专注于应用层行为分析,通过实时监控程序异常操作拦截0day攻击,无需依赖漏洞特征库:
-
三层防护架构
- 操作系统保护层:检测绕过DEP/ASLR的漏洞利用技术;
- 内存调用保护层:阻止恶意代码从内存执行;
- 应用行为保护层:监控进程异常行为(如非授权内存操作)。
-
勒索软件专项防护
- 通过行为模型检测文件加密行为,及时终止勒索软件进程。
-
机器学习驱动的异常检测
- 使用AI模型识别未知漏洞利用模式,例如异常进程注入或权限提升操作。
-
针对性应用防护
- 免费版:仅保护浏览器、Java插件等高风险入口;
- 高级版:扩展至Office、PDF阅读器、媒体播放器等,支持自定义应用保护。
优势:
- 对勒索软件和漏洞利用工具包(如RIG、Magnitude)拦截率接近100%;
- 与EMET兼容性存疑,官方建议避免同时运行。

实践建议:
- 旧环境防护:EMET仍可辅助加固遗留系统(如Windows XP/Server 2003);
- 现代终端安全:Malwarebytes提供实时行为防护,更适合应对新兴0day威胁。