Was sind die Einschränkungen bei der Ad-hoc-Codesignatur?


14

Es ist möglich, Code oder Apps mit "Ad-hoc" zu signieren codesign. Auf der Manpage erfahren Sie Folgendes über das Signieren von Ad-hoc-Codes:

Wenn Identität der einzelne Buchstabe "-" (Bindestrich) ist, wird eine Ad-hoc-Signatur durchgeführt. Bei der Ad-hoc-Signatur wird überhaupt keine Identität verwendet und genau eine Codeinstanz identifiziert. Für die Verwendung von ad-hoc signiertem Code gelten erhebliche Einschränkungen. Konsultieren Sie die Dokumentation, bevor Sie diese verwenden.

(Hervorhebung von mir hinzugefügt)

Ich wollte mehr wissen und versuchte, diese Dokumentation zu finden, konnte aber keine Details finden. Ich habe einen technischen Hinweis mit dem Namen "macOS Code Signing In Depth" gefunden , in dem jedoch die Ad-hoc-Signierung überhaupt nicht erwähnt wird.

Was sind diese "wesentlichen Einschränkungen" und wo sind sie dokumentiert?

Antworten:


9

Grundsätzlich bedeutet Ad-hoc-Signierung in diesem Zusammenhang, dass die Binärdatei überhaupt ohne kryptografischen Beweis signiert wird.

Im Wesentlichen werden Binärdateien normalerweise durch Hinzufügen eines sogenannten CMS (einer kryptografischen Nachricht) signiert, wobei der Hash des CodeDirectory die Nachricht ist, die von der signierenden Identität signiert wird. Dies bedeutet, dass ein Außenstehender überprüfen kann, ob der Code tatsächlich von jemandem signiert wurde, der den privaten Schlüssel für diese Identität besitzt.

Beim Ausführen von Programmen kann das macOS-System überprüfen, ob diese Signaturen gültig sind und ob es der Signaturidentität vertraut. Wenn dies der Fall ist, führen Sie das Programm aus. Dies sind die Grundlagen der GateKeeper-Funktionalität.

Ad-hoc-signierte Binärdateien unterscheiden sich erheblich, da sie kein solches CMS enthalten. Stattdessen enthält es einfach den SHA-1-Hashwert des CodeDirectory ohne einen kryptografischen Nachweis seiner Gültigkeit und keinen Pfad für Zertifikate / Identitäten, anhand dessen überprüft werden kann.

Das CodeDirectory ist ein Objekt, das eine bestimmte Instanz von statischem Code beschreibt, indem es Hash-Werte für verschiedene Codeteile enthält, aus denen die Anwendung besteht. Indem Sie sicherstellen, dass das CodeDirectory durch Überprüfen der kryptografischen Signatur nicht manipuliert wird und dass die verschiedenen Codebits der Anwendung mit den im Verzeichnis gespeicherten Hashwerten übereinstimmen, können Sie sicherstellen, dass der Code nicht manipuliert wurde.

Ohne den kryptografischen Nachweis kann diese "nicht manipulierte" Prüfung nicht auf normale Weise durchgeführt werden.

Stattdessen werden ad-hoc signierte Binärdateien überprüft, indem der SHA-1-Hashwert mit einer Liste von "bekannt gut" -Hashwerten verglichen wird, die im statischen Vertrauenscache im Kernel gespeichert sind.

Im Wesentlichen bedeutet dies, dass die "erheblichen Einschränkungen" für jede Anwendung, die Sie selbst ad-hoc unterschreiben, darin bestehen, dass sie nirgendwo eine Überprüfung besteht. Es ist im Grunde dasselbe wie eine nicht signierte Binärdatei.

Wenn Sie jedoch Apple sind, können Sie Anwendungen erstellen, die nicht wie gewohnt codiert sind und stattdessen vom Kernel explizit als vertrauenswürdig eingestuft werden. Wenn Apple beispielsweise sicherstellen möchte, dass eine Anwendung nicht manipuliert wird, wenn sie in einem frühen Stadium des Systemstarts ausgeführt wird, in dem die vollständige Überprüfung der Signaturidentität nicht ausgeführt wird (oder nicht verfügbar ist), kann die Ad-hoc-Signatur verwendet werden. Diese Anwendungen können immer vom statischen Vertrauenscache überprüft werden, unabhängig davon, ob Ihr Zertifikat-Repository abgespritzt ist oder ähnliches.

In der Praxis ist das Erstellen von ad-hoc signierten Binärdateien nur für Apple-Entwickler von praktischem Wert.

Eine kleinere Dokumentation zur Ad-hoc-Signatur finden Sie im Entwicklerbereich von Apple. Zum Beispiel:

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

Sie können aber auch Ausschnitte von Dokumenten im Quellcode für das Dienstprogramm Codesign selbst und im Quellcode für libsecurity finden.


Bedeutet "nur von praktischem Wert für Apple-Entwickler" hier "nur für Entwickler, die bei Apple arbeiten" oder "nur für Entwickler, die auf Apple-Plattformen arbeiten"? Wirklich neugierig, da wir ein neues Problem bekommen haben, bei dem der Schlüsselbund den Schlüssel nicht finden kann, selbst wenn der Name korrekt ist, und wir erwägen, für Nicht-Release-Builds zum Bindestrich zu wechseln.
Trejkaz

1
Bedeutet nur für Entwickler, die bei Apple arbeiten.
Jksoegaard

Beachten Sie, dass der iOS-Simulator auch Ad-hoc-Signaturen verwendet. Die Ad-hoc-Signierung kann für Entwickler außerhalb von Apple von Nutzen sein, damit die App Berechtigungen anfordern kann. Ich bin mir nicht sicher, ob dies ohne eine Codesignatur möglich ist (alle Dokumente, die ich gesehen habe, weisen auf Nein hin). Auf dem Mac ist dies normalerweise kein Problem, aber unter iOS sind viele Funktionen hinter Berechtigungen verborgen. Daher ist es für iOS-Entwickler wünschenswert, zu testen, ob dies korrekt funktioniert.
Milch

@milch Sie verwechseln zwei nicht verwandte Konzepte - "Ad-hoc-Signierung" (worum es in dieser Frage ging) und "Ad-hoc-Verteilung" (was iOS-Entwickler häufig verwenden und Berechtigungen usw. betreffen)
jksoegaard

Ich bin mir ziemlich sicher, dass Simulator-Builds adhoc signiert (nicht verteilt) sind. Sie können dies überprüfen, indem Sie eine iOS-App überprüfen, die für den Simulator mit erstellt wurde codesign -dv --verbose=4 /path/to/the.app. Sie erhalten eine Zeile mit der Aufschrift " Signature=adhocAd-hoc-Signatur". Bemerkenswerterweise fehlen andere Schlüssel, die normalerweise in einer regelmäßig signierten iOS-Anwendung vorhanden sind, wie z. B. AuthorityundTeamIdentifier
milch
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.