[macOS翻译]MacOS 中的守门员:让威胁远离我们的苹果

891 阅读18分钟

本文由 简悦SimpRead 转码, 原文地址 redcanary.com

Gatekeeper 是苹果保护 macOS 用户免受恶意软件和 ot...... 侵扰的核心。

苹果公司对允许用户在其操作系统上安装的软件非常挑剔。这一哲学立场使 macOS 用户免受大量恶意软件的影响,但这一哲学立场得到了一系列令人困惑的独特互补技术的支持。在本文中,我们将解释 Gatekeeper 的由来、工作原理,并希望能消除大家对这项迷人的安全技术的困惑。

本博客的最终目的是介绍对手如何以及为何绕过 Gatekeeper,您可以在我们最新发布的威胁检测报告中了解更多相关信息。因此,我们将从研究 "绕过 Gatekeeper "的标准行业定义入手,然后再深入研究阻挡对手在 macOS 设备上运行简易代码的各种组件。

解决过去的困惑

过去,MITRE 对网守旁路技术的定义 一直与一种名为 "文件隔离"(File Quarantine)的古老而独特的技术紧密相连,最初在 Mac OS X 10.4 Tiger 中被称为下载验证,后来在 Snow Leopard 10.6 中得到扩展。文件隔离 "在很大程度上是应用程序的选择性系统,旨在保护用户免受潜在恶意内容的侵害。这对于经常用于下载文件、应用程序等的网络浏览器和文件共享应用程序尤为重要。对于选择加入的应用程序,macOS 会自动对其创建的文件应用检疫扩展属性 (com.apple.quarantine)。该隔离标志的存在会启动 Gatekeeper 检查。

macOS 支持强制删除扩展属性,因此,简单地删除 com.apple.quarantine 属性并不一定表示或构成 Gatekeeper 旁路事件。

用于绕过网守的原子红队测试正是这样做的:它使用/usr/bin/xattr二进制文件强行删除了文件中的隔离扩展属性,这基本上排除了网守对文件的检查,增加了混乱:

sudo xattr -d com.apple.quarantine #{app_path}

虽然对手过去肯定曾强行删除过隔离扩展属性,但它在良性的自包含应用程序更新中使用得更为频繁,例如 Google Chrome 浏览器的 Keystone 安装程序 ksinstall (see below).

正如我们将在下面的章节和未来的研究中解释的那样,网守旁路包含的攻击性和明显恶意的技术手段要多样化得多,这在很大程度上与受支持的删除隔离扩展属性是分开的。

那么,如何绕过网守呢?

自从引入网守旁路技术以来,MITRE 已经修订了 T1553.001,重点关注以下内容:

  • Exploitation of logic errors within the Gatekeeper stack: 这可能包括利用文件类型检查、"跨进程通信"(XPC)实施、公证票据查询服务、SQLite3 操作等方面的弱点。
  • 利用依赖 macOS 服务中的逻辑错误: 这可能包括 "Security.framework"--安全代码(代码签名)、授权、安全数据、加密、沙箱和加固运行时--但这里的范围很大。其他被利用的框架包括
    • PackageKit.framework
    • XprotectFramework.framework
    • ConfigurationProfiles.framework
    • SoftLinking.framework

    注意:考虑这个问题的一个好方法是,Gatekeeper 会调用这些框架来询问有关给定目标的问题。您能否混淆其中一个或多个框架,使其给出错误的答案?

  • 文件隔离扩展属性传播: 隔离扩展属性是否正确应用于所有 "支持文件隔离 "的下载?稍后再详述。

绕过网守安全控制通常需要至少利用其中一个级别。我们将在后面的章节中讨论历史案例,但首先要快速浏览一下文件隔离和网守。

文件隔离

在深入了解 Gatekeeper 之前,我们需要谈谈与之密切相关的安全控制,即文件隔离。之所以有必要提及这项技术,不仅是因为它在过去曾引起过混乱,还因为 Gatekeeper 部分依赖于它。Tiger 最初的下载验证功能(文件隔离的前身)只是提醒用户 "从网上 "下载的文件是否实际上是一个应用程序(早期版本的伪装检测)。在雪豹系统中,苹果通过 YARA 扩展到了基于静态签名的恶意软件检测。今天,我们将这一功能称为 XProtect,它现在包括补救功能,以及 macOS 13 Ventura 中的大量其他新功能。

我们现在所知道的文件隔离功能主要是由应用程序开发人员选择启用的。当开发者这样做时,系统会对下载的文件应用 com.apple.quarantine 扩展属性(一种文件系统功能:键值对)。扩展属性是键值对,对于隔离扩展属性,分号分隔值 由启动标志、时间戳、应用程序名称和唯一 ID 组成。这些信息用于填充文件隔离数据库(下文将讨论)。

文件隔离 "负责确保已选择加入的应用程序下载的文件被标记为 com.apple.quarantine 扩展属性。应用程序通过在其 Info.plist 中添加 LSFileQuarantineEnabled 键,选择加入文件检疫。选择加入的应用程序被称为 "支持文件隔离"。有趣的是,macOS 在出厂时附带了一个硬编码的应用程序签名标识符列表,对于这些标识符,选择加入过程不是可选的。该列表位于 /System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/Exceptions.plist

下面显示的是 Mozilla Firefox 和 Transmission 的示例条目,它们分别作为网络浏览器和 bittorrent 客户端,应具有文件隔离意识,以保护用户免受潜在恶意软件的侵害。虽然这个硬编码的签名标识符列表为最终用户提供了额外的保护,但需要注意的是,并非所有 "支持互联网 "的应用程序都支持文件隔离功能。

我们遇到的两个例外是 Arc 和 Notion,前者是The Browser Company新推出的一款目前仅限 macOS 使用的网络浏览器,后者是一款协作工作空间和知识管理应用程序。我们向这两家公司的开发团队提交了安全功能请求。

"org.mozilla.firefox": {
  "LSFileQuarantineEnabled": true,
  "LSApplicationCategoryType": "public-category.productivity"
},
"org.m0k.transmission": {
  "LSFileQuarantineEnabled": true,
  "LSApplicationCategoryType": "public-category.internet"
}

我们要感谢 The Browser Company 的优秀团队,感谢他们在Arc 浏览器中启用文件隔离发布之前迅速将其启用。

守门员

直到 Mac OS X 10.7.3 Lion 才将 Gatekeeper 添加到操作系统中(尽管还处于预览状态)--在 Mountain Lion 10.8 中,用户默认启用 Gatekeeper。从那时起,Gatekeeper 在保护 Mac 用户不受不受信任软件侵害方面的作用已扩展到应用程序捆绑防篡改功能 --公开称为安全应用程序更新。苹果应用程序安全模式的总体目标之一是 "默认情况下,macOS 中的所有软件在首次打开时都会检查是否存在已知的恶意内容,无论它是如何到达 Mac 的"。正如我们前面提到的,我们知道只有在 Mac 应用程序开发者的帮助下才能真正实现这一使命。

需要注意的是,默认情况下,Gatekeeper 会在首次启动时检查每个经过公证或隔离的应用程序、可执行文件、UEFI 磁盘映像和平面软件包安装程序(仅列举少数几种下载类型)。此外,macOS 13 新增 Gatekeeper 还能处理已公证应用程序的防篡改功能。该功能的工作原理是确保只有经过批准的开发人员才能更新/修改选定的公证应用程序(Gatekeeper 的 "EvaluationPolicy "类定义的一部分)。完全验证大型应用程序的代码签名需要大量的计算工作(Xcode 就是如此),而这是一种优雅的变通办法。MacOS 会在 /var/db/SystemPolicyConfiguration/TamperExceptions.plist"中保存系统策略防篡改异常列表,而不是在每次启动应用程序时验证代码签名。该列表包含 Apple 和第三方应用程序。在作出防篡改决定前,Gatekeeper 会参考该异常列表。 在进一步了解之前,我们需要了解 Gatekeeper 执行的系统策略类型。

Gatekeeper 应用程序安全策略

在 "系统设置.app "中,用户可以选择是否允许来自以下方面的应用程序:

Mac App Store(在 Mac OS X Lion 10.7 中引入)

Mac App Store 上托管的应用程序必须遵守严格的应用程序安全模式。也就是说,它们必须选择加入 "加固运行时"(运行时代码完整性)并允许应用程序沙箱,而且不能包含系统扩展,不得请求提升至 "root",并且必须是独立的。在托管这些应用程序之前,会对苹果已知的恶意软件进行检查。此外,它们还具有以下证书链:

- Apple Mac OS Application Signing 
- Apple Worldwide Developer Relations Certification Authority 
- Apple Root CA 

受信任的开发者

这些是经过公证的应用程序/插件和经过手动批准的应用程序。公证(于2018 年与 macOS 10.14 Mojave 一起引入)基本上让 Apple 有机会验证准备发布的应用程序(或可执行文件、插件、内核扩展、UDIF 磁盘映像、平面安装包等)的几个关键要素:

  • 所有"代码位置"都有完整有效的代码签名,签名由开发者的 "开发者 ID "应用程序分发证书签署。
  • 包含一个安全时间戳: 这样,macOS 就能根据带有加密时间戳(timestamp.apple.com)的签名检查签名时间。
  • 应用程序选择使用 Hardened Runtime: 运行时完整性保护有助于防止 macOS 上常见的代码注入攻击,包括动态链接库 (DLL) 劫持和内存篡改。加固运行时保护可以有许多例外情况,开发人员可以有选择性地应用这些例外情况来获得额外功能,但代价是攻击面增大(微软的 Visual Studio Code 就是一个很好的例子,它通过选择以下前四项权利来降低加固运行时的安全级别)。常见的运行时异常包括
    • com.apple.security.cs.allow-dyld-environment-variables
    • com.apple.security.cs.allow-jit
    • 允许未签名可执行内存
    • 禁止库验证
    • 禁止可执行页面保护com.apple.security.cs.debugger
  • 应用程序不允许调试: 禁止任意进程连接到您应用程序的 Mach Task/kernel 端口。只需不使用 com.apple.security.get-task-allow 权限签署应用程序即可。在构建调试程序时,Xcode 会自动添加此权限。*为发布版本构建时不应包含此权限。
  • 应用程序与 macOS SDK ≥ 10.9 (Mavericks) 进行了链接。
  • 应用程序不包含 Apple 已知的恶意软件。

*为避免Gatekeeper Path Randomization (GPR),请签署并公证您的 UDIF 磁盘映像。

经过公证的应用程序具有以下证书链:

- Developer ID Application: <Developer_Name> (<Team_ID>)
- Developer ID Certification Authority
- Apple Root CA 

10.9.5 中的 Gatekeeper 将阻止带有由 10.9 以前版本的 macOS 创建的代码签名的公证应用程序。这可确保不存在签名漏洞,并阻止任何应用程序尝试使用 @rpath(10.10.4 Yosemite)加载来自应用程序捆绑包之外的库。 此外,企业还可通过使用移动设备管理 (MDM),指定 "SystemPolicyRule "配置文件特定的有效载荷密钥,创建自己的系统策略规则。在 MDM 和 "SystemPolicyControl "密钥的帮助下,还可以对 Gatekeeper 的整体评估进行管理。

Gatekeeper 支持名为 "开发者工具 "的额外应用程序类别,这是不符合系统安全策略的应用程序的宽泛例外。Gatekeeper 在(透明度、同意和控制)TCC 数据库的 "服务 "列中作为 "kTCCServiceDeveloperTool "键对此进行跟踪。该数据库还列出了应用程序被授权访问受 TCC 保护的服务的原因,如 MDM 策略、系统集、系统策略、预检未知、有权和应用程序类型策略。

除 MDM 外,终端用户还可通过 /usr/bin/spctl 命令行工具管理 Gatekeeper。"spctl "二进制文件还能让用户

  • 启用 Terminal.app 作为开发工具
  • 评估应用程序捆绑包、安装包、磁盘镜像等对象
  • 向网守添加自定义允许规则
  • 更改 Gatekeeper 数据库中的规则
  • 获取 Gatekeeper 的状态
  • 全局启用或禁用网守

网守架构概述

从根本上说,Gatekeeper 的存在是为了帮助用户及其组织指定系统应用安全策略。然后,Gatekeeper 负责以几种关键方式执行该策略。我们可以通过研究已实施的 XPC 服务和它们之间的协议来了解其中的奥秘。

Gatekeeper 以 "LaunchDaemon"(具有 "root "权限)的形式在系统域中运行,地址为 /usr/libexec/syspolicyd.launchd`。它负责托管守护进程,其标签和马赫(XPC)服务名称为

  • com.apple.security.syspolicy
  • com.apple.security.syspolicy.kext
  • com.apple.security.syspolicy.exec
  • com.apple.security.AppleSystemPolicy.mig(与内核的特殊马赫 IPC 通信通道)

Scott Knight 的文章syspolicyd 内部结构进行了全面分析(截至 macOS Mojave)。在此,我们将简要介绍由 com.apple.security.syspolicy XPC 服务实现的各项功能。该服务以 syspolicyd.secassessment.xpcGrand Central Dispatch (GCD) 队列标签运行:

  • assess: 给定目标路径,提取或创建静态属性(如目标的核心基础 URL)。在高层次上,该函数会启动一系列程序,最终调用Security.framework,要求系统对建议的操作(通过启动服务执行、安装和打开文档)进行评估。
  • 更新 对系统策略数据库执行更新(如下所述)
  • 记录 确保连接的客户端拥有 com.apple.private.assessment.recording 权限
  • 取消 取消正在进行的网守对象评估
  • check-dev-id: 该函数虽然有点含糊不清,但试图确定当前系统策略是否允许从已识别的开发者(而非仅从 App Store)启动应用程序。
    • 为此,会调用 -[EvaluationManager currentPolicyRequirement]函数,操作选择器字符串为 ui-get-devid-local。然后,该函数会针对 AllowIdentifiedDevelopers 键和 com.apple.systempolicy.controlapplicationID 调用CFPreferencesAppValueIsForced
    • 可以类似的方式使用ui-status字符串检索 Gatekeeper 的布防状态
  • check-notarized: 与上述函数类似,该函数将尝试检查当前系统策略是否允许从已公证的应用程序启动应用程序。这次的操作字符串是 `ui-get-notarized-local
  • ticket-register: 如果在评估过程中发现本地装订的公证票据,则将其添加到票据数据库的票据表中(下文将讨论)。
  • 票据查询": 与处理本地 "装订 "公证票据的上述函数不同,该函数将尝试通过检查 Apple 的 com.apple.gk.ticket-delivery CloudKit 查找服务来验证公证状态。相关证据将写入统一审计日志(可通过 Console.app查看,请确保启用私人日志)。日志信息示例可在 Apple 开发人员论坛 上找到
  • legacy-check*: 似乎是一个相对较新的函数,用于尝试检查给定公证票据的遗留策略。该函数将调用TicketDatabase函数-[TicketDatabase isLegacyPolicy:],该函数将执行查询SELECT 1 FROMlegacy_policy WHERE hash = ?1`。

此外,它的 LaunchDaemon 定义属性列表 (plist)受到系统完整性保护 (SIP) 的保护,位于 /System/Library/LaunchDaemons/com.apple.security.syspolicy.plist. 在该 plist 中,我们可以注意到它的 XPC 启动事件,这些事件使 XPC 服务能够按需响应请求:

  • com.apple.security.syspolicy.kext.deprecation
  • com.apple.security.syspolicy.check.revocation
  • com.apple.security.syspolicy.legacypolicy
  • com.apple.security.syspolicy.find.bundles
  • com.apple.security.syspolicy.measure
  • com.apple.security.syspolicy.kext.mt
  • com.apple.security.syspolicy.gatekeeper.policy-metrics
  • com.apple.security.syspolicy.report
  • com.apple.security.syspolicy.invalidate
  • com.apple.security.syspolicy.rearm

备份数据库

Gatekeeper 由多个 SQLite3 数据库提供支持,用于执行策略、访问规则和例外情况。这些数据库不一定是由 Gatekeeper 创建的(参见附录中的数据库列表),而是 Gatekeeper 在运行时接触到的数据库。下面列出了运行 macOS 13.2 的 Apple Silicon Mac 上的部分数据库和属性。

TCC:/Library/Application Support/com.apple.TCC/TCC.db

  • 表包括: accessaccess_overridesactive_policyadminexpiredpolicies

  • Gatekeeper 会对访问表服务列中的键感兴趣:

    • kTCCServiceDeveloperTool: 允许应用程序在本地运行不符合系统安全策略的软件
  • 当授予资源 TCC 访问权限时,这将反映在此处。

  • 该数据库受系统完整性保护 (SIP) 保护。

检疫:~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2

  • 表包括: LSQuarantineEvent
  • 此单一表格包含以下列: LSQuarantineEventIdentifierLSQuarantineTimeStampLSQuarantineBundleIdentifierLSQuarantineAgentName
  • 当 macOS 隔离新项目时,它们会被添加到这里。
  • 该数据库不受 SIP 保护。

系统策略:/var/db/SystemPolicy

  • 表包括: authority, bookmarkhints, feature, object.

  • 权限表是一个分类账,由允许/拒绝决定、已评估的代码签名要求 "字符串或 "cdhash "以及负责的评估者组成。大多数条目都以 "GKE"(网守排除)作为评估者。受 SIP 保护的 (plist) 清单枚举了这些排除项,位于 /var/db/SystemPolicyConfiguration/gke.bundle/Contents/Resources/gke.auth。有关排除范例,请参阅附录。

  • 当 Gatekeeper 对新应用程序进行评估时,"权限 "表将反映出这一点。正如*OS Internals Volume III(第 106 页)所述,特性表由代码验证的元数据类特性和 GKE 验证的特性组成。

  • 该数据库不受 SIP 保护。

ExecPolicy: /var/db/SystemPolicyConfiguration/ExecPolicy

  • 表包括: executable_measurements_v2, policy_scan_cache, legacy_exec_history_v4, policy_scan_cache_by_path, old_platform_cache, provenance_tracking, policy_cache_by_path_meta, scan_targets_v2, policy_cache_meta, settings

  • Gatekeeper 广泛使用该数据库,扫描缓存表会根据任何扫描结果进行更新。

  • 该数据库受 SIP 保护。

KextPolicy: /var/db/SystemPolicyConfiguration/KextPolicy\

  • 由于 macOS 内核扩展已逐步淘汰,我们选择不再进一步分析此数据库。
  • 该数据库受 SIP 保护。

Tickets: /var/db/SystemPolicyConfiguration/Tickets

  • 表包括: hasheslegacy_policysettingstickets

  • 该数据库通常包含公证票据哈希值的持久存储,但在我们分析期间,settingslegacy_policy表为空。

  • 该数据库受 SIP 保护。

结论

我们希望这些信息能帮助您更好地了解 Gatekeeper 的工作原理及其依赖的各种技术。虽然我们在概念层面上简要介绍了 Gatekeeper 的利用和旁路技术,但我们将把对 Gatekeeper 旁路技术的更详细探讨留待今后发表。

为此,我们将在本月晚些时候发布威胁检测报告,其中将包括对 T1553.001:网守旁路的详细分析,包括

  • 对手绕过网守的方式和原因
  • 提供该技术可见性的数据源以及如何收集这些数据源
  • 如何检测网守旁路活动的具体示例
  • 模拟对手绕过网守的测试
  • 限制网守旁路影响的缓解建议

附录

syspolicyd 内嵌 plist 和权限

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>BuildMachineOSBuild</key>
	<string>20A241133</string>
	<key>CFBundleAllowMixedLocalizations</key>
	<true/>
	<key>CFBundleIdentifier</key>
	<string>com.apple.syspolicyd</string>
	<key>CFBundleSupportedPlatforms</key>
	<array>
		<string>MacOSX</string>
	</array>
	<key>DTCompiler</key>
	<string>com.apple.compilers.llvm.clang.1_0</string>
	<key>DTPlatformBuild</key>
	<string>22D46</string>
	<key>DTPlatformName</key>
	<string>macosx</string>
	<key>DTPlatformVersion</key>
	<string>13.2</string>
	<key>DTSDKBuild</key>
	<string>22D46</string>
	<key>DTSDKName</key>
	<string>macosx13.2.internal</string>
	<key>DTXcode</key>
	<string>1400</string>
	<key>DTXcodeBuild</key>
	<string>14A6270d</string>
	<key>LSMinimumSystemVersion</key>
	<string>13.2</string>
</dict>
</plist>

自 macOS Mojave 以来,Gatekeeper 获得了大量新的权限。Scott Knight 在其深入的 syspolicyd 内部演练 中指出,syspolicyd 签名的权限有 6 个,而 macOS 13.2 Ventura 中现在有 26 个。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.keystore.filevault</key>
	<true/>
	<key>com.apple.private.IASInstallerAuthAgent</key>
	<true/>
	<key>com.apple.private.applecredentialmanager.allow</key>
	<true/>
	<key>com.apple.private.bootability</key>
	<true/>
	<key>com.apple.private.endpoint-security.submit.xp</key>
	<true/>
	<key>com.apple.private.iokit.nvram-panicmedic</key>
	<true/>
	<key>com.apple.private.iokit.system-nvram-allow</key>
	<true/>
	<key>com.apple.private.managedclient.configurationprofiles</key>
	<true/>
	<key>com.apple.private.quarantine.control</key>
	<true/>
	<key>com.apple.private.security.appbundle-authority</key>
	<true/>
	<key>com.apple.private.security.bootpolicy</key>
	<true/>
	<key>com.apple.private.security.register-xprotect-profile</key>
	<true/>
	<key>com.apple.private.security.storage.MobileIdentityService</key>
	<true/>
	<key>com.apple.private.security.storage.SystemPolicyConfiguration</key>
	<true/>
	<key>com.apple.private.syspolicy.perform-evaluations</key>
	<true/>
	<key>com.apple.private.tcc.allow</key>
	<array>
		<string>kTCCServiceSystemPolicyAllFiles</string>
	</array>
	<key>com.apple.private.tcc.manager.access.modify</key>
	<array>
		<string>kTCCServiceDeveloperTool</string>
	</array>
	<key>com.apple.private.tcc.manager.access.read</key>
	<array>
		<string>kTCCServiceAll</string>
	</array>
	<key>com.apple.private.tcc.manager.check-by-audit-token</key>
	<array>
		<string>kTCCServiceDeveloperTool</string>
	</array>
	<key>com.apple.private.xprotect</key>
	<true/>
	<key>com.apple.rootless.restricted-nvram-variables</key>
	<true/>
	<key>com.apple.rootless.storage.SystemPolicyConfiguration</key>
	<true/>
	<key>com.apple.rootless.volume.Preboot</key>
	<true/>
	<key>com.apple.rootless.volume.Recovery</key>
	<true/>
	<key>com.apple.rootless.volume.iSCPreboot</key>
	<true/>
	<key>com.apple.rootless.volume.iSCRecovery</key>
	<true/>
</dict>
</plist>

ExecManagerService.

以下函数由 ExecManagerService 实现。

@protocol ExecManager {
    -copyLegacyExecutionHistoryWithReply:
    -canInstallPackage:withUserConsent:withHash:evaluateOnly:synchronousPrompt:withReply:
    -trustPackagePayload:withDestinationTarget:withHashMap:withUserConsent:withReply:
    -notifyInstalledContent:withInstallationType:withReply:
    -performGatekeeperScan:withScanOptions:withUserID:withProgress:withReply:
    -isDeveloperModeEnabledWithReply:
    -setDeveloperModeEnabled:withReply:
    -copyBlockedExecutionPolicyItemsWithReply:
    -isDeveloperToolEnvironmentWithReply:
    -addExceptionForURL:withReply:
    -requestDeveloperToolAccessWithReply:
    -addGatekeeperUserIntent:withReply:
    -addBlockedSoftwareOverride:withReply:
    -setBlockedSoftwareOverride:isEnabled:withReply:
    -getBlockedSoftwareOverride:withReply:
    -isBlockedSoftware:withReply:
    -urlHasGatekeeperException:withReply:
    -showGatekeeperPreflightError:forApp:forUser:withReply:
    -getAllProvenanceEntriesWithReply:
    -findProvenanceEntry:withReply:
    -findProvenanceEntryByID:withReply:
    -findAssociatedProvenanceEntries:withReply:
};

KextManagerService.

同样,KextManagerService 实现了以下功能:

@protocol KernelExtensionPolicyAPI {
	-canLoadKernelExtension:withReply:
	-canLoadKernelExtensionInCache:withReply:
	-teamIdentifierIsAllowed:withReply:
	-isKernelExtensionApprovedByUser:withBundleID:withReply:
	-updatePolicyItems:withContext:withReply:
	-setUserApprovalAllowed:withReply:
	-setApprovalRequiresAdministrator:withReply:
	-getApprovalRequiresAdministratorWithReply:
	-installMDMPayload:withTeams:withExtensions:withContext:withReply:
	-removeMDMPayload:withContext:withReply:
	-enableKernelExtensionManagementForMDM:withReply:
	-copyCurrentPolicyWithReply:
	-copyPendingApprovalsWithReply:
	-areKernelExtensionsApproved:withReply:
	-requestKernelExtensionApprovals:withReply:
	-triggerKernelCollectionRebuildFlow:withKernelExtensions:withReply:
	-triggerKernelCollectionRebuildForMDM:withContext:withReply:
	-getCurrentUAKLHashWithReply:
	-updateLastUsedTimes:withReply:
	-triggerRecoveryJumpToSecurityStartupUtility:
	-triggerPanicMedic:
};

@protocol KernelExtensionPolicyAPI {
	-canLoadKernelExtension:withReply:
	-canLoadKernelExtensionInCache:withReply:
	-teamIdentifierIsAllowed:withReply:
	-isKernelExtensionApprovedByUser:withBundleID:withReply:
	-updatePolicyItems:withContext:withReply:
	-setUserApprovalAllowed:withReply:
	-setApprovalRequiresAdministrator:withReply:
	-getApprovalRequiresAdministratorWithReply:
	-installMDMPayload:withTeams:withExtensions:withContext:withReply:
	-removeMDMPayload:withContext:withReply:
	-enableKernelExtensionManagementForMDM:withReply:
	-copyCurrentPolicyWithReply:
	-copyPendingApprovalsWithReply:
	-areKernelExtensionsApproved:withReply:
	-requestKernelExtensionApprovals:withReply:
	-triggerKernelCollectionRebuildFlow:withKernelExtensions:withReply:
	-triggerKernelCollectionRebuildForMDM:withContext:withReply:
	-getCurrentUAKLHashWithReply:
	-updateLastUsedTimes:withReply:
	-triggerRecoveryJumpToSecurityStartupUtility:
	-triggerPanicMedic:
}

网守排除

下面是 Gatekeeper 添加的两个排除范例。GKE 在 macOS 上用作允许列表。

"38d5fef8-b3cd-4dd2-ad2d-a40e93f18f74": {
  "path": "(gke)",
  "screen": "Id0cf666125d330191b3fd13eea8fc956dbfdbdd2",
  "cdhash": "5a4e4dc97878a7ef283db76cdf584aa4e2de13c8",
  "type": "1",
  "version": 2
},
"8d583ec1-dc81-453c-8a61-2abb4358685c": {
  "path": "(gke)",
  "screen": "R20b40f3d65d00c7ff59802e9a1f50076e50d974c4787837471ad3af4cfd527d7",
  "cdhash": "b4f580ee04aeaaaf48e2647666f4dbed0ce4c502",
  "type": "3",
  "version": 3
}

数据库模式

以下是 Gatekeeper 创建并经常使用的数据库模式的简略列表。

ExecPolicy 数据库

Executable_measurements_v2

CREATE TABLE IF NOT EXISTS executable_measurements_v2 (  is_signed INTEGER,  file_identifier TEXT NOT NULL,  bundle_identifier TEXT,  bundle_version TEXT,  team_identifier TEXT,  signing_identifier TEXT,  cdhash TEXT NOT NULL,  main_executable_hash TEXT,  executable_timestamp INTEGER,  file_size INTEGER,  is_library INTEGER,  is_used INTEGER,  responsible_file_identifier TEXT,  is_valid INTEGER,  is_quarantined INTEGER,  timestamp INTEGER NOT NULL DEFAULT (strftime('%s','now')),  reported_timestamp INTEGER,  PRIMARY KEY (cdhash))

old_platform_cache

CREATE TABLE IF NOT EXISTS old_platform_cache ( key TEXT, ts INTEGER, PRIMARY KEY (key) )CREATE TABLE IF NOT EXISTS scan_targets_v2 (  path TEXT NOT NULL,  responsible_path TEXT,  is_library INTEGER,  is_used INTEGER,  timestamp INTEGER NOT NULL DEFAULT (strftime('%s','now')),  measured_timestamp INTEGER,  deferral_count INTEGER,  PRIMARY KEY (path))

policy_cache_by_path_meta

CREATE TABLE policy_cache_by_path_meta ( meta_id INTEGER PRIMARY KEY AUTOINCREMENT, miss_count INTEGER NOT NULL, last_miss INTEGER NOT NULL, for_entry INTEGER NOT NULL UNIQUE, CONSTRAINT fk_for_entry_by_path  FOREIGN KEY (for_entry)  REFERENCES policy_scan_cache_by_path(pk)  ON DELETE CASCADE )

policy_cache_meta

CREATE TABLE policy_cache_meta ( meta_id INTEGER PRIMARY KEY AUTOINCREMENT, miss_count INTEGER NOT NULL, last_miss INTEGER NOT NULL, for_entry INTEGER NOT NULL UNIQUE, CONSTRAINT fk_for_entry  FOREIGN KEY (for_entry)  REFERENCES policy_scan_cache(pk)  ON DELETE CASCADE )

policy_scan_cache

CREATE TABLE policy_scan_cache (  pk INTEGER PRIMARY KEY AUTOINCREMENT,  volume_uuid TEXT NOT NULL,  object_id INTEGER,  fs_type_name TEXT NOT NULL,  bundle_id TEXT NOT NULL,  cdhash TEXT,  team_identifier TEXT,  signing_identifier TEXT,  policy_match INTEGER,  malware_result INTEGER,  flags INTEGER,  mod_time INTEGER,  timestamp INTEGER NOT NULL,  revocation_check_time INTEGER,  scan_version INTEGER,  UNIQUE(volume_uuid, object_id, fs_type_name))

policy_scan_cache_by_path

CREATE TABLE policy_scan_cache_by_path (  pk INTEGER PRIMARY KEY AUTOINCREMENT,  mount_point TEXT NOT NULL,  mount_relative_path NOT NULL,  fs_type_name NOT NULL,  bundle_id TEXT NOT NULL,  cdhash TEXT,  team_identifier TEXT,  signing_identifier TEXT,  policy_match INTEGER,  malware_result INTEGER,  flags INTEGER,  mod_time INTEGER,  last_used_time INTEGER,  timestamp INTEGER NOT NULL,  revocation_check_time INTEGER,  scan_version INTEGER,  UNIQUE(mount_point, mount_relative_path, fs_type_name))

provenance_tracking

CREATE TABLE provenance_tracking (  pk INTEGER PRIMARY KEY,  url TEXT NOT NULL,  bundle_id TEXT,  cdhash TEXT,  team_identifier TEXT,  signing_identifier TEXT,  flags INTEGER,  timestamp INTEGER NOT NULL,  link_pk INTEGER)

scan_targets_v2

CREATE TABLE IF NOT EXISTS scan_targets_v2 (  path TEXT NOT NULL,  responsible_path TEXT,  is_library INTEGER,  is_used INTEGER,  timestamp INTEGER NOT NULL DEFAULT (strftime('%s','now')),  measured_timestamp INTEGER,  deferral_count INTEGER,  PRIMARY KEY (path))

设置

CREATE TABLE IF NOT EXISTS settings ( name TEXT, value TEXT, PRIMARY KEY (name) )

机票数据库

hashes

CREATE TABLE IF NOT EXISTS hashes (  id INTEGER PRIMARY KEY AUTOINCREMENT,  hash BLOB,  hash_type INTEGER,  ticket_id INTEGER,  FOREIGN KEY(ticket_id) REFERENCES tickets(id) ON DELETE CASCADE)

legacy_policy

CREATE TABLE IF NOT EXISTS legacy_policy (  id INTEGER PRIMARY KEY AUTOINCREMENT,  hash BLOB)

tickets

CREATE TABLE IF NOT EXISTS tickets (  id INTEGER PRIMARY KEY AUTOINCREMENT,  hash BLOB,  hash_type INTEGER,  timestamp INTEGER,  flags INTEGER)

我们的网站使用 cookie 为您提供更好的浏览体验。更多信息请参阅我们的隐私政策。 确定