.. | ||
macos-pid-reuse.md | ||
macos-xpc_connection_get_audit_token-attack.md | ||
README.md |
Verificação de Conexão de Processo XPC no macOS
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Você trabalha em uma empresa de cibersegurança? Você quer ver sua empresa anunciada no HackTricks? ou você quer ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e repositório hacktricks-cloud.
Verificação de Conexão de Processo 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 (apenas fornecido pela Apple).
- Se isso não for verificado, um atacante pode 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 se conectar 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 pode ser usada para interagir com o serviço XPC.
- (4 ou 5) Verificar se o processo de conexão possui um número de versão de software adequado.
- Se isso não for verificado, clientes antigos e inseguros, vulneráveis à injeção de processo, podem 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 possui um tempo de execução protegido sem privilégios perigosos (como aqueles que permitem carregar bibliotecas arbitrárias ou usar variáveis de ambiente DYLD).
- Se isso não for verificado, o cliente pode estar vulnerável à injeção de código.
- Verificar se o processo de conexão possui uma autorização 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 de conexão, em vez de seu ID de processo (PID), pois o primeiro impede ataques de reutilização de PID.
- Os desenvolvedores raramente usam a chamada de API do token de auditoria, pois ela é privada, então a Apple pode alterá-la a qualquer momento. Além disso, o uso de API privada não é permitido em aplicativos da Mac App Store.
- Deve-se usar
xpc_dictionary_get_audit_token
em vez dexpc_connection_get_audit_token
, pois este último também pode ser vulnerável em certas situações.
Ataques de Comunicação
Para obter mais informações sobre o ataque de reutilização de PID, verifique:
{% content-ref url="macos-pid-reuse.md" %} macos-pid-reuse.md {% endcontent-ref %}
Para obter mais informações sobre o ataque xpc_connection_get_audit_token
, verifique:
{% content-ref url="macos-xpc_connection_get_audit_token-attack.md" %} macos-xpc_connection_get_audit_token-attack.md {% endcontent-ref %}
Prevenção de Ataques de Downgrade - Trustcache
Trustcache é um método defensivo introduzido em máquinas Apple Silicon que armazena um banco de dados de CDHSAH de binários da Apple, permitindo apenas a execução de binários não modificados. Isso impede a execução de versões degradadas.
Exemplos de Código
O servidor implementará essa verificação em uma função chamada shouldAcceptNewConnection
.
{% code overflow="wrap" %}
- (BOOL)listener:(NSXPCListener *)listener shouldAcceptNewConnection:(NSXPCConnection *)newConnection {
//Check connection
return YES;
}
{% endcode %}
O objeto NSXPCConnection possui uma propriedade privada chamada auditToken
(a que deve ser usada, mas pode mudar) e uma propriedade pública chamada processIdentifier
(a que não deve ser usada).
O processo de conexão pode ser verificado da seguinte forma:
{% code overflow="wrap" %}
[...]
SecRequirementRef requirementRef = NULL;
NSString requirementString = @"anchor apple generic and identifier \"xyz.hacktricks.service\" and certificate leaf [subject.CN] = \"TEAMID\" and info [CFBundleShortVersionString] >= \"1.0\"";
/* Check:
- Signed by a cert signed by Apple
- Check the bundle ID
- Check the TEAMID of the signing cert
- Check the version used
*/
// Check the requirements with the PID (vulnerable)
SecRequirementCreateWithString(requirementString, kSecCSDefaultFlags, &requirementRef);
SecCodeCheckValidity(code, kSecCSDefaultFlags, requirementRef);
// Check the requirements wuing the auditToken (secure)
SecTaskRef taskRef = SecTaskCreateWithAuditToken(NULL, ((ExtendedNSXPCConnection*)newConnection).auditToken);
SecTaskValidateForRequirement(taskRef, (__bridge CFStringRef)(requirementString))
Se um desenvolvedor não quiser verificar a versão do cliente, ele pode pelo menos verificar se o cliente não é vulnerável à injeção de processo:
{% code overflow="wrap" %}
[...]
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
}
{% endcode %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
- Trabalha em uma empresa de cibersegurança? Gostaria de ver sua empresa anunciada no HackTricks? Ou gostaria de ter acesso à última versão do PEASS ou baixar o HackTricks em PDF? Verifique os PLANOS DE ASSINATURA!
- Descubra A Família PEASS, nossa coleção exclusiva de NFTs
- Adquira o swag oficial do PEASS & HackTricks
- Junte-se ao 💬 grupo Discord ou ao grupo Telegram ou siga-me no Twitter 🐦@carlospolopm.
- Compartilhe suas técnicas de hacking enviando PRs para o repositório hacktricks e o repositório hacktricks-cloud.