hacktricks/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-tcc/README.md

16 KiB

macOS TCC

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

Informações básicas

TCC (Transparency, Consent, and Control) é um mecanismo no macOS para limitar e controlar o acesso de aplicativos a determinados recursos, geralmente do ponto de vista da privacidade. Isso pode incluir coisas como serviços de localização, contatos, fotos, microfone, câmera, acessibilidade, acesso total ao disco e muito mais.

Do ponto de vista do usuário, eles veem o TCC em ação quando um aplicativo deseja acessar um dos recursos protegidos pelo TCC. Quando isso acontece, o usuário recebe uma solicitação em forma de diálogo perguntando se deseja permitir o acesso ou não.

Também é possível conceder acesso a aplicativos a arquivos por meio de intenções explícitas dos usuários, por exemplo, quando um usuário arrasta e solta um arquivo em um programa (obviamente, o programa deve ter acesso a ele).

Um exemplo de uma solicitação do TCC

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 para cada 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 em execução como sistema e como usuário:

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

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.

Banco de dados TCC

As seleções são então armazenadas no banco de dados do TCC em todo o sistema em /Library/Application Support/com.apple.TCC/TCC.db ou em $HOME/Library/Application Support/com.apple.TCC/TCC.db para preferências por usuário. Os bancos de dados são protegidos contra edição com SIP (System Integrity Protection), mas você pode lê-los.

{% hint style="danger" %} O banco de dados TCC no iOS está em /private/var/mobile/Library/TCC/TCC.db {% endhint %}

Além disso, um processo com acesso total ao disco pode editar o banco de dados do modo de usuário.

{% hint style="info" %} A interface do centro de notificações pode fazer alterações no banco de dados TCC do sistema:

{% code overflow="wrap" %}

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

{% tab title="Banco de dados do usuário" %}

No entanto, os usuários podem excluir ou consultar regras com a utilidade de linha de comando tccutil. {% endtab %} {% endtabs %}

{% code title="Example" %}

$ tccutil reset All

{% endcode %}

This command will reset all TCC permissions for all applications for the current user.

{% code title="Example" %}

$ tccutil reset Camera com.apple.Safari

{% endcode %}

This command will reset the Camera permission for both the Camera and Safari applications for the current user.

{% code title="Example" %}

$ tccutil reset Microphone

{% endcode %}

This command will reset the Microphone permission for all applications for the current user.

{% code title="Example" %}

$ tccutil reset Microphone com.apple.Terminal

{% endcode %}

This command will reset the Microphone permission for both the Microphone and Terminal applications for the current user.

{% code title="Example" %}

$ tccutil reset Microphone com.apple.Terminal /Applications/Google\ Chrome.app

{% endcode %}

This command will reset the Microphone permission for the Microphone, Terminal, and Google Chrome applications for the current user.

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="Banco de dados do sistema" %}

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" %} Verificando ambos os bancos de dados, você pode verificar as permissões que um aplicativo permitiu, proibiu ou não possui (ele solicitará). {% endhint %}

  • O auth_value pode ter valores diferentes: denied(0), unknown(1), allowed(2) ou limited(3).
  • O auth_reason pode ter 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).
  • Para obter mais informações sobre os outros campos da tabela, verifique esta postagem no blog.

{% hint style="info" %} 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.

O Acesso Total ao Disco tem o nome kTCCServiceSystemPolicyAllFiles e o kTCCServiceAppleEvents permite que o aplicativo envie eventos para outros aplicativos que são comumente usados para automatizar tarefas. Além disso, o kTCCServiceSystemPolicySysAdminFiles permite alterar o atributo NFSHomeDirectory de um usuário que altera sua pasta pessoal e, portanto, permite burlar o TCC. {% endhint %}

Você também pode verificar as permissões já concedidas aos aplicativos em Preferências do Sistema --> Segurança e Privacidade --> Privacidade --> Arquivos e Pastas.

{% hint style="success" %} Observe que, mesmo que um dos bancos de dados esteja dentro da pasta do usuário, os usuários não podem modificar diretamente esses bancos de dados por causa do SIP (mesmo se você for root). A única maneira de configurar ou modificar uma nova regra é por meio do painel de Preferências do Sistema ou de prompts em que o aplicativo solicita ao usuário.

No entanto, lembre-se de que os usuários podem excluir ou consultar regras usando o tccutil. {% endhint %}

Verificações de Assinatura do TCC

O banco de dados do TCC armazena o Bundle ID do aplicativo, mas também armazena informações sobre a assinatura para garantir que o aplicativo que solicita o uso de uma permissão seja o correto.

{% 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 %}

{% hint style="warning" %} 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. {% endhint %}

Entitlements

As aplicações não apenas precisam solicitar e ter sido concedido acesso a alguns recursos, elas também precisam ter as permissões relevantes.
Por exemplo, o Telegram tem a permissão com.apple.security.device.camera para solicitar acesso à câmera. Uma aplicação que não tenha essa permissão não poderá acessar a câmera (e o usuário nem mesmo será solicitado a conceder as permissões).

No entanto, para que as aplicações tenham acesso a determinadas pastas do usuário, como ~/Desktop, ~/Downloads e ~/Documents, elas não precisam ter nenhuma permissão específica. O sistema lidará com o acesso de forma transparente e solicitará permissão ao usuário conforme necessário.

As aplicações da Apple não gerarão solicitações. Elas contêm direitos pré-concedidos em sua lista de permissões, o que significa que elas nunca gerarão um pop-up e não aparecerão em nenhum dos bancos de dados do TCC. Por exemplo:

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>

Isso evitará que o Calendário solicite ao usuário acesso a lembretes, calendário e lista de contatos.

{% hint style="success" %} Além de alguma documentação oficial sobre as permissões, também é possível encontrar informações interessantes sobre as permissões em https://newosxbook.com/ent.jl {% endhint %}

Locais sensíveis desprotegidos

  • $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-o e soltando-o nele. Esse acesso não será especificado em nenhum banco de dados TCC, mas como um atributo estendido do arquivo. Esse atributo irá armazenar o UUID do aplicativo permitido:

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" %} É curioso que o atributo com.apple.macl seja gerenciado pelo Sandbox, 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, ele não concederá acesso a esse aplicativo. {% endhint %}

O atributo estendido com.apple.macl não pode ser removido como outros atributos estendidos porque está protegido pelo SIP. No entanto, como explicado neste post, é possível desabilitá-lo compactando o arquivo, excluindo-o e descompactando-o.

Bypasses do TCC

Referências

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