ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

为什么 RemoveMacAI 可以不碰 /System 也不动 SIP?fail-closed 设计与私有 API 运行时查找详解

为什么 RemoveMacAI 可以不碰 /System 也不动 SIP?fail-closed 设计与私有 API 运行时查找详解 为什么 RemoveMacAI 可以不碰 /System 也不动 SIPfail-closed 设计与私有 API 运行时查找详解【免费下载链接】RemoveMacAITurn off Apple Intelligence on macOS 27 and get its disk space back. One command, fully reversible.项目地址: https://gitcode.com/gh_mirrors/re/RemoveMacAIRemoveMacAI是一个面向 macOS 27 的开源命令行工具一条命令关闭 Apple Intelligence 的全部功能、删掉已下载的 AI 模型把十几 GB 的磁盘空间找回来并且完全可逆——它的做法既不直接修改受 SIP 保护的/System目录也不关闭系统完整性保护而是靠配置描述文件configuration profile 私有 API 运行时查找 fail-closed出错即拒绝的三层设计实现。这篇文章用最少的代码讲清楚它为什么敢这么安全。为什么直接删 /System 文件行不通在 macOS 27 中Apple Intelligence 的基础模型、图像生成模型等并不在用户目录而是作为资产asset存放在系统受保护的区域如/System/Library/AssetsV2/下的资产文件夹。这些路径受System Integrity ProtectionSIP系统完整性保护约束普通用户进程甚至sudo无法改写/System下的文件关闭 SIP 才能硬删但那是拿整机安全换空间任何负责任的工具都不会这么做。所以问题的正确提法是如何让系统自己删掉这些模型这正是 RemoveMacAI 的设计起点。RemoveMacAI 的三层设计一条命令背后发生了什么运行removemacai后工具实际做了三件互相独立、每步都可验证的事1️⃣ 配置描述文件只动设置不动文件工具生成一个 RemoveMacAI.mobileconfig 描述文件由用户手动在系统设置中批准安装——这一步完全走 Apple 官方机制工具本身不做任何提权。它包含三类 payload限制键restrictions例如allowAssistant、allowWritingTools、allowGenmoji等对应 Siri、写作工具、Genmoji 等功能开关强制偏好forced preferences覆盖那些没有限制键的设置项如通知摘要、行内文本预测来源定义在 Catalog.swift下载阻断键为每个待删模型设置DownloadServerBaseURLOverride-前缀的键把下载服务器指向一个本地关闭端口https://127.0.0.1:9/removemacai-blocked/。macOS 再想下载该模型时会连接失败从而不再回填磁盘。关键点PayloadRemovalDisallowed被设为false描述文件可以被随时移除——移除后所有设置和下载阻断同时失效这就是一条命令可逆的基础。2️⃣ 让 Apple 的资产服务删模型而不是自己删模型文件本身由 Apple 的Unified Asset Framework统一资产框架私有框架管理的 XPC 服务负责。RemoveMacAI 通过该服务的ResetAssetSets操作请求删除这些资产集合——执行删除的是系统自己的服务所以/System全程不被修改SIP 保持开启。相关调用封装在 Sources/UAF/UAF.m接口声明见 Sources/UAF/include/UAF.h。3️⃣ 查询而非假设模型到底删没删removemacai status展示各功能状态与模型占用时会先查资产服务的完整清单inventory再按资产类型汇总磁盘字节数System.swift 中的Models。一个典型的 fail-safe 细节如果模型的资产文件夹存在但我们没有权限读取就按仍在磁盘上处理——宁可误报存在也不谎报已清空。私有 API 运行时查找为什么不直接写死调用UnifiedAssetFramework 是私有框架它的类和方法名没有任何公开承诺随时可能变化。如果把UAFConfigurationManager之类写死在编译期一旦 macOS 更新改了接口程序要么编译失败要么在运行期崩溃甚至误操作。RemoveMacAI 的做法是运行时查找 逐项确认UAF.m步骤做什么找不到怎么办加载框架dlopen加载 UnifiedAssetFramework加载失败即判定资产服务不可用不做删除找类NSClassFromString逐个取管理类类不存在直接返回 nil找方法respondsToSelector/ XPC 协议描述检查方法缺失即报错退出不猜测调用建连接连接com.apple.siri.uaf.subscription.service服务无应答则明确报告资产服务未应答这样每个依赖点都是可检验的接口在就用接口不在就如实说不可用绝不在信息缺失时继续往下走。fail-closed 详解六个宁停勿错的保险丝fail-closed失败即关闭的意思是任何一步验证不通过宁可什么都不做也不带着不确定性执行破坏性操作。在 System.swift 的Models.remove和 UAF.m 中可以看到一整条防线拒绝空列表资产服务会把空列表解读为重置所有资产集合——这等于一次无差别删除。代码在最前端就拒绝空列表UAF.h 中注释也写明了这一点。拒绝未知集合请求删除前每个模型集合都必须能在内置目录 Catalog.swift 中找到否则整体抛错、一个都不删。校验型号没变请求前重新查询该集合当前的assetType必须与本版本工具记录的完全一致才执行——防止 macOS 更新后同名集合指向了别的东西。一次只删一个模型集合逐个请求某个被服务拒绝不影响其余集合且每个失败都会带原因返回给用户。超时即失败每个请求带 120 秒超时超时按资产服务无应答报告而不是当作删除成功CHANGELOG.md 中 0.2.1 就专门修复了服务无应答却误报模型已删除的问题。可离线自检removemacai selftest会验证整套关键不变量——空列表被拒、未知集合被拒、保留功能不牵连共享模型、描述文件 UUID 稳定唯一等SelfTest.swift不触碰系统任何状态。这套设计的收益很直观即使某天 Apple 改动了私有接口工具的最坏情况也只是明确报错、原样退出而不是删错东西。可逆性revert 一条命令一切复原因为所有改动都挂在两样官方可移除的东西上——描述文件和资产服务状态——恢复也就对称地简单removemacai revert移除描述文件限制键、强制偏好、下载阻断同时失效某个功能重新需要模型时macOS 会通过资产服务正常重新下载与全新系统行为一致描述文件在系统更新后仍然有效见 README.md 的 FAQ不会被静默清掉。运行removemacai status可以核对每一项功能与模型的去向输出形如如何试用 RemoveMacAI要求Apple 芯片 Mac macOS 27。安装脚本只做下载 校验 SHA-256 运行不往系统里装任何东西install.sh也可以用 Homebrew 安装后直接运行removemacai。常用命令命令作用removemacai查看当前状态确认后关闭会请求确认removemacai status查看各功能开关与模型占用removemacai off --keep siri关闭其余功能但保留指定功能removemacai off --dry-run只展示将发生的变更不实际执行removemacai revert撤销全部改动小结RemoveMacAI 回答了一个看似矛盾的问题如何在不削弱 macOS 安全模型的前提下彻底关掉 Apple Intelligence 并回收空间答案是顺着系统来用官方配置描述文件改设置用户批准、可移除用 Apple 自家的资产服务删模型/System与 SIP 全程未动用运行时查找 fail-closed 处理私有接口接口变了就报错停手绝不猜。对想研究如何安全地调用私有 API的工程师Sources/UAF/ 与 Sources/removemacai/ 是一份干净、可对照学习的实现范本。【免费下载链接】RemoveMacAITurn off Apple Intelligence on macOS 27 and get its disk space back. One command, fully reversible.项目地址: https://gitcode.com/gh_mirrors/re/RemoveMacAI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表