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 eles desejam 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 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:

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.

Bancos de dados do 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 do TCC no iOS está em /private/var/mobile/Library/TCC/TCC.db {% endhint %}

Existe um terceiro banco de dados do TCC em /var/db/locationd/clients.plist para indicar os clientes autorizados a acessar os serviços de localização.

Além disso, um processo com acesso total ao disco pode editar o banco de dados do modo de usuário. Agora, um aplicativo também precisa de FDA para ler o banco de dados.

{% hint style="info" %} A interface do usuário do centro de notificações pode fazer alterações no banco de dados do 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="user DB" %}

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

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

Resetar

# You can reset all the permissions given to an application with
tccutil reset All app.some.id

# Reset the permissions granted to all apps
tccutil reset All

Privesc de Usuário TCC DB para FDA

Obtendo permissões de escrita sobre o banco de dados do usuário TCC, você não pode conceder a si mesmo permissões de FDA, apenas aquele que está no banco de dados do sistema pode conceder isso.

Mas você pode se dar direitos de Automação para o Finder, e como o Finder possui FDA, você também possui.

Verificações de Assinatura 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 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 ele é protegido pelo SIP. No entanto, como explicado neste post, é possível desabilitá-lo compactando o arquivo, excluindo-o e descompactando-o.

Bypasses do TCC

{% content-ref url="macos-tcc-bypasses/" %} macos-tcc-bypasses {% endcontent-ref %}

Referências

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