第 20 讲:用户权利 ≠ 对象权限;UAC 双令牌
第 20 讲:用户权利 ≠ 对象权限;UAC 双令牌
前面第 9~10 讲教会小王一件事:
想知道能不能打开某个文件夹,就去看门上贴的规矩(ACE / DACL)。
本讲用两则小故事告诉他:世界上还有门上没有写的规矩;以及「我是管理员」为什么还要点同意。
专有名词都放在故事推导之后。
故事一:门上写着「禁止」,备份却成功了
场景
小王在文件服务器上维护项目目录。为了防止误删,他用第 9 讲学过的办法,给自己加了一条 Deny 读取:
icacls E:\财务季报 /deny JZFZ\chengongyi:(OI)(CI)(R)他打开资源管理器,双击 E:\财务季报——果然「拒绝访问」。
小王满意地想:这下连我自己都进不去,够安全了。
第二天,公司夜间备份任务跑完。管理员问:「季报目录备份了吗?」
监控显示:备份成功,文件都在备份盘里。
小王傻了:
门上明明禁止我读,备份怎么还能读走?
小王的错误直觉
「所有能不能读,都只看 icacls 那一张表。」
一起推导
icacls/ 资源管理器安全页,管的是这个文件夹上的规则——第 9、10 讲的 Access Check。- 备份程序往往不是「普通双击打开文件夹」那条路;它需要账户具备一种和某个文件夹无关的能力:被允许做备份。
- 这种能力写在安全策略 / 账户权利里,登录后出现在令牌的特权名单中——不是又一条 ACE。
所以:门上的 Deny 没坏;小王只是看错了「备份走的是哪套规矩」。
现在才起学名
| 故事里的东西 | 官方常叫 |
|---|---|
| 门上贴的规矩(按文件夹) | 对象权限(Permissions) → ACE / DACL |
| 「准不准你备份 / 关机 / 当服务登录」这类能力 | 用户权利(User rights) / 特权(privileges) |
来源:Appendix B - Privileged accounts
(文中区分对象上的 permissions 与 user rights;并提醒高特权很难单靠 ACL 完全挡住。)
小王怎么亲眼看见「特权名单」
whoami /priv可能看到类似(名称随系统语言略有不同):
特权名称 描述 状态
SeLockMemoryPrivilege 锁定内存页 已禁用
SeIncreaseQuotaPrivilege 为进程调整内存配额 已禁用
SeSecurityPrivilege 管理审核和安全日志 已禁用
SeTakeOwnershipPrivilege 取得文件或其他对象的所有权 已禁用
SeLoadDriverPrivilege 加载和卸载设备驱动程序 已禁用
SeSystemProfilePrivilege 配置文件系统性能 已禁用
SeProfileSingleProcessPrivilege 配置文件单一进程 已禁用
SeIncreaseBasePriorityPrivilege 提高计划优先级 已禁用
SeCreatePagefilePrivilege 创建一个页面文件 已禁用
SeBackupPrivilege 备份文件和目录 已禁用
SeRestorePrivilege 还原文件和目录 已禁用
SeShutdownPrivilege 关闭系统 已禁用
SeDebugPrivilege 调试程序 已启用
SeSystemEnvironmentPrivilege 修改固件环境值 已禁用
SeChangeNotifyPrivilege 绕过遍历检查 已启用
SeRemoteShutdownPrivilege 从远程系统强制关机 已禁用
SeUndockPrivilege 从扩展坞上取下计算机 已禁用
SeManageVolumePrivilege 执行卷维护任务 已禁用
SeImpersonatePrivilege 身份验证后模拟客户端 已启用
SeCreateGlobalPrivilege 创建全局对象 已启用
SeIncreaseWorkingSetPrivilege 增加进程工作集 已禁用
SeTimeZonePrivilege 更改时区 已禁用
SeCreateSymbolicLinkPrivilege 创建符号链接 已禁用
SeDelegateSessionUserImpersonatePrivilege 获取同一会话中另一个用户的模拟令牌 已禁用来源:whoami
故事教给你的读法:
- 列表里有「备份…」→ 说明策略上可能授过这项权利;
- 「已禁用」不等于没有,许多备份工具会在需要时再打开它;
- 不要在本讲练习「如何用备份权利去读 Deny 目录」——那是攻击细节,我们只建立正确地图。
故事一收一句
对象权限回答:「这个对象,你能不能怎样。」
用户权利回答:「你的账户在这台机器上,有没有某类系统能力。」
备份成功、资源管理器进不去——两套规矩同时存在,并不矛盾。
顺带一句(呼应第 15 讲):高权账户(如域管)往往还能夺所有权再改门上的字,所以日常别拿域管账号逛网页、翻文件。
来源:同上 Appendix B。
故事二:我明明是管理员,为何还要点「是」?
场景
小王的域账户进了这台电脑的 Administrators 组。同事说:「你是管理员,想装啥装啥。」
他下载了一个开发工具,双击 setup.exe。
屏幕中央跳出对话框:是否允许此应用对设备进行更改?
- 点「否」→ 安装失败或权限不够;
- 点「是」→ 才能继续。
小王又试了一件事:用记事本改C:\Windows\System32\drivers\etc\hosts
- 普通开始菜单打开的记事本 → 保存时失败;
- 右键记事本 → 以管理员身份运行 → 再保存 → 成功。
同一人、同一账户,半天「像管理员」,半天「像路人」。
小王的错误直觉
「账户在管理员组里 = 我打开的每一个程序都是管理员。」
一起推导
- 若管理员一登录,浏览器、聊天软件、邮件附件全部带着完整管理员能力,木马一点就「全权」。
- 系统于是规定:管理员登录时,先准备两张通行证;
- 桌面、资源管理器、普通双击启动的程序 → 默认拿权力较小的那张(日常票);
- 只有你明确同意(对话框点「是」,或「以管理员身份运行」)→ 新进程才拿完整管理员那张。
现在才起学名
| 故事里的东西 | 官方常叫 |
|---|---|
| 这套「默认先降权,要干重活再抬头」 | UAC(User Account Control,用户账户控制) |
| 日常用的那张通行证 | 标准用户令牌(或过滤后的管理员令牌) |
| 点「是」之后的那张 | 管理员令牌 |
来源:How UAC works
.NET 亦概述:Administrators 成员会得到标准令牌与管理员令牌,默认用标准的,需显式提升。
来源:Key security concepts
小王(管理员组成员)登录
→ 系统准备两张令牌:日常票 + 管理员票
→ 桌面 / 普通程序:挂日常票
→ setup.exe 或「以管理员运行」→ 弹出同意
→ 新进程挂管理员票UAC 是什么、能做什么
贴完学名,小王还卡一句:
这个叫 UAC 的东西,到底是干什么的?它能帮我做什么?
用人话先定位置:
UAC(用户账户控制)是本机上的一套约定:管理员登录后,默认先当普通人干活;只有你明确同意(或主动「以管理员身份运行」),新进程才换管理员票去干重活。
它要挡的,主要是「网页木马、邮件附件、误点安装包 → 一上来就全权改机器」。
小王能感受到的「UAC 能做什么」
| UAC 在做的事 | 你平时怎么感觉到 |
|---|---|
| 给管理员准备两张票,桌面默认用日常票 | 登录后浏览器、Office、普通 CMD 并不自动「通杀」系统目录 |
| 要抬权时征求同意 | 弹出「是否允许此应用对设备进行更改?」;或右键「以管理员身份运行」 |
| 按进程发管理员票 | 点「是」只抬这一次新开的程序;旁边未提升的窗口不会一起变神 |
| 和门上的 ACE 一起生效 | 即便已提升,若某文件夹对你 Deny,普通打开路径仍可能进不去(故事一另论备份权利) |
| 降低「日常程序误用高权」的面积 | 恶意软件若只跑在日常票里,改系统、装驱动会更难一步到位 |
一句话:UAC 管的是「本机进程什么时候许用管理员票」,不是又一张写在文件夹上的 ACE。
UAC 不做什么(小王容易误会的边界)
| 它不负责 | 那是谁的事 |
|---|---|
| 决定「这个文件夹谁能读」 | 对象权限 / ACE(第 9~10 讲) |
| 决定「准不准备份整盘、当服务登录」 | 用户权利 / privileges(本讲故事一) |
| 网上证明「我是域里的谁」 | 登录 + Kerberos 等(第 4、16 讲) |
| 当你的「权限总开关面板」 | 关 UAC 只会让双票对照变淡,学不会 ACL,也不等于权限模型更简单 |
小王记一句就够:
UAC 能做的是:默认降权 + 要干重活再问你一声 + 只给同意过的新进程管理员票。
UAC 不能单独保证「文件一定安全」——门上的字、共享两道门、用户权利,还在各自的轨道上。
小王怎么对比两张票
先开一个普通命令提示符:
whoami /groups
whoami /priv再右键 → 以管理员身份运行 开另一个窗口,再执行同样两条。
若两窗真的一中一高,你会看到组的标记、特权多少/状态不一样——这就是「同一账户、不同进程、不同令牌」的现场证据。
若两窗一模一样,先不要否定双令牌:下一节「案例」专门讲小王踩过的坑(其实比的是同一张票、UAC 关了、或 hosts 的门被放宽)。
「我是管理员」描述的是账户可能拥有的资格;
「当前这个记事本能不能改 hosts」看的是这个进程挂的哪张令牌 + 门上的 ACL。
再深入:两张票到底差在哪
第 5 讲 说过:令牌挂在进程上,里面至少有「你是谁、你带哪些组、你有哪些特权」。
UAC 并没有发明第三种「通行证」;它只是规定——管理员登录时,系统先造出两份内容不同的令牌,日常进程揣小的那份。
用人话对照:
| 标准用户令牌(日常票) | 管理员令牌(管理员票) | |
|---|---|---|
| 谁在用 | 桌面、资源管理器、普通双击开的程序 | 点了「是」或以管理员运行后的新进程 |
| 组身份 | 仍知道你是管理员组成员,但管理员组常被标成「限制使用」——日常检查里不当完整管理员用 | 管理员组按完整成员使用 |
| 特权名单 | 许多危险特权被拿掉或保持禁用,列表更「像普通用户」 | 管理员该有的特权更齐、更可用 |
| 改系统目录 / 装软件 | 常因 ACL + 能力不足而失败 | 往往能过(仍要过对象 ACL;见故事一) |
| 完整性级别(一笔) | 较低(Medium) | 较高(High);本讲不展开细节 |
官方把「从完整管理员令牌里收紧得到的那张」也叫 filtered admin token(过滤后的管理员令牌)。
日常口语里说「标准用户令牌」就够:效果上,它让你先像标准用户一样干活。
票怎么传到下一个程序
登录(管理员组成员)
→ 系统准备:日常票 + 管理员票
→ explorer.exe 挂日常票
→ 你在资源管理器里双击记事本
→ 子进程默认继承父进程的日常票
→ 你右键「以管理员身份运行」记事本
→ 弹出 UAC → 同意后,启动的是挂管理员票的新进程
→ 原来那个未提升的记事本窗口不会自动变强三点容易误会、但很重要:
- 同意提升,换的是新进程的令牌,不是「把整个登录会话永久改成管理员」。
- 未提升窗口里再开出来的程序,多半还是日常票——所以「我已经点过一次是」≠「以后所有窗口都是管理员」。
- 真正的标准用户账户(不在 Administrators 里)通常只有一张日常票;要做管理员活,常要另输管理员账号密码(凭据提示),那是另一条路,本讲先抓住「管理员双令牌」即可。
对照实验时看什么(读输出的直觉)
在两个 CMD 窗口(一个普通、一个「以管理员运行」)里各执行:
whoami /groups
whoami /priv建议这样读,不必背每一行:
| 你看哪 | 日常票窗口常见现象 | 管理员票窗口常见现象 |
|---|---|---|
whoami /groups | Administrators 相关行带限制/过滤意味的标记;高完整性相关组可能缺失或不同 | 管理员组以完整方式出现;完整性相关标记更「高」 |
whoami /priv | 特权更少,或多项长期「已禁用」 | 特权更多,或更多项可被工具启用 |
| 实际试一下 | 写 hosts、装到 Program Files 常失败 | 同一操作在同意后常成功 |
环境、语言包、策略不同,具体字符串会变;要建立的是图景,不是背某一版截图。
两窗没有差异、或平时就能改 hosts → 见下一节案例,先搞清「当前窗口到底是哪张票」。
案例:小王两窗 whoami 一模一样,hosts 也能改
小王按上文做完对照实验,却更糊涂了:
一个「普通」CMD,一个「以管理员运行」的 CMD,
whoami /groups和whoami /priv几乎一字不差。
而且记事本不点「以管理员运行」,也能保存hosts。
——那我是不是已经「最高权限」了?双令牌是不是骗人的?
先说结论:多半不是理论坏了,而是这次实验里两个进程揣的本来就是同一张票;或者 hosts 这扇门已经允许日常票写入。
小王真正想问的三件事
| 小王的话 | 翻译成权限语言 |
|---|---|
| 我现在是最高权限了么? | 当前这个进程挂的是日常票还是管理员票?(不是问账户名漂不漂亮) |
| 如果不是,应该如何开启? | 如何让新进程拿到管理员票(提升) |
| 我怎么知道现在是什么权限? | 用哪几个一眼能看的标记判断当前进程 |
故事展开:先学会「看这扇窗是哪张票」
小王打开任意一个命令提示符,只跑:
whoami /groups在输出里找两行(中文系统常见写法;英文系统括号内对照):
| 找什么 | 看见这个 ≈ 日常票 | 看见这个 ≈ 管理员票 |
|---|---|---|
| 强制标签(Mandatory Label) | 强制标签\中强制级别(Medium) | 强制标签\高强制级别(High) |
| Administrators 那一行的「类型/用法」 | 常为「仅用于拒绝」一类(Group used for deny only) | 「已启用」(Enabled) |
我本机的结果
组信息
-----------------
组名 类型 SID 属性
============================================= ====== ================================================ ==========================================
Everyone 已知组 S-1-1-0 必需的组, 启用于默认, 启用的组
BUILTIN\Administrators 别名 S-1-5-32-544 必需的组, 启用于默认, 启用的组, 组的所有者
BUILTIN\Users 别名 S-1-5-32-545 必需的组, 启用于默认, 启用的组
...
Mandatory Label\High Mandatory Level 标签 S-1-16-12288再看窗口标题:已提升的 CMD / PowerShell 标题前常带 「管理员:」。
账户在不在 Administrators 组,回答的是「有没有资格拿管理员票」。
强制标签是 High 还是 Medium,回答的是「眼前这个进程实际揣的是哪张」。
小王这才明白:他之前只比了「两组命令输出像不像」,却没先问「这两个窗口各自是 Medium 还是 High」。
为什么两窗会「碰巧一样」
小王回忆操作过程,对上了几种常见翻车(教学用,按概率从高到低想):
翻车 A:两个窗口其实都是管理员票
- Windows Terminal / 快捷方式勾了「以管理员身份运行」;
- 或者从已经提升的窗口里又开了一个「普通」标签——子进程继承父进程的管理员票;
- 标题栏两边都有「管理员:」,强制标签两边都是 High。
这时 whoami 一样是正常的:你在对比两张同一张管理员票。
翻车 B:UAC 被关掉或策略让管理员不再「先降权」
- 管理员登录后,日常进程也直接揣接近完整的管理员能力;
- 「普通」和「以管理员运行」差异变小甚至消失;
- hosts 随便改、装软件也不怎么弹窗——双令牌对照实验的前提没了。
本讲不把「关掉 UAC」当成推荐操作;只提醒:若对照永远做不出差异,要怀疑策略/开关,而不是怀疑第 5 讲的令牌模型。
翻车 C:其实两个都是日常票
- 第二个窗口并没有真正弹出 UAC 并点「是」;
- 或点了「否」却以为已经提升;
- 两边强制标签都是 Medium,hosts 却仍能改 → 转入下面「hosts 谜题」。
hosts 谜题:能改 ≠ 一定是最高权
路径仍是:C:\Windows\System32\drivers\etc\hosts
小王能保存,只说明:这一次写入,通过了「当前进程令牌 vs 该文件 ACL」的检查(以及若走共享还会有两道门,见 第 10 讲)。常见三种故事:
- 进程已是管理员票(标题有「管理员:」、强制标签 High)→ 过 ACL 很正常。
- UAC 关着,日常就几乎是管理员票 → 看起来「普通记事本也能改」。
- 有人改过 hosts 的 ACL(给 Users / 某域组写权限)→ 日常票也能写;这和第 9 讲「门上的字」是一回事,不能反推「我整机最高权」。
所以:「平常就能改 hosts」不能单独回答「我是不是最高权限」。
小王怎么「正确开启」管理员票(对照实验重做版)
目标:拿到两个强制级别不同的窗口,而不是两个长得像的窗口。
1) 开始菜单搜「命令提示符」→ 普通点开(不要右键管理员)
→ 看标题:不应带「管理员:」
→ whoami /groups → 确认强制标签是「中」
2) 再搜一次「命令提示符」→ 右键「以管理员身份运行」→ UAC 点「是」
→ 看标题:应带「管理员:」
→ whoami /groups → 确认强制标签是「高」
3) 两边都确认后,再比 whoami /priv、再试改 hosts若第 2 步根本不弹 UAC,且普通窗口已经是 High——优先怀疑:终端默认提升,或 UAC/策略已让双票并成一张。
「开启」的准确意思:
让新进程挂上管理员票(同意提升 / 以管理员运行)。
不是把整个登录会话永久改成「最高权限」,也不是在原窗口里改某一项设置开关。
一张表收住小王的三问
| 问题 | 怎么答 |
|---|---|
| 我现在是什么权限? | 看当前窗口:标题有无「管理员:」+ whoami /groups 里强制标签中/高 + Administrators 用法 |
| 我是最高权限了么? | 若强制标签已是 High 且 Administrators 为完整启用 → 当前进程是管理员票;账户层「还能不能更高」本讲不展开(如 SYSTEM 等) |
| 如何开启? | 对新工具:以管理员身份运行并同意 UAC;用强制标签验证提升成功 |
对照实验失败时:先确认两窗强制级别是否真的不同,再谈「双令牌有没有」。
能改 hosts:先问「这扇门的 ACL + 当前是哪张票」,再问「我是不是整机最牛」。
和故事一、前几讲对齐
- 上文故事一:令牌里的特权来自用户权利;日常票/管理员票的特权列表本来就可以不同。
- 第 5 讲:权限检查看的是进程令牌,不是「账户名片上写没写管理员」。
- 第 16 讲:票据解决网上如何证明你是谁;UAC 解决本机进程揣哪张通行证。别混成一个词。
两则故事放在一起(对照)
| 故事一(备份) | 故事二(UAC) | |
|---|---|---|
| 小王困惑 | 门上 Deny,备份却成功 | 是管理员,还要点「是」 |
| 真正变量 | 对象权限 vs 用户权利 | 同一账户的 两张令牌 |
| 怎么看见 | whoami /priv | 提升前后各跑 whoami /groups、whoami /priv |
| 和前几讲 | ACE 仍重要,但不唯一 | 第 5 讲「令牌挂在进程上」在这里落地 |
收束
你现在会了:
(故事一)门上的对象权限 ≠ 账户的用户权利;
(故事二)UAC 负责本机「默认日常票、同意后再给新进程管理员票」;管理员组成员资格 ≠ 当前进程已是管理员票;
(案例)用窗口标题 + 强制标签中/高判断当前进程是哪张票;两窗 whoami 相同或能改 hosts,都不能单独证明「整机最高权」。
系列正文到此。请到 总图 串线复习,或回 索引 跳讲;更多出处见 参考。
← 上一章:第 19 讲:SPN
· 回书稿索引
→ 下一章:第 21 讲:用户权利