macOS Gatekeeper / Quarantine / XProtect

Gatekeeper
Gatekeeper是为Mac操作系统开发的安全功能,旨在确保用户在其系统上仅运行可信软件。它通过验证用户从App Store之外的来源下载并尝试打开的软件(如应用程序、插件或安装程序包)来发挥作用。
Gatekeeper的关键机制在于其验证过程。它检查下载的软件是否由认可的开发人员签名,确保软件的真实性。此外,它还确定软件是否被苹果公证,以确认其不包含已知的恶意内容,并且在公证后未被篡改。
此外,Gatekeeper通过提示用户批准首次打开下载的软件来加强用户控制和安全性。这种保护措施有助于防止用户无意中运行可能被误认为是无害数据文件的潜在有害可执行代码。
应用程序签名
应用程序签名,也称为代码签名,是Apple安全基础设施的关键组成部分。它用于验证软件作者(开发人员)的身份,并确保代码自上次签名以来未被篡改。
工作原理如下:
签署应用程序:当开发人员准备分发他们的应用程序时,他们会使用私钥对应用程序进行签名。此私钥与开发人员在加入Apple开发人员计划时获得的证书相关联。签名过程涉及创建应用程序所有部分的加密哈希,并使用开发人员的私钥对此哈希进行加密。
**分发应用程序:**签名的应用程序随后与开发人员的证书一起分发给用户,该证书包含相应的公钥。
验证应用程序:当用户下载并尝试运行应用程序时,他们的Mac操作系统使用开发人员证书中的公钥来解密哈希。然后,它根据应用程序的当前状态重新计算哈希,并将其与解密的哈希进行比较。如果它们匹配,这意味着应用程序自开发人员签名以来未被修改,系统允许应用程序运行。
应用程序签名是Apple Gatekeeper技术的重要组成部分。当用户尝试打开从互联网下载的应用程序时,Gatekeeper会验证应用程序签名。如果它使用由苹果颁发给已知开发人员的证书签名,并且代码未被篡改,Gatekeeper允许应用程序运行。否则,它会阻止应用程序并警告用户。
从macOS Catalina开始,Gatekeeper还会检查应用程序是否已被苹果公证,增加了额外的安全层。公证过程会检查应用程序是否存在已知的安全问题和恶意代码,如果这些检查通过,苹果会向应用程序添加Gatekeeper可以验证的凭证。
检查签名
在检查一些恶意软件样本时,您应始终检查二进制文件的签名,因为签署它的开发人员可能已与恶意软件有关。
# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"
# Check if the app’s contents have been modified
codesign --verify --verbose /Applications/Safari.app
# Get entitlements from the binary
codesign -d --entitlements :- /System/Applications/Automator.app # Check the TCC perms
# Check if the signature is valid
spctl --assess --verbose /Applications/Safari.app
# Sign a binary
codesign -s <cert-name-keychain> toolsdemo
验证
苹果的验证流程作为一项额外的保障措施,旨在保护用户免受潜在有害软件的侵害。这涉及开发人员通过苹果的验证服务提交其应用程序进行审查,这与应用审核不应混淆。这项服务是一个自动化系统,用于审查提交的软件是否存在恶意内容以及代码签名是否存在任何潜在问题。
如果软件通过此检查而没有引起任何关注,验证服务将生成一个验证票证。然后开发人员需要将此票证附加到其软件上,这个过程称为“装订”。此外,验证票证也会在线发布,Gatekeeper,苹果的安全技术,可以访问它。
在用户首次安装或执行软件时,验证票证的存在 - 无论是装订到可执行文件还是在线找到 - 通知 Gatekeeper 软件已由苹果进行验证。因此,Gatekeeper 在初始启动对话框中显示一个描述性消息,指示该软件已经通过苹果的恶意内容检查。这个过程增强了用户对其系统上安装或运行的软件安全性的信心。
枚举 Gatekeeper
Gatekeeper 既是几个安全组件,用于阻止不受信任的应用程序执行,也是其中的一个组件。
可以使用以下命令查看 Gatekeeper 的状态:
# Check the status
spctl --status
请注意,GateKeeper 签名检查仅针对具有隔离属性的文件进行,而不是针对每个文件进行。
GateKeeper 将检查二进制文件是否可以执行,根据偏好设置和签名:

保存此配置的数据库位于**/var/db/SystemPolicy
**。您可以以 root 身份检查此数据库:
# Open database
sqlite3 /var/db/SystemPolicy
# Get allowed rules
SELECT requirement,allow,disabled,label from authority where label != 'GKE' and disabled=0;
requirement|allow|disabled|label
anchor apple generic and certificate 1[subject.CN] = "Apple Software Update Certification Authority"|1|0|Apple Installer
anchor apple|1|0|Apple System
anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] exists|1|0|Mac App Store
anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] exists and (certificate leaf[field.1.2.840.113635.100.6.1.14] or certificate leaf[field.1.2.840.113635.100.6.1.13]) and notarized|1|0|Notarized Developer ID
[...]
请注意第一个规则以“App Store”结尾,第二个规则以“Developer ID”结尾,并且在之前的图像中它被设置为允许从App Store和已识别开发者执行应用程序。 如果您将该设置修改为App Store,则“已经过公证的开发者ID”规则将消失。
还有成千上万个类型为GKE的规则:
SELECT requirement,allow,disabled,label from authority where label = 'GKE' limit 5;
cdhash H"b40281d347dc574ae0850682f0fd1173aa2d0a39"|1|0|GKE
cdhash H"5fd63f5342ac0c7c0774ebcbecaf8787367c480f"|1|0|GKE
cdhash H"4317047eefac8125ce4d44cab0eb7b1dff29d19a"|1|0|GKE
cdhash H"0a71962e7a32f0c2b41ddb1fb8403f3420e1d861"|1|0|GKE
cdhash H"8d0d90ff23c3071211646c4c9c607cdb601cb18f"|1|0|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
**
或者你可以列出前面提到的信息:
sudo spctl --list
spctl
的选项 --master-disable
和 --global-disable
将完全禁用这些签名检查:
# Disable GateKeeper
spctl --global-disable
spctl --master-disable
# Enable it
spctl --global-enable
spctl --master-enable
完全启用后,将出现一个新选项:

可以使用以下方法检查 GateKeeper 是否允许某个应用程序:
spctl --assess -v /Applications/App.app
可以通过以下方式向 GateKeeper 添加新规则,允许执行特定应用程序:
# Check if allowed - nop
spctl --assess -v /Applications/App.app
/Applications/App.app: rejected
source=no usable signature
# Add a label and allow this label in GateKeeper
sudo spctl --add --label "whitelist" /Applications/App.app
sudo spctl --enable --label "whitelist"
# Check again - yep
spctl --assess -v /Applications/App.app
/Applications/App.app: accepted
检疫文件
在下载应用程序或文件时,特定的 macOS 应用程序,如网络浏览器或电子邮件客户端,会向下载的文件附加一个称为“检疫标志”的扩展文件属性。该属性作为一项安全措施,将文件标记为来自不受信任的来源(互联网),并可能携带风险。然而,并非所有应用程序都会附加此属性,例如,常见的 BitTorrent 客户端软件通常会绕过此过程。
当用户尝试执行文件时,检疫标志的存在会触发 macOS 的 Gatekeeper 安全功能。
在检疫标志不存在的情况下(例如通过某些 BitTorrent 客户端下载的文件),Gatekeeper 的检查可能不会执行。因此,用户在打开从较不安全或未知来源下载的文件时应谨慎。
此属性必须由创建/下载文件的应用程序设置。
但是,经过沙盒化的文件将为它们创建的每个文件设置此属性。非沙盒化的应用程序可以自行设置,或在 Info.plist 中指定 LSFileQuarantineEnabled 键,系统将在创建的文件上设置 com.apple.quarantine
扩展属性。
可以通过以下方式检查其状态并启用/禁用(需要 root 权限):
spctl --status
assessments enabled
spctl --enable
spctl --disable
#You can also allow nee identifies to execute code using the binary "spctl"
您还可以使用以下方法查找文件是否具有隔离扩展属性:
xattr file.png
com.apple.macl
com.apple.quarantine
检查扩展属性的值,找出写入隔离属性的应用程序:
xattr -l portada.png
com.apple.macl:
00000000 03 00 53 DA 55 1B AE 4C 4E 88 9D CA B7 5C 50 F3 |..S.U..LN.....P.|
00000010 16 94 03 00 27 63 64 97 98 FB 4F 02 84 F3 D0 DB |....'cd...O.....|
00000020 89 53 C3 FC 03 00 27 63 64 97 98 FB 4F 02 84 F3 |.S....'cd...O...|
00000030 D0 DB 89 53 C3 FC 00 00 00 00 00 00 00 00 00 00 |...S............|
00000040 00 00 00 00 00 00 00 00 |........|
00000048
com.apple.quarantine: 00C1;607842eb;Brave;F643CD5F-6071-46AB-83AB-390BA944DEC5
# 00c1 -- It has been allowed to eexcute this file (QTN_FLAG_USER_APPROVED = 0x0040)
# 607842eb -- Timestamp
# Brave -- App
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded
实际上,一个进程“可以为它创建的文件设置隔离标志”(我尝试在创建的文件中应用USER_APPROVED标志,但它不会应用):
最后更新于