Translated ['src/macos-hardening/macos-security-and-privilege-escalation

This commit is contained in:
Translator 2025-04-13 14:22:28 +00:00
parent f03ab79d13
commit 5bdd32b1ad

View File

@ -4,9 +4,9 @@
## **基本信息** ## **基本信息**
**TCC (透明性、同意和控制)** 是一种安全协议,专注于规范应用程序权限。其主要作用是保护敏感功能,如 **位置服务、联系人、照片、麦克风、相机、辅助功能和完整磁盘访问**。通过在授予应用程序访问这些元素之前要求用户明确同意TCC 增强了隐私和用户对其数据的控制。 **TCC (透明性、同意和控制)** 是一种安全协议,专注于规范应用程序权限。其主要作用是保护敏感功能,如 **位置服务、联系人、照片、麦克风、相机、辅助功能和完整磁盘访问**。通过在授予应用程序访问这些元素之前要求明确的用户同意TCC 增强了隐私和用户对其数据的控制。
当应用程序请求访问受保护的功能时,用户会遇到 TCC。这通过一个提示可见允许用户 **批准或拒绝访问**。此外TCC 还支持用户的直接操作,例如 **将文件拖放到应用程序中**,以授予对特定文件的访问,确保应用程序仅访问明确允许的内容。 当应用程序请求访问受保护的功能时,用户会遇到 TCC。这通过一个提示可见允许用户 **批准或拒绝访问**。此外TCC 还支持直接用户操作,例如 **将文件拖放到应用程序中**,以授予对特定文件的访问,确保应用程序仅访问明确允许的内容。
![TCC 提示的示例](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855) ![TCC 提示的示例](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
@ -14,7 +14,7 @@
每个登录用户都有一个 **用户模式 tccd** 在运行,定义在 `/System/Library/LaunchAgents/com.apple.tccd.plist` 中,注册 mach 服务 `com.apple.tccd``com.apple.usernotifications.delegate.com.apple.tccd` 每个登录用户都有一个 **用户模式 tccd** 在运行,定义在 `/System/Library/LaunchAgents/com.apple.tccd.plist` 中,注册 mach 服务 `com.apple.tccd``com.apple.usernotifications.delegate.com.apple.tccd`
在这里可以看到 tccd 作为系统和用户运行: 在这里可以看到 tccd 作为系统和用户运行:
```bash ```bash
ps -ef | grep tcc ps -ef | grep tcc
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system 0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
@ -105,7 +105,7 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
> 检查两个数据库,您可以查看应用程序允许、禁止或没有的权限(它会请求权限)。 > 检查两个数据库,您可以查看应用程序允许、禁止或没有的权限(它会请求权限)。
- **`service`** 是 TCC **权限** 的字符串表示 - **`service`** 是 TCC **权限** 的字符串表示
- **`client`** 是具有权限的 **bundle ID** 或 **二进制路径** - **`client`** 是具有权限的 **bundle ID** 或 **二进制文件路径**
- **`client_type`** 指示它是 Bundle Identifier(0) 还是绝对路径(1) - **`client_type`** 指示它是 Bundle Identifier(0) 还是绝对路径(1)
<details> <details>
@ -186,7 +186,7 @@ tccutil reset All
``` ```
### TCC 签名检查 ### TCC 签名检查
TCC **数据库** 存储应用程序的 **Bundle ID**,但它还 **存储** **信息** 关于 **签名****确保** 请求使用权限的应用是正确的。 TCC **数据库** 存储应用程序的 **Bundle ID**,但它还 **存储** **信息** 关于 **签名****确保** 请求使用权限的应用程序是正确的。
```bash ```bash
# From sqlite # From sqlite
sqlite> select service, client, hex(csreq) from access where auth_value=2; sqlite> select service, client, hex(csreq) from access where auth_value=2;
@ -199,14 +199,14 @@ 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" (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"
``` ```
> [!WARNING] > [!WARNING]
> 因此,使用相同名称和 ID 的其他应用程序将无法访问授予其他应用程序的权限。 > 因此,使用相同名称和捆绑 ID 的其他应用程序将无法访问授予其他应用程序的权限。
### 权限与 TCC 权限 ### 权限与 TCC 权限
应用程序 **不仅需要** **请求** 并且已经 **获得访问** 某些资源的权限,它们还需要 **拥有相关的权限**。\ 应用程序 **不仅需要** **请求** 并且已经 **获得访问** 某些资源的权限,它们还需要 **拥有相关的权限**。\
例如 **Telegram** 拥有权限 `com.apple.security.device.camera` 来请求 **访问相机**。一个 **没有** 这个 **权限的应用程序将无法** 访问相机(用户甚至不会被询问权限)。 例如 **Telegram** 拥有权限 `com.apple.security.device.camera` 来请求 **访问相机**。一个 **没有** 这个 **权限的应用** 将无法访问相机(用户甚至不会被询问权限)。
然而,对于应用程序 **访问** 某些用户文件夹,如 `~/Desktop``~/Downloads``~/Documents`,它们 **不需要** 任何特定的 **权限**。系统将透明地处理访问并 **根据需要提示用户** 然而,对于应用程序 **访问** 某些用户文件夹,`~/Desktop``~/Downloads``~/Documents`,它们 **不需要** 任何特定的 **权限**。系统将透明地处理访问并 **根据需要提示用户**
苹果的应用程序 **不会生成提示**。它们在其 **权限** 列表中包含 **预先授予的权利**,这意味着它们 **永远不会生成弹出窗口****也** 不会出现在任何 **TCC 数据库** 中。例如: 苹果的应用程序 **不会生成提示**。它们在其 **权限** 列表中包含 **预先授予的权利**,这意味着它们 **永远不会生成弹出窗口****也** 不会出现在任何 **TCC 数据库** 中。例如:
```bash ```bash
@ -222,14 +222,14 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
这将避免日历请求用户访问提醒、日历和地址簿。 这将避免日历请求用户访问提醒、日历和地址簿。
> [!TIP] > [!TIP]
> 除了一些关于权限的官方文档外,还可以找到关于权限的非官方**有趣信息在** [**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl) > 除了一些关于权限的官方文档外,还可以找到关于权限的非官方**有趣信息**在[**https://newosxbook.com/ent.jl**](https://newosxbook.com/ent.jl)
一些 TCC 权限包括kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 没有公开的列表定义所有权限,但您可以查看这个[**已知权限列表**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)。 一些 TCC 权限包括kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... 没有公开的列表定义所有权限,但您可以查看这个[**已知权限列表**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive#service)。
### 敏感未保护位置 ### 敏感未保护位置
- $HOME本身 - $HOME本身
- $HOME/.ssh, $HOME/.aws 等 - $HOME/.ssh, $HOME/.aws,
- /tmp - /tmp
### 用户意图 / com.apple.macl ### 用户意图 / com.apple.macl
@ -400,7 +400,7 @@ EOD
### 自动化 (SE) 到某些 TCC ### 自动化 (SE) 到某些 TCC
**系统事件可以创建文件夹操作,而文件夹操作可以访问一些 TCC 文件夹**(桌面、文档和下载),因此可以使用下脚本来滥用这种行为: **系统事件可以创建文件夹操作,而文件夹操作可以访问一些 TCC 文件夹**(桌面、文档和下载),因此可以使用下脚本来滥用这种行为:
```bash ```bash
# Create script to execute with the action # Create script to execute with the action
cat > "/tmp/script.js" <<EOD cat > "/tmp/script.js" <<EOD
@ -444,7 +444,7 @@ rm "$HOME/Desktop/file"
``` ```
### 自动化 (SE) + 辅助功能 (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** 到 FDA\* ### 自动化 (SE) + 辅助功能 (**`kTCCServicePostEvent`|**`kTCCServiceAccessibility`**)** 到 FDA\*
**`System Events`** + 辅助功能 (**`kTCCServicePostEvent`**) 上的自动化允许向 **进程发送按键**。通过这种方式,您可以滥用 Finder 来更改用户的 TCC.db 或为任意应用程序提供 FDA尽管可能会提示输入密码 **`System Events`** 上的自动化 + 辅助功能 (**`kTCCServicePostEvent`**) 允许向 **进程发送按键**。通过这种方式,您可以滥用 Finder 来更改用户的 TCC.db 或为任意应用程序提供 FDA尽管可能会提示输入密码
Finder 覆盖用户 TCC.db 示例: Finder 覆盖用户 TCC.db 示例:
```applescript ```applescript
@ -506,7 +506,7 @@ EOF
### 用户 TCC 数据库到 FDA ### 用户 TCC 数据库到 FDA
**用户 TCC** 数据库的 **写权限****不能** 授予自己 **`FDA`** 权限,只有系统数据库中的用户可以授予。 **用户 TCC** 数据库的 **写权限****不能** 授予自己 **`FDA`** 权限,只有系统数据库中的用户可以授予。
但你可以 **授予** 自己 **`Finder 的自动化权限`**,并滥用之前的技术提升到 FDA\*。 但你可以 **授予** 自己 **`Finder 的自动化权限`**,并滥用之前的技术提升到 FDA\*。
@ -518,14 +518,14 @@ EOF
### **SIP 绕过到 TCC 绕过** ### **SIP 绕过到 TCC 绕过**
系统 **TCC 数据库** 受到 **SIP** 保护,这就是为什么只有具有 **指示的权** 的进程才能修改它。因此,如果攻击者找到一个 **SIP 绕过** 通过一个 **文件**(能够修改受 SIP 限制的文件),他将能够: 系统 **TCC 数据库** 受到 **SIP** 保护,这就是为什么只有具有 **指示的权** 的进程才能修改它。因此,如果攻击者找到一个 **SIP 绕过** 通过一个 **文件**(能够修改受 SIP 限制的文件),他将能够:
- **移除** TCC 数据库的保护,并授予自己所有 TCC 权限。他可以滥用这些文件中的任何一个,例如: - **移除** TCC 数据库的保护,并授予自己所有 TCC 权限。他可以滥用这些文件中的任何一个,例如:
- TCC 系统数据库 - TCC 系统数据库
- REG.db - REG.db
- MDMOverrides.plist - MDMOverrides.plist
然而,还有另一种选择可以滥用这个 **SIP 绕过以绕过 TCC**,文件 `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 是一个需要 TCC 例外的应用程序的允许列表。因此,如果攻击者可以 **移除此文件的 SIP 保护** 并添加自己的 **应用程序**,该应用程序将能够绕过 TCC。\ 然而,还有另一种选择可以滥用这个 **SIP 绕过以绕过 TCC**,文件 `/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist` 是一个需要 TCC 例外的应用程序的允许列表。因此,如果攻击者能够 **移除此文件的 SIP 保护** 并添加自己的 **应用程序**,该应用程序将能够绕过 TCC。\
例如添加终端: 例如添加终端:
```bash ```bash
# Get needed info # Get needed info