XProtect 不负责鉴别文件来源,只在首次执行时用 YARA 规则扫描已知恶意特征;来源鉴别由 Gatekeeper 和隔离属性(com.apple.quarantine)完成,后者由浏览器等应用自动添加,Gatekeeper 依此及签名/公证状态决定是否放行。
macos 的 xprotect 本身不负责鉴别文件“来源”,它只做一件事:在文件首次执行时,用 yara 规则匹配已知恶意行为特征。真正承担“来源鉴别”职责的是 gatekeeper 和底层的隔离属性(quarantine),xprotect 是在它们放行之后、运行之前再加一道静态扫描。
文件来源鉴别靠的是隔离属性(com.apple.quarantine)
当你从 Safari、Chrome 或邮件等应用下载一个 .app、.pkg 或 .dmg 文件,系统会自动给它打上 com.apple.quarantine 扩展属性——就像贴了一张“来自互联网”的便签。这个属性才是 macOS 判断“这东西是不是网上来的”的直接依据。
-
查看是否被标记:
xattr -l /Applications/SomeApp.app
若输出含
com.apple.quarantine: 0081;67abc123;Safari;...,说明已被隔离。 -
检查原始下载地址(更直观):
mdls -name kMDItemWhereFroms /Applications/SomeApp.app
返回类似
("https://example.com/download/app.dmg"),就是真实来源 URL。
Gatekeeper 基于来源做决策,不是靠 XProtect
Gatekeeper 在你双击打开时才介入,它读取两个关键信息:
- 是否有
com.apple.quarantine属性(决定是否弹警告) - 应用是否签名 + 是否公证(决定能否放行)
它不查网络请求、不追溯域名信誉,只认三类可信来源:
- App Store(签名+沙盒+审核)
- Apple 公证过的 Developer ID 签名(签名有效 + Apple 后台验过无恶意)
- 系统预装(Apple 签名)
XProtect 不看来源,只看内容
XProtect 扫描触发时机是“首次执行”,不管你是从 GitHub 下载的、U 盘拷贝的,还是自己编译的——只要没被系统标记为 quarantine,它可能根本不会扫(因为 Gatekeeper 都没拦,XProtect 默认不主动全盘巡检)。它只对以下情况静默比对:
- 首次启动带 quarantine 标签的可执行文件(.app/.pkg 内二进制)
- 首次打开含脚本的文档(.pdf/.docm 中嵌入的 JS 或 AppleScript)
- 首次调用某些高危命令(如
curl | bash,但仅限终端粘贴防护层,非 XProtect)
它的规则库(XProtect.yara)全是静态特征,比如:
- 特定二进制字节序列(如 AdLoad 的 loader stub)
- 硬编码的恶意域名或路径(如
/tmp/pscr.sh) - 已知混淆模式(如 base64 编码的
osascript -e调用)
所以完整流程是线性的:
下载 → 浏览器写入 com.apple.quarantine → 双击触发 Gatekeeper → Gatekeeper 检查签名与公证 → 放行后、进程加载前 → XProtect 扫描内存镜像或磁盘文件 → 匹配即阻断
来源鉴别这一环,始终由 quarantine 属性和签名证书共同完成,XProtect 只是后续的内容安检员,不参与“你是谁、从哪来”的判断。


















