Basicamente, a assinatura ad-hoc nesse contexto significa que o binário é assinado sem nenhuma prova criptográfica.
Em essência, normalmente os binários são assinados adicionando o chamado CMS (uma mensagem criptográfica) em que o hash do CodeDirectory é a mensagem assinada pela identidade de assinatura. Isso significa que um estranho pode verificar se o código foi realmente assinado por alguém que possui a chave privada para essa identidade.
Ao executar programas, o sistema macOS pode verificar se essas assinaturas são válidas e se confia na identidade de assinatura - e, se o fizer, execute o programa. Este é o básico da funcionalidade do GateKeeper.
Os binários assinados ad-hoc são muito diferentes, pois não contêm esse CMS. Em vez disso, ele simplesmente mantém o valor de hash SHA-1 do CodeDirectory sem nenhuma prova criptográfica de sua validade e nenhum caminho de certificados / identidades para verificação.
O CodeDirectory é um objeto que descreve uma instância específica de código estático, tendo valores de hash para vários trechos de código dos quais o aplicativo é criado. Assegurando que o CodeDirectory não seja alterado, verificando a assinatura criptográfica e que os vários bits de código do aplicativo correspondem aos valores de hash armazenados no diretório, você pode verificar se o código não foi violado.
Sem a prova criptográfica, essa verificação "não alterada" não pode ser executada da maneira normal.
Em vez disso, binários assinados ad-hoc são verificados comparando o valor do hash SHA-1 com uma lista de valores de hash "conhecidos" armazenados no cache de confiança estática dentro do kernel.
Em essência, isso significa que as "restrições significativas" impostas a qualquer aplicativo que você ad-hoc assine é que ele não passará em nenhum tipo de verificação em nenhum lugar. É basicamente o mesmo que um binário não assinado.
No entanto, se você é Apple, pode criar aplicativos que não são codificados de maneira comum e, em vez disso, são explicitamente confiáveis pelo kernel. Ou seja, se, por exemplo, a Apple deseja garantir que um aplicativo seja inalterado ao ser executado em um estágio inicial da inicialização do sistema, onde a verificação completa da identidade de assinatura não está em funcionamento (ou não está disponível), eles podem usar a assinatura ad-hoc. Esses aplicativos sempre podem ser verificados pelo cache de confiança estática, independentemente de seu repositório de certificados ser hospedado ou algo parecido.
Na prática, a criação de binários assinados ad-hoc é apenas de valor prático para os desenvolvedores da Apple.
Você pode encontrar uma documentação menor sobre assinatura ad-hoc na seção de desenvolvedores da Apple. Por exemplo:
https://developer.apple.com/documentation/security/seccodesignatureflags/kseccodesignatureadhoc
Mas você também pode encontrar trechos de documentos no código-fonte do próprio utilitário codesign e no código-fonte da libsecurity.
codesign -dv --verbose=4 /path/to/the.app
. Você receberá uma linha dizendoSignature=adhoc
: o que parece indicar uma assinatura adhoc. Notavelmente ausentes são outras chaves que estão normalmente presentes em um aplicativo iOS assinado regularmente, comoAuthority
eTeamIdentifier