Welche Teile des .app-Bundles werden von der Signatur abgedeckt, wenn Anwendungen mit Code signiert sind?

13

In Mountain Lion weiß ich, dass einige Anwendungen, einschließlich aller Anwendungen im Mac App Store, vom Entwickler digital signiert sind. Wenn sie geändert werden, stimmt die Signatur nicht überein und es treten alle möglichen Fehler (und die Situation) auf wird mit der nächsten Version des Betriebssystems eskalieren ...).

Meine Frage ist, welche Teile des .app-Bundles umfasst die Signatur? Wenn irgendetwas in Appname.app/ContentsÄnderungen (einschließlich Metadaten, wie das geänderte Datum für den ContentsOrdner), geht der Bruch der Signatur? Ist es nur die Binärdatei Contents/MacOS? Sind die .plists in der Signatur enthalten? Die Resources? Was kann ich als Endbenutzer (wenn überhaupt) hacken, ohne die Signatur zu brechen?

Daniel
quelle
Klingt so, als müssten Sie mit dem Testen beginnen und es uns mitteilen!
Adam Davis
Ich kann, und wenn niemand die Antwort weiß, werde ich, aber wenn jemand bereits getestet hat, muss ich das Rad nicht neu erfinden.
Daniel
1
Das Rad könnte völlig einige Verbesserungen nutzen, though. Ich denke, Chromspinner sind zum einen ein Muss.
Adam Davis

Antworten:

14

TL; DR Es ist Sache des Entwicklers, auszuwählen, welche Teile der App signiert sind und ob Änderungen an diesen Teilen zu Aktionen führen, wenn die App gestartet wird. Sie müssen Trial-and-Error verwenden, um dies App für App herauszufinden.

Es ist weitgehend Sache des Entwicklers, zu entscheiden, welche Komponenten in seinem Anwendungspaket in dem Siegel enthalten sind, das unterzeichnet wird, bevor sie ihre Anwendung ausliefern. Alles in dem Siegel ist fälschungssicher, da es meist unmöglich ist, diese Dinge zu ändern, ohne ihre Hash-Signaturen zu ändern. Das heißt aber nicht, dass man sie nicht manipulieren kann.

Im Apple Developer Guide steht, was Sie unterschreiben sollten:

Sie sollten jede ausführbare Datei in Ihrem Produkt signieren, einschließlich Anwendungen, Tools, versteckter Hilfsprogramme, Dienstprogramme usw. Das Signieren eines Anwendungsbündels deckt seine Ressourcen ab, nicht jedoch seine Unterkomponenten wie Tools und Unterbündel. Jedes dieser Dokumente muss unabhängig unterschrieben werden.

Wenn Ihre Anwendung aus einem großen UI-Teil mit einem oder mehreren kleinen Hilfsprogrammen besteht, die versuchen, dem Benutzer ein einziges Gesicht zu präsentieren, können Sie sie für die Codesignatur nicht unterscheidbar machen, indem Sie ihnen alle exakt die gleiche Codesignaturkennung geben. (Sie können dies tun, indem Sie sicherstellen, dass alle den gleichen CFBundleIdentifier-Wert in ihrer Info.plist haben, oder indem Sie die Option -i im Befehl codesign verwenden, um denselben Bezeichner zuzuweisen.) In diesem Fall verfügen alle Ihre Programmkomponenten über Zugriff auf dieselben Schlüsselbundelemente und Validierung mit demselben Programm. Tun Sie dies nur, wenn die beteiligten Programme wirklich eine Einheit bilden sollen, ohne dass Unterschiede gemacht werden.

Eine universelle Binärdatei (Bundle oder Tool) weist automatisch individuelle Signaturen auf, die auf jede Architekturkomponente angewendet werden. Diese sind unabhängig und in der Regel wird nur die native Architektur auf dem Endbenutzersystem überprüft.

Bei Installationspaketen (.pkg- und .mpkg-Bundles) ist alles implizit signiert: Das CPIO-Archiv mit den Nutzdaten, das CPIO-Archiv mit den Installationsskripten und die Stückliste enthalten jeweils einen in der XAR-Datei aufgezeichneten Hash Header, und dieser Header wiederum ist signiert. Wenn Sie beispielsweise ein Installationsskript ändern, nachdem das Paket signiert wurde, ist die Signatur ungültig.

Möglicherweise möchten Sie auch Ihre Plug-Ins und Bibliotheken signieren. Obwohl dies derzeit nicht erforderlich ist, wird dies in Zukunft der Fall sein, und es ist nicht nachteilig, Signaturen für diese Komponenten zu haben.

Je nach Situation kann Codesign zu Ihrer ausführbaren Mach-O-Datei hinzugefügt, ihr erweiterte Attribute hinzugefügt oder neue Dateien im Inhaltsverzeichnis Ihres Bundles erstellt werden. Keine Ihrer anderen Dateien wird geändert.

Auch von hier aus ist es nicht unbedingt wahr, dass eine ungültige Signatur für eine Anwendung dazu führt, dass sie nicht gestartet werden kann. Die Seite sagt:

Es ist Sache des Systems oder Programms, das signierten Code startet oder lädt, zu entscheiden, ob die Signatur überprüft werden soll, und zu bestimmen, wie die Ergebnisse dieser Überprüfung ausgewertet werden sollen.

Eine Anwendung kann Änderungen zulassen.

Ihre beste Wahl ist ein Versuch-und-Irrtum-Ansatz mit jeder Anwendung, die Sie ändern möchten. Es kann funktionieren, es kann nicht. Es gibt keine immer wahre Antwort, die gegeben werden kann.

Wenn eine App signiert wurde, können Sie nach einer Contents/CodeResourcesDatei oder einer Contents/_CodeSignature/CodeResourcesDatei im Bundle suchen . Diese Datei listet alle signierten Komponenten und ihre erwarteten Hashwerte im Bundle auf. Es ist ein guter Ort, um zu verstehen, welche Teile der Anwendung ein Entwickler als kritisch genug erachtet, um auf Änderungen zu achten.

Ian C.
quelle
0

Obwohl sich die Frage speziell auf Mountain Lion bezieht, gibt es eine wichtige Änderung in der neueren Version von macOS. Unter macOS 10.11 und höher werden Signaturen abgelehnt, die nicht den gesamten Code abdecken.

Siehe Technischer Hinweis TN2206 - macOS Code Signing In Depth .

Gunnar
quelle