macOS XPC Connecting Process Check
Verificação do Processo de Conexão XPC
Quando uma conexão é estabelecida com um serviço XPC, o servidor verificará se a conexão é permitida. Estas são as verificações que normalmente são realizadas:
Verificar se o processo de conexão está assinado com um certificado assinado pela Apple (fornecido apenas pela Apple).
Se isso não for verificado, um atacante poderia criar um certificado falso para corresponder a qualquer outra verificação.
Verificar se o processo de conexão está assinado com o certificado da organização, (verificação do ID da equipe).
Se isso não for verificado, qualquer certificado de desenvolvedor da Apple pode ser usado para assinar e conectar-se ao serviço.
Verificar se o processo de conexão contém um ID de pacote adequado.
Se isso não for verificado, qualquer ferramenta assinada pela mesma organização poderia ser usada para interagir com o serviço XPC.
(4 ou 5) Verificar se o processo de conexão tem um número de versão de software adequado.
Se isso não for verificado, clientes antigos e inseguros, vulneráveis à injeção de processos, poderiam ser usados para se conectar ao serviço XPC mesmo com as outras verificações em vigor.
(4 ou 5) Verificar se o processo de conexão tem o runtime reforçado sem privilégios perigosos (como os que permitem carregar bibliotecas arbitrárias ou usar variáveis de ambiente DYLD)
Se isso não for verificado, o cliente pode ser vulnerável à injeção de código
Verificar se o processo de conexão tem um privilégio que permite a conexão com o serviço. Isso é aplicável para binários da Apple.
A verificação deve ser baseada no token de auditoria do cliente que se conecta em vez de seu ID de processo (PID), pois o primeiro previne ataques de reutilização de PID.
Desenvolvedores raramente usam a chamada de API do token de auditoria porque é privada, então a Apple poderia mudar a qualquer momento. Além disso, o uso de API privada não é permitido em aplicativos da Mac App Store.
Se o método
processIdentifier
for usado, ele pode ser vulnerávelxpc_dictionary_get_audit_token
deve ser usado em vez dexpc_connection_get_audit_token
, pois o último também pode ser vulnerável em certas situações.
Ataques de Comunicação
Para mais informações sobre o ataque de reutilização de PID, confira:
pagemacOS PID ReusePara mais informações sobre o ataque xpc_connection_get_audit_token
, confira:
Trustcache - Prevenção de Ataques de Downgrade
Trustcache é um método defensivo introduzido em máquinas com Apple Silicon que armazena um banco de dados de CDHSAH de binários da Apple, permitindo que apenas binários não modificados e autorizados sejam executados. Isso previne a execução de versões anteriores.
Exemplos de Código
O servidor implementará essa verificação em uma função chamada shouldAcceptNewConnection
.
O objeto NSXPCConnection possui uma propriedade privada auditToken
(a que deveria ser usada, mas que pode mudar) e uma propriedade pública processIdentifier
(a que não deveria ser usada).
O processo de conexão poderia ser verificado com algo como:
Se um desenvolvedor não quiser verificar a versão do cliente, ele poderia pelo menos verificar que o cliente não está vulnerável a injeção de processo:
```objectivec [...] CFDictionaryRef csInfo = NULL; SecCodeCopySigningInformation(code, kSecCSDynamicInformation, &csInfo); uint32_t csFlags = [((__bridge NSDictionary *)csInfo)[(__bridge NSString *)kSecCodeInfoStatus] intValue]; const uint32_t cs_hard = 0x100; // don't load invalid page. const uint32_t cs_kill = 0x200; // Kill process if page is invalid const uint32_t cs_restrict = 0x800; // Prevent debugging const uint32_t cs_require_lv = 0x2000; // Library Validation const uint32_t cs_runtime = 0x10000; // hardened runtime if ((csFlags & (cs_hard | cs_require_lv)) { return Yes; // Accept connection } ```
Last updated