macOS TCC Bypasses
按功能分类
写入绕过
这不是绕过,这只是TCC的工作原理:它不会阻止写入。如果终端无法访问用户的桌面以读取内容,它仍然可以写入其中:
扩展属性 com.apple.macl
被添加到新的 文件 中,以便让 创建者的应用 能够读取它。
TCC 点击劫持
可以将一个窗口覆盖在 TCC 提示框上,使用户在不知情的情况下接受它。您可以在 TCC-ClickJacking** 中找到 PoC**。
通过任意名称请求 TCC
攻击者可以在 Info.plist
中创建任何名称的应用程序(例如 Finder、Google Chrome...),并让其请求访问某些受 TCC 保护的位置。用户会认为是合法应用程序在请求此访问权限。
此外,可以从 Dock 中移除合法应用程序并将伪造的应用程序放置其中,因此当用户点击伪造的应用程序(可以使用相同的图标)时,它可能调用合法应用程序,请求 TCC 权限并执行恶意软件,使用户相信是合法应用程序请求了访问权限。
更多信息和 PoC 请参阅:
macOS Privilege EscalationSSH 绕过
默认情况下,通过 SSH 访问 具有 "完全磁盘访问权限"。为了禁用此功能,您需要将其列出但禁用(从列表中删除它不会删除这些权限):
在这里,您可以找到一些恶意软件如何绕过此保护的示例:
请注意,现在为了能够启用 SSH,您需要完全磁盘访问权限
处理扩展名 - 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 / 自动化
具有 kTCCServiceAppleEvents
权限的应用程序将能够控制其他应用程序。这意味着它可能能够滥用授予其他应用程序的权限。
有关 Apple 脚本的更多信息,请查看:
macOS Apple Scripts例如,如果一个应用程序具有对 iTerm
的自动化权限,例如在此示例中**Terminal
** 具有对 iTerm 的访问权限:
在 iTerm 上
没有 FDA 的 Terminal 可以调用具有 FDA 的 iTerm,并使用它执行操作:
通过Finder
或者,如果一个应用程序可以通过Finder访问,它可以执行类似这样的脚本:
通过应用程序行为
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:
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);
**其中a
和b
为:
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受保护的信息。
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使用dsexport和dsimport来修改用户的HOME文件夹。
为目标应用程序获取_csreq_ blob。
放置一个带有所需访问权限和_csreq_ blob的虚假_TCC.db_文件。
使用dsexport导出用户的目录服务条目。
修改目录服务条目以更改用户的主目录。
使用dsimport导入修改后的目录服务条目。
停止用户的_tccd_并重新启动该进程。
第二个POC使用了**/usr/libexec/configd
,其中具有值为kTCCServiceSystemPolicySysAdminFiles
的com.apple.private.tcc.allow
权限。
通过使用-t
选项运行configd
,攻击者可以指定要加载的自定义Bundle**。因此,该漏洞替换了使用**configd
代码注入更改用户主目录的dsexport
和dsimport
**方法。
有关更多信息,请查看原始报告。
通过进程注入
有不同的技术可以注入代码到进程中并滥用其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-validation
和 com.apple.private.tcc.manager
。第一个权限允许进行代码注入,第二个权限允许其访问管理 TCC。
该二进制文件允许从文件夹 /Library/Audio/Plug-Ins/HAL
加载第三方插件。因此,可以使用以下 PoC 加载插件并滥用 TCC 权限:
有关更多信息,请查阅原始报告。
设备抽象层(DAL)插件
通过核心媒体I/O(具有**kTCCServiceCamera
的应用程序)打开摄像头流的系统应用程序会在/Library/CoreMediaIO/Plug-Ins/DAL
中加载这些插件**(不受SIP限制)。
只需在那里存储一个具有常见构造函数的库即可用于注入代码。
几个苹果应用程序存在此漏洞。
Firefox
Firefox应用程序具有com.apple.security.cs.disable-library-validation
和com.apple.security.cs.allow-dyld-environment-variables
权限:
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 - 电报
电报具有权限 com.apple.security.cs.allow-dyld-environment-variables
和 com.apple.security.cs.disable-library-validation
,因此可以滥用它来获取其权限,例如使用摄像头录制。您可以在写作中找到有效载荷。
请注意如何使用环境变量加载库,创建了一个自定义 plist 来注入此库,并使用 launchctl
来启动它:
通过打开调用
即使在受沙盒限制的情况下,也可以调用**open
**
终端脚本
在技术人员使用的计算机上,通常会为终端授予完全磁盘访问权限(FDA),并且可以使用它来调用**.terminal
**脚本。
.terminal
脚本是类似于以下具有要在**CommandString
**键中执行的命令的属性列表文件:
一个应用程序可以在诸如 /tmp 这样的位置编写一个终端脚本,并使用如下命令启动它:
通过挂载
CVE-2020-9771 - mount_apfs TCC绕过和提权
任何用户(甚至是非特权用户)都可以创建和挂载一个时间机器快照,并访问该快照的所有文件。
唯一需要的特权是用于应用程序(如Terminal
)具有完全磁盘访问(FDA)权限(kTCCServiceSystemPolicyAllfiles
),需要由管理员授予。
更详细的解释可以在原始报告中找到。
CVE-2021-1784 & CVE-2021-30808 - 在TCC文件上挂载
即使TCC DB文件受到保护,也可以在目录上挂载一个新的TCC.db文件:
查看原始报告中的完整利用。
asr
工具**/usr/sbin/asr
**允许复制整个磁盘并在另一个位置挂载,绕过了TCC保护。
位置服务
在**/var/db/locationd/clients.plist
中有第三个TCC数据库,用于指示允许访问位置服务的客户端。
文件夹/var/db/locationd/
没有受到DMG挂载的保护**,因此可以挂载我们自己的plist。
通过启动应用程序
macOS Auto Start通过grep
在许多情况下,文件会在非受保护的位置存储敏感信息,如电子邮件、电话号码、消息...(这被视为苹果的一个漏洞)。
合成点击
这种方法不再有效,但在过去曾经有效:
另一种方法是使用CoreGraphics事件:
参考
最后更新于