Quais são as restrições da assinatura de código ad-hoc?


14

É possível assinar código ou aplicativos "ad-hoc" usando codesign. A página do manual nos diz o seguinte sobre assinatura de código ad-hoc:

Se a identidade for a única letra "-" (traço), a assinatura ad-hoc será realizada. A assinatura ad-hoc não usa uma identidade e identifica exatamente uma instância do código. Restrições significativas se aplicam ao uso de código assinado ad-hoc; consulte a documentação antes de usar isso.

(Ênfase adicionada por mim)

Eu queria saber mais e tentei encontrar a documentação, mas não consegui encontrar nenhum detalhe. Encontrei uma nota técnica chamada "Profundidade de assinatura de código do macOS" , mas não menciona a assinatura ad-hoc.

O que são essas "restrições significativas" e onde estão documentadas?

Respostas:


9

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.


"Somente de valor prático para desenvolvedores da Apple" significa aqui "apenas para desenvolvedores que trabalham na Apple" ou "apenas para desenvolvedores que trabalham nas plataformas da Apple"? Genuinamente curioso, quando começamos a receber um novo problema em que as chaves não conseguem encontrar a chave, mesmo quando o nome está correto, e estamos pensando em mudar para o hífen para compilações sem lançamento.
12138 Trejkaz

1
Significa apenas para desenvolvedores que trabalham na Apple.
Jksoegaard

Observe que o simulador do iOS também usa assinatura adhoc. A assinatura ad-hoc pode ser útil para desenvolvedores fora da Apple, pois permite que o aplicativo solicite direitos, o que não tenho certeza de que seja possível sem uma assinatura de código (todos os documentos que vi apontam para não). No Mac, isso geralmente não é um problema, mas no iOS muitos recursos são garantidos por direitos, portanto, é recomendável que os desenvolvedores do iOS testem se isso funciona corretamente.
Milch

@milch Você está misturando dois conceitos não relacionados - "assinatura adhoc" (que é essa a questão) e "distribuição adhoc" (que é o que o desenvolvedor do iOS geralmente usa e preocupa direitos, etc.)
jksoegaard

Tenho certeza de que as compilações do simulador são assinadas adhoc (não distribuídas). Você pode verificar inspecionando um aplicativo iOS criado para o simulador com codesign -dv --verbose=4 /path/to/the.app. Você receberá uma linha dizendo Signature=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, como AuthorityeTeamIdentifier
milch
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.