hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc
2023-08-03 19:12:22 +00:00
..
macos-apple-scripts.md Translated to Chinese 2023-08-03 19:12:22 +00:00
macos-tcc-bypasses.md Translated to Chinese 2023-08-03 19:12:22 +00:00
README.md Translated to Chinese 2023-08-03 19:12:22 +00:00

macOS TCC

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

基本信息

TCC透明度、同意和控制是macOS中的一种机制用于从隐私角度限制和控制应用程序对某些功能的访问。这可以包括位置服务、联系人、照片、麦克风、摄像头、辅助功能、完全磁盘访问等等。

从用户的角度来看当应用程序要访问受TCC保护的功能时他们会看到TCC在起作用。当这种情况发生时用户会收到一个对话框询问他们是否允许访问。

用户也可以通过显式意图授予应用程序对文件的访问权限,例如当用户将文件拖放到程序中时(显然程序应该具有对文件的访问权限)。

TCC提示的示例

TCC由位于/System/Library/PrivateFrameworks/TCC.framework/Resources/tccd守护程序处理,配置在/System/Library/LaunchDaemons/com.apple.tccd.system.plist中(注册了com.apple.tccd.system的mach服务

每个已登录用户定义的用户模式tccd/System/Library/LaunchAgents/com.apple.tccd.plist中运行,注册了com.apple.tccdcom.apple.usernotifications.delegate.com.apple.tccd的mach服务。

权限是从父应用程序继承的,权限是基于Bundle IDDeveloper ID进行跟踪的。

TCC数据库

然后所做的选择将存储在TCC系统范围的数据库中位于**/Library/Application Support/com.apple.TCC/TCC.db$HOME/Library/Application Support/com.apple.TCC/TCC.db用于每个用户的首选项。该数据库受到SIP系统完整性保护的保护但您可以通过授予完全磁盘访问权限**来读取它们。

{% hint style="info" %} 通知中心UI可以对系统TCC数据库进行更改

{% code overflow="wrap" %}

codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/Support/tccd
[..]
com.apple.private.tcc.manager
com.apple.rootless.storage.TCC

{% endcode %}

然而,用户可以使用**tccutil命令行实用程序删除或查询规则**。 {% endhint %}

{% tabs %} {% tab title="用户数据库" %}

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;

{% tab title="系统数据库" %}

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;

{% endtab %} {% endtabs %}

{% hint style="success" %} 检查这两个数据库,您可以查看应用程序已允许、禁止或未拥有的权限(它会要求您提供权限)。 {% endhint %}

  • 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)。
  • 有关表格的其他字段的更多信息,请参阅此博客文章

{% hint style="info" %} 一些 TCC 权限包括kTCCServiceAppleEvents、kTCCServiceCalendar、kTCCServicePhotos... 没有公共列表定义了所有这些权限,但您可以查看这个已知权限列表。 {% endhint %}

您还可以在 系统偏好设置 --> 安全性与隐私 --> 隐私 --> 文件和文件夹 中检查已授予应用程序的权限。

TCC 签名检查

TCC 数据库存储了应用程序的Bundle ID,但它还存储了关于签名信息,以确保请求使用权限的应用程序是正确的应用程序。

{% code overflow="wrap" %}

# From sqlite
sqlite> select hex(csreq) from access where client="ru.keepcoder.Telegram";
#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"

{% endcode %}

权限

应用程序不仅需要请求并获得对某些资源的访问权限还需要具备相关的权限。例如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>

这将避免日历要求用户访问提醒事项、日历和通讯录。

敏感的未受保护的位置

  • $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

{% hint style="info" %} 有趣的是,com.apple.macl 属性由 Sandbox 管理,而不是 tccd {% endhint %}

扩展属性 com.apple.macl 无法像其他扩展属性一样被清除,因为它受到 SIP 的保护。然而,正如在这篇文章中解释的,可以通过将文件进行 压缩,然后 删除 它,最后再进行 解压缩 来禁用它。

参考资料

☁️ HackTricks 云 ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥