Quali sono le restrizioni della firma del codice ad hoc?


14

È possibile firmare il codice o le app "ad hoc" utilizzando codesign. La pagina man ci dice quanto segue sulla firma del codice ad hoc:

Se identità è la lettera singola "-" (trattino), viene eseguita la firma ad hoc. La firma ad hoc non utilizza affatto un'identità e identifica esattamente un'istanza di codice. Restrizioni significative si applicano all'uso del codice firmato ad hoc; consultare la documentazione prima di utilizzare questo.

(Enfasi aggiunta da me)

Volevo saperne di più e ho cercato di trovare detta documentazione, ma non sono riuscito a trovare alcun dettaglio. Ho trovato una nota tecnica chiamata "MacOS Code Sign In Depth" , ma non menziona affatto la firma ad hoc.

Quali sono queste "restrizioni significative" e dove sono documentate?

Risposte:


9

Fondamentalmente la firma ad-hoc in questo contesto significa che il binario è firmato senza alcuna prova crittografica.

In sostanza, normalmente i binari vengono firmati aggiungendo un cosiddetto CMS (un messaggio crittografico) in cui l'hash di CodeDirectory è il messaggio che viene firmato dall'identità della firma. Ciò significa che un estraneo può verificare che il codice sia stato effettivamente firmato da qualcuno che detiene la chiave privata per tale identità.

Durante l'esecuzione dei programmi, il sistema macOS può verificare che queste firme siano valide e che si fidi dell'identità della firma e, in tal caso, eseguire il programma. Queste sono le basi della funzionalità GateKeeper.

I binari firmati ad hoc sono molto diversi in quanto non contengono tale CMS. Invece, contiene semplicemente il valore hash SHA-1 di CodeDirectory senza alcuna prova crittografica della sua validità e nessun percorso di certificati / identità da verificare.

CodeDirectory è un oggetto che descrive una particolare istanza di codice statico con valori hash per vari pezzi di codice da cui è fatta l'applicazione. Assicurando che CodeDirectory non sia manomesso verificando la firma crittografica e che i vari bit di codice dell'applicazione corrispondano ai valori di hash memorizzati nella directory, è possibile verificare che il codice non sia stato manomesso.

Senza la prova crittografica questo controllo "non manomesso" non può essere eseguito normalmente.

Invece i binari firmati ad hoc vengono controllati confrontando il valore di hash SHA-1 con un elenco di valori di hash "conosciuti" memorizzati nella cache di trust statica all'interno del kernel.

In sostanza, ciò significa che le "restrizioni significative" poste su qualsiasi applicazione firmata ad hoc è che non passerà alcun tipo di verifica da nessuna parte. Fondamentalmente è lo stesso di un binario non firmato.

Tuttavia, se sei Apple, puoi creare applicazioni che non sono codificate in modo ordinario e che sono invece esplicitamente considerate affidabili dal kernel. Ad esempio, se ad esempio Apple vuole assicurarsi che un'applicazione non sia manomessa quando eseguita in una fase iniziale all'avvio del sistema in cui la verifica dell'identità della firma completa non è attiva e funzionante (o non è disponibile), può utilizzare la firma ad hoc. Queste applicazioni possono sempre essere verificate dalla cache di attendibilità statica, indipendentemente dal fatto che il repository di certificati sia nascosto o qualcosa del genere.

In pratica, la creazione di file binari firmati ad hoc ha un valore pratico solo per gli sviluppatori Apple.

Puoi trovare una documentazione minore sulla firma ad hoc nella sezione degli sviluppatori di Apple. Per esempio:

https://developer.apple.com/documentation/security/seccodesignatureflags/kseccodesignatureadhoc

Ma puoi anche trovare frammenti di documenti nel codice sorgente per l'utilità stessa e nel codice sorgente per libsecurity.


"Solo di valore pratico per gli sviluppatori Apple" qui significa "solo per gli sviluppatori che lavorano in Apple" o "solo per gli sviluppatori che lavorano su piattaforme Apple"? Sinceramente curioso, dato che abbiamo iniziato a ricevere qualche nuovo problema in cui il portachiavi non riesce a trovare la chiave anche quando il nome è corretto, e stiamo valutando di passare al trattino per build senza rilascio.
Trejkaz,

1
Significa solo per gli sviluppatori che lavorano in Apple.
jksoegaard,

Si noti che il simulatore iOS utilizza anche la firma ad hoc. La firma ad hoc potrebbe essere utile per gli sviluppatori al di fuori di Apple per consentire all'app di richiedere diritti, cosa che non sono sicuro sia possibile senza una firma del codice (tutti i documenti che ho visto indicano no). Sul Mac questo di solito non è un problema, ma su iOS molte funzionalità sono racchiuse dietro diritti, quindi testare che funzioni correttamente è auspicabile per gli sviluppatori iOS.
visita il

@milch Stai mescolando due concetti non correlati - "adhoc sign" (che è di cosa tratta questa domanda) e "adhoc distribution" (che è quello che gli sviluppatori iOS usano spesso e riguardano diritti, ecc.)
jksoegaard

Sono abbastanza sicuro che le build del simulatore siano firmate ad hoc (non distribuite). Puoi controllare ispezionando un'app iOS creata per il simulatore con codesign -dv --verbose=4 /path/to/the.app. Riceverai una riga che dice Signature=adhoc, che sembra indicare una firma ad hoc. In particolare sono assenti altri tasti che sono normalmente presenti in un'applicazione iOS regolarmente firmata, come AuthorityeTeamIdentifier
milch
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.