macOS Gatekeeper / Quarantine / XProtect
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Gatekeeper 是为 Mac 操作系统开发的安全功能,旨在确保用户 仅运行受信任的软件。它通过 验证用户下载并尝试从 App Store 以外的来源打开的软件(例如应用程序、插件或安装包)来实现。
Gatekeeper 的关键机制在于其 验证 过程。它检查下载的软件是否 由认可的开发者签名,以确保软件的真实性。此外,它还确认该软件是否 经过 Apple 的公证,以确认其不含已知的恶意内容,并且在公证后未被篡改。
此外,Gatekeeper 通过 提示用户批准首次打开下载的软件 来增强用户控制和安全性。此保护措施有助于防止用户无意中运行可能有害的可执行代码,而将其误认为无害的数据文件。
应用程序签名,也称为代码签名,是 Apple 安全基础设施的关键组成部分。它们用于 验证软件作者的身份(开发者),并确保代码自上次签名以来未被篡改。
其工作原理如下:
签名应用程序: 当开发者准备分发其应用程序时,他们 使用私钥签名应用程序。此私钥与 Apple 在开发者注册 Apple Developer Program 时向开发者颁发的证书 相关联。签名过程涉及创建应用程序所有部分的加密哈希,并使用开发者的私钥对该哈希进行加密。
分发应用程序: 签名的应用程序随后与开发者的证书一起分发给用户,该证书包含相应的公钥。
验证应用程序: 当用户下载并尝试运行该应用程序时,他们的 Mac 操作系统使用开发者证书中的公钥解密哈希。然后,它根据应用程序的当前状态重新计算哈希,并将其与解密后的哈希进行比较。如果它们匹配,则意味着 自开发者签名以来,应用程序未被修改,系统允许该应用程序运行。
应用程序签名是 Apple Gatekeeper 技术的重要组成部分。当用户尝试 打开从互联网下载的应用程序 时,Gatekeeper 会验证应用程序签名。如果它是由 Apple 向已知开发者颁发的证书签名,并且代码未被篡改,Gatekeeper 允许该应用程序运行。否则,它会阻止该应用程序并提醒用户。
从 macOS Catalina 开始,Gatekeeper 还检查应用程序是否经过 Apple 的公证,增加了一层额外的安全性。公证过程检查应用程序是否存在已知的安全问题和恶意代码,如果这些检查通过,Apple 会向应用程序添加一个 Gatekeeper 可以验证的票据。
在检查某些 恶意软件样本 时,您应始终 检查二进制文件的签名,因为 签名 的开发者可能已经 与恶意软件相关。
苹果的 notarization 过程作为额外的保护措施,旨在保护用户免受潜在有害软件的影响。它涉及 开发者提交他们的应用程序进行审查,由 苹果的 Notary Service 进行,这与应用审核不应混淆。该服务是一个 自动化系统,对提交的软件进行审查,以检查是否存在 恶意内容 和任何潜在的代码签名问题。
如果软件 通过 了这次检查而没有引发任何问题,Notary Service 会生成一个 notarization 票据。开发者随后需要 将此票据附加到他们的软件上,这个过程称为“stapling”。此外,notarization 票据也会在线发布,Gatekeeper,苹果的安全技术,可以访问它。
在用户首次安装或执行软件时,notarization 票据的存在 - 无论是附加在可执行文件上还是在线找到 - 通知 Gatekeeper 该软件已由苹果进行 notarization。因此,Gatekeeper 在初始启动对话框中显示描述性消息,指示该软件已通过苹果的恶意内容检查。这个过程增强了用户对他们在系统上安装或运行的软件安全性的信心。
请注意,从 Sequoia 版本开始,spctl
不再允许修改 Gatekeeper 配置。
spctl
是用于枚举和与 Gatekeeper 交互的 CLI 工具(通过 XPC 消息与 syspolicyd
守护进程交互)。例如,可以使用以下命令查看 GateKeeper 的 状态:
请注意,GateKeeper 签名检查仅对 具有隔离属性的文件 进行,而不是对每个文件进行检查。
GateKeeper 将根据 首选项和签名 检查二进制文件是否可以执行:
syspolicyd
是负责执行 Gatekeeper 的主要守护进程。它维护一个位于 /var/db/SystemPolicy
的数据库,可以在 这里找到支持该数据库的代码 和 这里找到 SQL 模板。请注意,该数据库不受 SIP 限制,并且可以由 root 写入,数据库 /var/db/.SystemPolicy-default
用作原始备份,以防其他数据库损坏。
此外,/var/db/gke.bundle
和 /var/db/gkopaque.bundle
中包含插入数据库的规则文件。您可以使用 root 权限检查此数据库:
syspolicyd
还暴露了一个 XPC 服务器,具有不同的操作,如 assess
、update
、record
和 cancel
,这些操作也可以通过 Security.framework
的 SecAssessment*
API 访问,而 xpctl
实际上是通过 XPC 与 syspolicyd
进行通信。
注意第一个规则以 "App Store" 结束,第二个规则以 "Developer ID" 结束,并且在之前的图像中,它是 启用从 App Store 和已识别开发者执行应用程序。 如果您 修改 该设置为 App Store,"Notarized Developer ID" 规则将消失。
还有成千上万的 类型 GKE 规则:
这些是来自以下位置的哈希值:
/var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth
/var/db/gke.bundle/Contents/Resources/gk.db
/var/db/gkopaque.bundle/Contents/Resources/gkopaque.db
或者你可以使用以下命令列出之前的信息:
选项 --master-disable
和 --global-disable
的 spctl
将完全 禁用 这些签名检查:
当完全启用时,将出现一个新选项:
可以通过以下方式检查一个应用是否会被GateKeeper允许:
可以在GateKeeper中添加新规则,以允许某些应用程序的执行:
关于 内核扩展,文件夹 /var/db/SystemPolicyConfiguration
包含允许加载的 kext 列表文件。此外,spctl
拥有 com.apple.private.iokit.nvram-csr
权限,因为它能够添加需要在 NVRAM 中以 kext-allowed-teams
键保存的新预先批准的内核扩展。
在 下载 应用程序或文件时,特定的 macOS 应用程序(如网页浏览器或电子邮件客户端)会将一个扩展文件属性,通常称为 "隔离标志",附加到下载的文件上。此属性作为安全措施,标记文件 来自不受信任的来源(互联网),并可能带来风险。然而,并非所有应用程序都会附加此属性,例如,常见的 BitTorrent 客户端软件通常会绕过此过程。
隔离标志的存在在用户尝试执行文件时会触发 macOS 的 Gatekeeper 安全功能。
在 隔离标志不存在 的情况下(例如通过某些 BitTorrent 客户端下载的文件),Gatekeeper 的 检查可能不会执行。因此,用户在打开来自不太安全或未知来源的文件时应谨慎。
检查 代码签名的 有效性 是一个 资源密集型 过程,包括生成代码及其所有捆绑资源的加密 哈希。此外,检查证书有效性还涉及对 Apple 服务器进行 在线检查,以查看其在发放后是否被撤销。因此,完整的代码签名和公证检查在每次启动应用时都是 不切实际的。
因此,这些检查 仅在执行带有隔离属性的应用时运行。
此属性必须由 创建/下载 文件的应用程序 设置。
然而,被沙盒化的文件将对它们创建的每个文件设置此属性。而非沙盒应用可以自行设置,或在 Info.plist 中指定 LSFileQuarantineEnabled 键,这将使系统在创建的文件上设置 com.apple.quarantine
扩展属性。
此外,所有调用 qtn_proc_apply_to_self
的进程创建的文件都是隔离的。或者 API qtn_file_apply_to_path
将隔离属性添加到指定的文件路径。
可以使用以下命令 检查其状态并启用/禁用(需要 root 权限):
您还可以使用以下命令查找文件是否具有隔离扩展属性:
检查扩展 属性的值,并找出写入隔离属性的应用程序:
实际上,一个进程“可以为它创建的文件设置隔离标志”(我已经尝试在创建的文件中应用 USER_APPROVED 标志,但它不会应用):
学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)