Gatekeeper并非病毒扫描器,而是基于隔离属性、代码签名状态和公证状态三要素的本地静态验证机制,仅拦截未签名/未公证图形应用的首次双击启动。
macos gatekeeper 并不是靠“扫描病毒”来识别未签名应用,而是通过一套基于元数据和执行路径的静态验证机制,在应用启动瞬间做出拦截判断。它不依赖实时行为分析,也不需要联网查库,整个过程在本地完成、毫秒级响应。
Gatekeeper 的识别依据
Gatekeeper 主要检查三类关键信息:
- 隔离属性(com.apple.quarantine):只要应用是通过 Safari、Chrome、邮件附件、AirDrop 或解压 zip/dmg 得到的,系统会自动打上这个扩展属性。它是 Gatekeeper 触发弹窗的首要信号。
-
代码签名状态:用
codesign -dv可查到 Authority 字段。若显示 Developer ID Application 或 Apple Distribution,说明已签名;若为空、显示 adhoc 或 unidentified developer,即视为未签名或签名无效。 -
公证状态(Notarization ticket):即使有 Developer ID 签名,macOS Catalina 及更新系统仍要求必须通过苹果公证服务。Gatekeeper 会检查应用是否携带有效的
com.apple.notarization-info或相关票据属性。
Gatekeeper 的阻断时机与范围
它只在特定场景下生效,不是对所有程序“一视同仁”:
- 仅拦截图形界面应用(.app)首次双击运行,比如从访达里点开 VS Code、Obsidian 或下载的安装器。
- 不拦截终端中直接执行的命令行工具(如
./mytool)、Xcode 调试构建产物、或已签名但未公证的 App 在终端里用open命令启动。 - 对已信任的应用(比如你点过“仍要打开”的),系统会记录其哈希和签名信息,后续双击不再弹窗——这不是绕过,而是信任缓存生效。
为什么提示“已损坏”其实是误报
当你看到「xxx.app 已损坏,无法打开」这类提示,99% 情况下不是文件真坏了,而是 Gatekeeper 发现它带 quarantine 属性,又没有效签名,就伪造了“损坏”说法来强化用户警惕。你可以用这条命令确认:
如果输出里有 com.apple.quarantine,就坐实了这是隔离机制在起作用,不是磁盘错误或传输问题。
Gatekeeper 不做哪些事
它不会:
- 扫描应用内部代码是否含恶意逻辑(那是 XProtect 和 MRT 的职责);
- 阻止你手动执行任何二进制(哪怕它是木马,只要你用终端运行,Gatekeeper 就不管);
- 干预 App Store 应用或系统自带软件,它们走的是另一套签名验证流程。



















