macOS Full Disk Access:同意摩擦不等于最小权限
桌面 agent 越来越常把「打开系统设置 → 隐私与安全性 → Full Disk Access」写成安装清单的一步。用户点开开关,换来的是「能读更多本地上下文、能办更多事」的承诺;代价是一次系统级放行——邮件、信息、浏览历史、工作目录之外的文件,都可能落进同一把钥匙能开的范围。Apple 在 2026-10-02 的开发者新闻 里承认:Full Disk Access(以下简称 FDA)本来是给备份类应用开的例外,如今被一些开发者用来在用户未必充分理解的情况下暴露系统上几乎一切敏感数据;随着 AI agent 更强、更自治,这类访问的风险会「大幅上升」。[1]
通告读起来像在修同意体验:以后真想给某应用开这把钥匙,必须经过「非常明确的用户操作」(very explicit user action)。这句话重要,也容易被误读成「Apple 已经把 agent 的本地权限做成了最小权限」。本篇站在机制侧,顺着 for(geeks) 等公开梳理的主张写清楚:更硬的同意摩擦 ≠ 最小权限——没有「只读这个项目目录」的能力声明,没有授权时效,没有说明现有授权是否回收,也没有交代企业侧 MDM / PPPC 怎么变。[2] 只谈机制与硬化清单;不写利用步骤、不写绕过 TCC 的方法、不写 PoC。
FDA 到底是什么:备份例外,不是「多读几个文件夹」
在 macOS 上,隐私敏感访问由 TCC(Transparency, Consent, and Control)管。摄像头、麦克风、位置、受保护文件夹等,通常会在应用真正要用时弹出一次可理解的授权。FDA 特殊之处在于:它大体绕开这些本来用来护住私有数据的控制,好让备份应用能在整机范围内正常工作——这是 Apple 自己在通告里写明的设计动机。[1]
TCC 里对应的服务标识是 kTCCServiceSystemPolicyAllFiles。公开技术说明把 TCC 记成两套结构相同、内容分工不同的 SQLite 库:系统级库放在 /Library/Application Support/com.apple.TCC/TCC.db,用户级库在 ~/Library/Application Support/com.apple.TCC/TCC.db。FDA 与截屏、输入监控一类敏感项,更靠近系统级那一侧,而不是日常「要不要开麦克风」那种用户级请求。[2]
| TCC 库 | 文档化路径 | 常见权限类型(公开说明) |
|---|---|---|
| 系统级(root) | /Library/Application Support/com.apple.TCC/TCC.db | Full Disk Access、截屏、输入监控等 |
| 用户级 | ~/Library/Application Support/com.apple.TCC/TCC.db | 麦克风、摄像头、受保护文件夹、位置等 |
用户现在可以在 系统设置 → 隐私与安全性 → Full Disk Access 里看到请求过 FDA 的应用,以及批准 / 拒绝状态。Apple 的新通告没有说这块界面会被替换成什么,也没有说未来的授权会不会变成限时、限任务、运行时可撤销,或绑到某一类数据源。[2]
再往机制里走一步:普通 TCC 提示往往和「这一刻要干什么」绑在一起——开摄像头是因为要视频通话,读某个文件夹是因为用户刚选了它。FDA 把这种「场景绑定」拆掉。一旦批准,应用不必在每次碰到邮件库、信息库或浏览器配置目录时再解释一次「我为什么要读」。对备份软件,这正是可用性所需;对会自己决定下一步读什么的 agent,这等于把探索范围和任务范围混成同一张授权。用户在设置里看到的开关文案通常很短;通告批评的,正是「没有充分知情与理解」——不是开关不存在,而是开关的语义对多数人来说仍像「让这个应用好用一点」,而不是「允许它越过一批本应逐项询问的护栏」。[1][2]
把这件事说成人话:FDA 不是「多给 agent 一个 Documents 文件夹」。它是一张系统级总钥匙,让选中的软件去读那些普通沙箱与常规隐私提示本应挡住的数据面。Apple 点名的暴露面包括文件、邮件、信息,乃至浏览历史;对通讯类应用,还可能牵连到用户正在对话的那些人的隐私——不只是本机主人自己的数据。[1]
Apple 说了什么,以及刻意没说什么
通告全文不长,事实边界却很清楚。可以钉死的有四条:
- 动机:FDA 主要为备份场景开例外;有开发者用它在用户未充分知情的情况下暴露系统数据。
- 动作:将引入额外控制,让真正想授权的用户只能通过「非常明确的用户操作」完成。
- 风险叙事:AI agent 越能干、越自治,这类访问的风险越大;要让用户先看清风险再做决定。
- 缺省:没有发布日期、没有 beta 构建、没有 API 合同修订、没有迁移窗口、没有「现有授权怎么办」。[1][2][3]
TechCrunch 事后还改过措辞:起初写成 Apple「限制」权限,更正后强调——这是知情同意方向上的收紧,不是已经宣布的新能力上限。[3] 读新闻标题时别把「收紧」自动脑补成「以后 agent 只能读项目目录」。
「非常明确的用户操作」可以落成更醒目的确认框、改过的设置流程、二次确认,或更严的交互。每一种都会降低误点一次就放行的概率。但批准之后,Apple 自己对 FDA 的描述仍然是:能横跨多类敏感数据。同意摩擦管的是「下一次点开开关」;最小权限管的是「打开之后能碰多大范围」。 通告只承诺前者。[2]
更具体地说,通告没有宣布这些常见「收窄」动作中的任何一项:
- 没有「按目录 / 按卷 / 按应用数据类」拆分的 FDA 替代权限;
- 没有「本次会话 / 接下来 24 小时」一类时间盒;
- 没有要求开发者声明「我只要邮件」或「我只要某个项目路径」;
- 没有说已批准应用会重新弹窗、现有授权会撤销,或新控制会回溯生效;
- 没有单独的「agent 专用 entitlement」,也没有把 FDA 从 agent 类软件里拿掉。[1][2]
对依赖 FDA 才能「读懂整台 Mac」的桌面客户端来说,今天技术上仍可走旧路径;通告的含义是:这条路径已经进入「将被加摩擦」的观察名单,而不是「已经被换成 scoped capability」。
同意摩擦 vs 最小权限:差在能力边界
把两个词并排放,产品讨论里最容易搅在一起:
| 同意摩擦(consent friction) | 最小权限(least privilege) | |
|---|---|---|
| 管什么 | 用户是否看清、是否明确点头 | 点头之后进程实际能碰什么 |
| 典型手段 | 更醒目对话框、二次确认、设置路径变长 | 按路径、按 API、按任务、按时限签发能力 |
| Apple 通告现状 | 承诺加强 | 未描述 |
for(geeks) 的核心判断句很直:Apple 承诺的是更强的同意机制,不是一套能让 agent「只读选定项目目录、只做定义好的任务、只碰某一个数据源」而不继承整机可见面的权限模型。[2] 对写 harness 的人,这几乎是同一句站内老话的系统权限版:前门上的「谁说了算」和「批准之后 blast radius 有多大」是两件事。
工程上还有一个常见偷换:把「用户点过允许」写成「我们已做最小权限」。合规清单上,前者叫同意记录;后者叫能力边界设计。两者可以同时存在,但不能互相证明。一次明确的 FDA 批准,最多证明用户在那个交互里点了头;它不证明应用之后只读了完成任务所需的最小集合,也不证明 agent 在多步推理里不会把「顺便扫一下信息」当成合理工具调用。harness 若只有「安装时要过 FDA」这一道门,运行时仍需要:工具 allowlist、路径策略、敏感目录默认拒绝、以及越权时的停跑——这些都属于最小权限 / containment,通告一个字都没承诺替你做。[2][4][7]
对产品经理,翻译成验收标准更清楚:若需求是「agent 能总结当前 git 仓库的改动」,成功用例不应依赖 FDA;若需求是「跨邮件、信息、全盘文件做个人助理」,才进入 FDA 讨论,并且要在威胁模型里单独写「第三方通讯隐私」与「授权不可按任务回收」两条。把第二种需求的安装路径,复用到第一种需求的默认引导里,就是把备份级例外当成增长手段——这也是 Apple 点名「部分开发者用法」时,机制上真正刺痛的地方。[1]
桌面 agent 为什么爱要 FDA,原因也不神秘。本地文件、邮件、信息、浏览器痕迹,都是「更完整上下文」的原料;一次系统级放行,比逐个文件夹弹窗省事得多。代价是:边界塌成一张总开关。用户以为自己在给「这个助手读工作区」;系统语义可能是「这个二进制(以及它能启动的东西)可以越过一批本该单独问的隐私护栏」。站内写 沙箱不够 时强调:墙再高,前门上的权限轴没人管,遏制仍然空洞。FDA 正是前门上的一把粗粒度钥匙——同意框变醒目,不等于钥匙变细。[4]
再对照站内 PixelLeak:那里是 agent 为完成「让评审看见图」自己开出公开出站面;这里是用户(或安装向导)主动把本地读面扩到系统级。形状不同——一个偏出站共享信道,一个偏入站 / 本地读权限——但验收问题同构:任务成功定义有没有把「权限边界」写进硬约束? 若成功定义停在「agent 能办事」,FDA 几乎永远看起来「值得开」;若成功定义还要求「默认不可见邮件 / 信息 / 浏览历史」,你就不会把总钥匙当成安装默认项。[5]
Terminal 与子进程:继承角度(推断,不是 Apple 的 agent 专论)
通告和 TechCrunch / Ars 的报道,焦点都在「应用向用户要 FDA」这一刻。开发者日常还有另一条路径:coding agent 从 Terminal(或同类终端)里拉起。公开开发者论坛里,Apple DTS 工程师描述过 TCC 判定「谁在请求」的方式——找 responsible code(责任代码);用户从 Terminal 跑工具时,责任代码往往是 Terminal。另一段 DTS 说明更直白:给 Terminal.app 开 FDA,是为了让它的子进程(例如经 shell 再调 cp)也能拷那些本来拷不了的东西——Terminal 自己并不拷贝,子进程继承它的访问级别。[6]
把 cp 换成 coding agent,链条形状类似:agent 是 shell 的子进程,它再拉起的命令又是它的子进程。当 TCC 把访问归因到已持有 FDA 的终端时,子进程未必需要自己再拿一张 FDA 授权。这是从 DTS 对「责任代码 / 子进程继承」的公开说明做的推断,不是 Apple 在 10-02 通告里针对某一款 agent 的测试结论,也不是「所有启动路径都一定如此」——公开讨论里同样提到:启动器可以声明放弃责任(disclaimer)、经 launchd 拉起的辅助进程另有规则,且归因算法「未文档化、过去改过、未来还可能改」。[6]
为什么还要把这段写进正式博文?因为同意摩擦只挡「下一次给某个 app 开开关」。若开关很久以前就开给了 Terminal,agent 是后来才装上的,更醒目的确认框帮不上已经放出去的授权。开发者本周更该先打开 Full Disk Access 列表,看终端旁的开关是不是开着——在列表里出现 ≠ 已批准,要以开关状态为准;若开着,问一句「为什么需要」:某一件备份 / 取证工作真要整盘,公开建议更偏向把 FDA 给专用工具,而不是给通用解释器;并实测 TCC 是否真把访问归因到那个工具。[2][6]
这和「沙箱住着 agent」不是同一层。即便把 FDA 从 Terminal 挪走,agent 仍可能拥有你这个用户账号在不需要 FDA 时就能碰到的一切;把那一层收掉,是 containment(遏制)问题,站内 OpenShell / Sentry 与 Hard Stop 谈的是运行时与内核侧停车绳,不能用「别给 Terminal 开 FDA」一句话替代。[7][8]
Muse 与桌面 agent 压力:只记公开事实,不做裁判
通告时机落在桌面 agent 舆论升温的窗口。公开报道提到 Meta 的 Muse、以及其它会引导用户开启 FDA 的桌面客户端;Inc. 专栏作者 Jason Aten 称 Muse 似乎读到了私人信息内容,而他以为自己并未授权。Meta 反驳:Messages 集成是 opt-in,Muse 要读信息内容,需要 macOS 系统级 FDA 与 Messages connector 同时开启。Ars 引述安全研究者 Patrick Wardle 的技术观点:有了 FDA,许多非 root 文件(浏览历史、cookie、聊天等)在文件系统层面本就可读;Meta 公关则反复重申「双开关」口径。Apple 通告没有点名任何具体产品;是否在回应 Muse 争议,公开材料无法裁决——本文也不做裁决。[3][9]
值得留下的机制含义只有两条:
- 产品叙事里的「连接器」与系统叙事里的 FDA 不是同一层。 前者是应用自己的功能开关;后者是 OS 隐私框架里的总钥匙。用户可能只记得点过其中一个。
- 通讯数据牵连第三方。 Apple 特意写:对通讯类应用,宽本地访问可能损害用户正在沟通的那些人的隐私。agent 吞下信息历史,处理的不只是操作者本人的数据。[1]
另有报道提到 ChatGPT Mac 应用曾被指存在可导致敏感数据暴露的缺陷;Apple 并未把通告与该事件或 Muse 绑定,用语保持在「自治 agent 让这类访问风险大幅上升」的一般层。[3] 对读者,正确姿势是:用公开争议理解为什么同意路径被点名,不要把未裁决指控写成已定案。
企业 MDM / PPPC:通告留下的大洞
消费端「用户自己去设置里点」只是 FDA 的一条供给路径。托管 Mac 机队里,MDM 可以通过 PPPC(Privacy Preferences Policy Control)配置描述文件,远程下发 TCC 相关授权。公开材料点名 Intune、Jamf、Addigy 等产品可以走这条路——管理员推 key/value,而不是让每个人在设置里走完一遍。[2]
Apple 没说「非常明确的用户操作」是否只约束手工授权。若只约束手工路径,企业备份、终端安全、应急响应工具 theoretically 仍可经现有 MDM 下发;若底层授权模型一起改,托管部署可能要新的 payload 行为、审计规则和过渡方案。通告对两种情形都沉默。[2]
FDA 本身不「可疑」。备份软件需要宽文件访问,正是 Apple 给出的理由;终端安全与取证也可能要在整机范围采集证据。同一张权限,对「想无摩擦吃到一切本地上下文」的自治客户端同样有吸引力。通告真正承认的是:一次系统级、长期有效的总授权,和「行为可从答问题扩到读信息、搜文件、跨应用动手」的软件,匹配得很差。[1][2]
对安全与桌面工程负责人,眼前没有必须立刻改的 Apple 开关——通告是前瞻性政策方向,不是某一 CVE 的补丁说明。能马上做的,仍是审计现有 FDA 列表,拿掉不需要的项;并单独建一张表:哪些授权来自用户点击,哪些来自 PPPC——后者不会因为消费端对话框变醒目而自动变安全。
另一层容易被消费者新闻盖住的事实:托管环境里,「用户是否理解」本来就不是唯一控制点。安全基线可能要求 EDR / 备份 agent 必装且必有 FDA;开发者笔记本却可能同时装着 coding agent、个人助手、以及开了 FDA 的 Terminal。同一张 PPPC 策略若写得粗,会把「业务必须」和「开发便利」搅在同一桶里。通告落地前,值得先做一次分类:强制业务工具、可选生产力工具、解释器 / IDE 终端、实验性桌面 agent——四类的 FDA 理由与复审周期不应一样。等 Apple 公布设计后再改 payload,至少不会从「全公司一把总钥匙」的混沌状态起步。[2]
硬化清单(高层次,可执行)
下面几条不涉及如何绕过或如何攻击,只服务「缩小 blast radius」:
- 本周打开 Full Disk Access 列表。 路径:系统设置 → 隐私与安全性 → Full Disk Access。核对每一项是否仍有业务理由;备份、安全代理、明确需要的工具留下,说不清的关掉。出现在列表 ≠ 已批准,看开关。[2]
- 别把 Terminal / 通用 shell 的 FDA 当成「开发便利默认项」。 若某件工作真要整盘,优先考虑把授权给专用、可审计的工具,并验证归因,而不是永久开给解释器。[6]
- 桌面 agent 安装向导里,默认拒绝「一键开 FDA」。 产品文案应写清:开了之后可能覆盖邮件 / 信息 / 浏览历史等面,而不只是「当前项目」。若业务其实只需项目目录,用 OS 提供的更窄文件选取 / 书签能力,而不是总钥匙。
- 审计 agent 的「连接器」与本地读路径。 Muse 争议提醒:应用内 connector 与系统 FDA 可能被用户记成两件无关的事;安装文档应把「系统权限 + 产品开关」画在同一张图上。[9]
- 企业侧单独盘点 PPPC。 哪些描述文件授了
SystemPolicyAllFiles(或等价键)、谁审批、多久复审;不要假设未来的「明确用户操作」会自动覆盖托管路径。[2] - 把 FDA 放进威胁模型的「前门」栏,而不是「沙箱已够」栏。 对照站内:沙箱 / Supervisor 管出站与工具边界;FDA 管的是本地隐私护栏是否被总钥匙掀开。两层都要有停跑与审计,不能互相替代。[4][7]
和站内权限轴怎么接
过去两周站内连续写的是同一条轴上的不同切片:
- 沙箱不够:遏制组织失败、信息接入把问题改成流量监视、过度顺从 + 共享信道。
- PixelLeak:任务完成定义过窄时,agent 自己开出公开出站面。
- OpenShell / Sentry:把检查与停车绳放在 agent 信任域外。
- 本篇:OS 级 同意体验 在加硬,但 能力作用域 仍未按最小权限重画。
串起来的验收句可以是:
列出 agent 为「办成这件事」需要的本地读面与出站面;每一面写清授权主体、默认范围、是否可限时 / 可撤销、失败时是否 fail-closed。凡是只能用 FDA 这类总钥匙表达的需求,在设计评审里单独标红——不是禁止,而是承认你在用备份级例外去喂自治软件。
Apple 让下一次「是」更难按。开发者机器上那一次「是」,往往很久以前就按给了终端或备份工具;agent 是后来的房客。同意摩擦值得欢迎;把它读成「macOS 已经给 agent 做好了最小权限」,则是把新闻标题读过了头。
若你只从这篇带走一个判断句,用这一句:把「用户有没有明确点头」和「点头之后能力有多宽」拆成两列来审;Apple 正在加硬第一列,第二列仍是应用、harness 与企业策略自己的作业。 同意摩擦让误授权变贵;最小权限让即使授权,blast radius 仍然可叙述、可收回、可审计。桌面 agent 若继续只用 FDA 表达「我需要本地上下文」,OS 再醒目的对话框,也只是把一次过宽的放行变得更郑重——郑重不等于收窄。
参考
[1] Apple Developer News. Updates to Full Disk Access in macOS. 2026-10-02. https://developer.apple.com/news/?id=p6zjojqw
[2] for(geeks). Apple’s AI-agent fix is consent, not least privilege. 2026-10-02. https://forgeeks.net/apple-agent-consent-not-least-privilege/
[3] Sarah Perez. Apple says it’s tightening macOS ‘Full Disk Access’ controls due to new risks from AI agents. TechCrunch, 2026-10-02. https://techcrunch.com/2026/10/02/apple-says-its-tightening-macos-full-disk-access-controls-due-to-new-risks-from-ai-agents/
[4] 站内:沙箱不够:共享信道上的 rogue agent 与权限轴
[5] 站内:PixelLeak:coding agent 把内部截图推到公开 GitHub
[6] Max Nardit. Full Disk Access gets harder to grant. Your terminal may already hold it. 2026-10-03. https://max.nardit.com/articles/full-disk-access-and-the-agent (Terminal / 责任代码继承为对 DTS 公开说明的推断,非 Apple agent 专测结论)
[7] 站内:NVIDIA OpenShell / Sentry:把 agent 安全边界外移到 runtime
[8] 站内:Hard Stop:内核级抢占与 rogue agent 遏制
[9] Dan Goodin. Apple changes full-disk access permissions to curb abuse from AI agents. Ars Technica, 2026-10-02. https://arstechnica.com/security/2026/10/apple-changes-full-disk-access-permissions-to-curb-abuse-from-ai-agents/