Wie kompiliere ich Apples Sicherheitsframework?

Ich versuche, meine eigene Kopie von Apples Security.framework zu kompilieren, insbesondere Version 55471.14.18, die in OS X 10.9.5 enthalten war und deren Quellcode von https://opensource.apple.com/tarballs/Security heruntergeladen werden kann /Security-55471.14.18.tar.gz .

Ich verwende eine Kopie von Mac OS X 10.9.5 in einer VM. Xcode 6.2 wurde installiert und xcode-select --installseparat ausgeführt, um Systemheader zu erfassen.


Die Readme-Datei, die im Quelldownload enthalten ist, sagt:

Um dieses Projekt in einer Darwin-Umgebung zu erstellen (im Gegensatz zum internen Erstellen bei Apple), verwenden Sie den Darwin-Buildstil. Wenn Sie mit Xcode erstellen, wählen Sie „Darwin“ aus dem Popup „Active Build Style“. Wenn Sie über die Befehlszeile erstellen, geben Sie den Build-Stil wie folgt an:

% xcodebuild -buildstyle Darwin installieren

Aber wenn ich den angegebenen Befehl ausführe, wird mir gesagt:

xcodebuild: error: option '-buildstyle' is no longer supported

Da meine Kopie von Xcode zum Zeitpunkt der Veröffentlichung dieses Codes aktuell war, bin ich mir nicht sicher, was ich von diesem Fehler halten soll. Ich beschloss, es zu ignorieren und nur mit einem Standardbefehl weiterzumachen xcodebuild.


Das erste Problem, auf das ich stieß, war leicht zu beheben, macht mir aber Sorgen, dass ich etwas Größeres übersehe. Der Compiler beschwert sich:

/Users/Jonathan/Desktop/Security-55471.14.18/libsecurity_utilities/lib/macho++.cpp:39:18: error: 
unused variable 'MAX_ARCH_COUNT' [-Werror,-Wunused-const-variable]
static const int MAX_ARCH_COUNT = 100;

Da die Variable angeblich sowieso unbenutzt ist, habe ich die Datei einfach geöffnet und die Zeile auskommentiert static const int MAX_ARCH_COUNT = 100;.


Leider bin ich hier gegen eine Mauer gelaufen. Xcodebuild scheint alle Arten von Headern zu wollen, die nicht auf meinem System oder im Projekt enthalten sind. Zum Beispiel:

/Users/Jonathan/Desktop/Security-55471.14.18/libsecurity_utilities/lib/mach++.cpp:33:10: fatal error: 
      'bootstrap_priv.h' file not found
#include <bootstrap_priv.h>

Diese Header sind ebenfalls Open Source und ich weiß, wo ich sie finden kann! Bootstrap_priv.h ist beispielsweise Teil von launchd; die OS X 10.9.5-Version kann von https://opensource.apple.com/tarballs/launchd/launchd-842.92.1.tar.gz heruntergeladen werden

Ich verstehe jedoch nicht, wo ich diese Header platzieren soll, damit der Compiler sie finden kann! Dinge, die ich versucht habe:

  • Kopieren des launchd-Projekts nach /usr/include/
  • Kopieren des launchd-Projekts in das Stammverzeichnis des Sicherheitsprojekts
  • Nur Bootstrap_priv.h nach /usr/include/ kopieren
  • Kopieren Sie einfach bootstrap_priv.h in das Stammverzeichnis des Sicherheitsprojekts
  • Kopieren Sie einfach bootstrap_priv.h in das Projektverzeichnis/libsecurity_utilities/lib/

Dieser letzte Versuch hat mich tatsächlich dazu gebracht, den Fehler zu überwinden (und den nächsten fehlenden Header zu sehen, IOPMLibPrivate.h), aber ich bin mir ziemlich sicher, dass es nicht das ist, was ich tun sollte! Während ich immer wieder Header an zufälligen Stellen innerhalb des Projekts hinzufüge, bleiben andere Quelldateien hängen und finden Header, die ich bereits an anderer Stelle kopiert habe. Einige der Header selbst bleiben auf diese Weise hängen und erwarten einen anderen relativen Pfad für Abhängigkeiten als den, den das Hauptprojekt zu benötigen scheint.


Ich fühle mich hier extrem überfordert! Wohin sollen diese Header-Dateien eigentlich gehen, und was bedeutet diese -buildstyleOption, die ich einschließen soll, die aber nicht ausgeführt werden kann? Nichts davon scheint irgendwo dokumentiert zu sein!

Das passte nirgendwo in die Frage, aber da ich vermute, dass jemand fragen wird ... ist mein ultimatives Ziel, einige neuere SSL-Verschlüsselungen auf diese ältere Version von Security.framework zurückzuportieren, damit Mavericks mit der Moderne interagieren können Netz! Ob ich diesen Code tatsächlich zum Laufen bringen kann, ist eine offene Frage, aber eins nach dem anderen – einfach das Original zum Kompilieren zu bringen, ist ein notwendiger erster Schritt!
Wenn Sie sich die Frage ansehen, müssen Sie Zeit damit verbringen, C-basierte Projekte zu verwalten und zu erstellen. Damit Sie genug wissen, um dies selbst zu debuggen. Eine Antwort hier wäre zu lang. b
Die aktuellen cpp-Includes liegen bei /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/chrono, das könnte einen Versuch wert sein. Es gibt auch diese Möglichkeit, dem Compiler Include-Pfade hinzuzufügen: stackoverflow.com/questions/5846804/… aber all dies scheint nicht zum Thema zu gehören und gut für Stackoverflow zu sein
Nicht wirklich, ich habe gelernt, indem ich auf verschiedenen Betriebssystemen programmiert und Builds nach Bedarf erstellt habe. Für Builds schauen Sie sich vielleicht Macports an und sehen Sie, wie es funktioniert, und beheben Sie einige ihrer Tickets. Homebrew wäre auch möglich
Wenn Sie eine xcodeproj-Datei haben, können Sie sie normalerweise in xcode öffnen, zu den Build-Einstellungen gehen und sie unter Header-Suchpfaden hinzufügen. Es scheint, dass ein xcodeproj tatsächlich als Teil des Pakets enthalten ist, also können Sie das versuchen. Ich bin auch daran interessiert, Ihre Suche nach einer Rückportierung der neueren Chiffren zu verfolgen! Bitte poste etwas, wenn du Fortschritte machst.
(Forts.) Obwohl ich der Meinung bin, dass es für das Ziel, Mavericks mit dem modernen Web zu verwenden, einfacher sein könnte, den nativen sicheren Transport vollständig zu umgehen und einfach openssl zu verwenden. Sie können die meisten Befehlszeilentools mit openssl verknüpfen, und jeder Nicht-Safari-Browser verwendet seine eigene SSL-Implementierung (boringssl, openssl usw.).
@1110101001 Danke! – Ich weiß nicht, warum ich anfangs so darauf aus war, die Befehlszeile zu verwenden! Dadurch bin ich im Kompilierungsprozess viel weiter gekommen, obwohl ich immer noch einige Fehler bei nicht deklarierten Objekten bekomme. Ich habe heute auch etwas gefunden, das sowohl frustrierend als auch ermutigend ist: Jemand anderes hat dies zum Kompilieren gebracht, aber ich kann es anscheinend nicht mit seinem SDK replizieren. github.com/samdmarshall/OSXPrivateSDK/blob/master/OpenSource.md
@1110101001 Ich stimme in Bezug auf Open-Source-Tools zu – was ich beheben möchte, sind GUI-Mac-Apps, die Apples SecureTransport verwenden. Apple Mail, NetNewsWire, verschiedene Dashboard-Widgets usw. haben alle Probleme mit SSL.
> Ich erhalte immer noch einige Fehler bei nicht deklarierten Objekten. Welchen Fehler bekommst du? Sind diese Symbole Teil zusätzlicher Header oder fehlen sie vollständig? Das Projekt, das Sie verlinkt haben, erwähnt, dass sie es nicht mit security.framework versucht haben. Es könnte sich lohnen, ein Problem auf dieser Seite zu öffnen, da sie möglicherweise mehr Erfahrung mit der Fehlerbehebung haben.
Auch das könnte verrückt sein, aber als letztes Mittel könnten Sie versuchen, eine Art TLS-Proxy einzurichten und dann Anfragen abzufangen/weiterzuleiten. Dies ist natürlich nicht sehr elegant, da Sie im Wesentlichen Ihr eigenes System MITMen und Ihr eigenes Root-Zertifikat hinzufügen müssen. Eine etwas sauberere Option, wenn Sie die Domänen kennen, mit denen Sie sich im Voraus verbinden, könnte darin bestehen, Ihr Ziel binär zu patchen, sodass es sich über einfaches HTTP mit einer von Ihnen kontrollierten Domäne verbindet, die Sie dann weiterleiten können. Wie einfach dies ist, hängt von der spezifischen App ab, auf die Sie abzielen.

Antworten (1)

Das war am Ende viel komplizierter, als ich denke, dass es zu Recht in das Q&A-Format dieser Seite passt. Trotzdem wollte ich diese Frage nicht offen lassen, da ich irgendwie das Framework zum Bauen bekommen habe.

Dieses Repository sollte vollständig in 10.9.5 erstellt werden, wobei die neueste kompatible Version von xCode ausgeführt wird und das 10.9 SDK verwendet wird. https://github.com/Wowfunhappy/Wowfunhappy-Mavericks-Security-Framework

Ich habe die "User Framework-Suchpfade" verwendet, um Bibliotheken hinzuzufügen, aber da es sich um einen absoluten und nicht um einen relativen Pfad handelt, müssen Sie ihn möglicherweise auf Ihrem Computer aktualisieren. Dies sollte trivial sein, auch wenn es etwas mühsam ist – alle eigentlichen Frameworks sind im Git-Repository enthalten. Diese Frameworks stammen aus einer Kombination aus opensource.apple.com (wo immer verfügbar, aus offensichtlichen Gründen bevorzugt), dem rückentwickelten privaten SDK von samdmarshall und dem Darling-Projekt.

Das eingebaute Framework scheint nicht wirklich zu funktionieren – wenn ich es auf meiner Festplatte ersetze, kann der Computer (glücklicherweise eine VM) nicht mehr booten. Ich hatte ursprünglich erwartet, dass dies ein Code-Signatur-Problem ist, aber es sieht nicht so aus, als wäre das das Problem. Aber trotzdem baute es!

tl;dr Ich habe kein dummes Versehen gemacht, Apples Open-Source-Versionen sind im Grunde unmöglich ohne zusätzliches Reverse Engineering zu erstellen. Glücklicherweise wurde diese Reverse-Engineering-Arbeit größtenteils von verschiedenen Projekten durchgeführt, aber anscheinend nicht bis zu dem Punkt, an dem Sie etwas bauen können, das tatsächlich funktioniert.

@1110101001 (Weil Sie nach Updates gefragt haben) Ich habe Ihren Rat mit einem Proxy-Server befolgt, der gesamte https-Verkehr läuft jetzt über Squid und es funktioniert großartig! forums.macrumors.com/threads/…
Gute Arbeit! (Aus irgendeinem Grund hat mich Stackexchange nicht über Ihre Erwähnung benachrichtigt). Möglicherweise können Sie weitere Informationen zum Grund für den Startfehler extrahieren, indem Sie im Einzelbenutzermodus starten. Aber ich habe das Gefühl, dass der Open-Source-Version des von ihnen bereitgestellten Frameworks möglicherweise einige der erforderlichen privaten Funktionen fehlen.
Wow. Dieser Quellbaum ist notorisch schwer zu kompilieren, da er von internen und privaten Tools abhängt, die AFAIK nicht dokumentiert / veröffentlicht oder rückentwickelt wurden. Vielen Dank für die Beiträge
Haben Sie jemals herausgefunden, was die fehlenden Symbole waren, die den Start verhindern? Vielleicht könnte eine Alternative zum Kompilieren des gesamten Security.framework darin bestehen, nur zu kompilieren SecureTransportund dann wieder etwas zu exportieren, damit die Symbole in Ihrem die im Security.framework des Systems überschreiben
Obwohl ich vermute, dass dies möglicherweise nicht ausreicht, da die Kakaoschicht möglicherweise die neuen Cipher Suites kennen muss (nicht 100% sicher). Wie wäre es mit einer alternativen Idee: Unter der Annahme, dass die Mehrheit der Cocoa-Apps verwenden wird NSURLConnection, swizzle Sie das mit Ihrer eigenen Implementierung, die Ihr eigenes openssl verwendet.
@ 1110101001 Ich habe mich nie wirklich weiter damit befasst. Mein Gefühl war, dass ich bereits so viel operiert hatte, um es überhaupt bauen zu können, dass die Chancen, es in einen funktionierenden Zustand zu bringen, äußerst gering waren, ganz zu schweigen von der Aktualisierung der Cipher Suites. Erschwerend kommt hinzu, dass der Grund, warum ich dachte, dass eine Aktualisierung des Frameworks überhaupt machbar sein könnte, darin bestand, dass Internezel es für Leopard ( sourceforge.net/projects/leopard-webkit/files/… ) getan hat, aber ich habe seitdem von Leopard-Benutzern gehört dass sogar dieser Versuch halb gebrochen war.
@ 1110101001 Stattdessen habe ich Ihren Rat befolgt und einen Mitm-Proxy eingerichtet. So sehr sich das ein bisschen klumpig anfühlt , es funktioniert wirklich super gut! Hin und wieder stoße ich auf eine App oder ein Dienstprogramm, das etwas nervt (z. B. die System-Proxy-Einstellungen respektiert, aber nicht den Vertrauensstatus des Schlüsselbundzugriffs), aber das ist nicht häufig. Ich habe ein Setup-Paket dafür auf meine Website gestellt und viele Leute scheinen es basierend auf der Anzahl der Downloads zu verwenden! jonathanalland.com/old-osx-projects.html
@1110101001 Ich mag die Swizzle-Idee wirklich, ich könnte ein SIMBL-Plugin haben, das genau das in allen Apps macht! Ich werde wahrscheinlich nicht damit herumspielen, da das Proxy-Setup funktioniert, aber es ist eine nette Option. (Ich habe jetzt auch etwas weniger Freizeit als mitten in der Pandemie.)