
Lehrreicher Deep Dive in macOS-App-Bundles, Plist-Dateien und das Prozessverhalten von launchd, mit Hinweisen zur offensiven Sicherheit beim Verpacken von Payloads als .app-Dateien und zur Umgehung von Prozessbaum-Überwachung.
Der Wechsel zu macOS von Linux oder Windows kann sich anfühlen, als würde man in einem fremden neuen Land umherirren. Da Linux Open-Source ist und Windows gut dokumentiert und sehr beliebt ist (und macOS genau genommen keines von beidem ist), kann macOS manchmal herausfordernd sein. In diesem Blogbeitrag möchte ich einige der ersten Dinge besprechen, die einem auf macOS auffallen könnten - Apps, Apps überall!
Wenn man aus der Windows- oder Linux-Welt kommt, mag das Konzept von Apps seltsam erscheinen. Wir alle wissen, dass Threads "Ausführungseinheiten" sind und Prozesse Container für Threads mit eigenem Adressraum sind -- was steckt schon mehr dahinter? Nun, Prozesse werden selten in einzelnen Dateien ausgeliefert. Sowohl unter Windows als auch unter Linux gibt es viele Dinge, die Code möglicherweise benötigt, um zu funktionieren, einige davon sind:
.dll, .so). Zum Beispiel die C-Laufzeitbibliothek (msvcr<version>.dll unter Windows, libc-<version>.so) sowie andere Abhängigkeiten.PE, das Verzeichnisse besitzt - eines davon ist das Ressourcenverzeichnis (sogar gewissermaßen hier dokumentiert), das Ressourcen (Bilder, Zeichenketten und andere) enthalten kann. Ressourcen können natürlich auch dynamisch von der Festplatte geladen werden.PE-Datei selbst enthalten sein (lies hier) oder in Katalogdateien (d. h. extern).xml, ini, json) und die Windows-Registry.Nun, macOS legt großen Wert auf Application Bundles. Die Idee ist, (fast) alles, was das Programm zum Ausführen benötigt, in einer Verzeichnisstruktur zu bündeln - einschließlich Ressourcen, Lokalisierungsinformationen usw. Natürlich kann nicht alles sauber verpackt werden (wie zum Beispiel die C-Laufzeitbibliothek) - aber es bedeutet dennoch, dass die Dinge ordentlich gebündelt werden - keine Notwendigkeit, eine riesige Registry zu durchforsten oder Handbuchseiten für obskure Konfigurationsdateipfade zu lesen. Application Bundles sind einfach Verzeichnisse, die auf .app enden - auch wenn die Benutzeroberfläche die .app-Erweiterung (und die Tatsache, dass es sich um ein Verzeichnis handelt) verbirgt.
Aus der Perspektive eines Angreifers ist das interessant - da ein Application Bundle beliebige Symbole haben und die .app-Erweiterung verbergen kann, könnte das Ausliefern von Malware erreicht werden, indem man einen ahnungslosen Benutzer dazu bringt, auf eine solche App zu klicken. Denke zum Beispiel an eine Resume.app-Datei mit einem PDF-Symbol.
Die Verzeichnisstruktur eines Application Bundle kann leicht untersucht werden, offensichtlich anhand der integrierten App Calculator:
jbo@McJbo ~ % cd /System/Applications/Calculator.app
jbo@McJbo Calculator.app % ll
total 0
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 .
drwxr-xr-x 43 root wheel 1376 Mar 17 21:34 ..
drwxr-xr-x 9 root wheel 288 Mar 17 21:34 Contents
jbo@McJbo Calculator.app % cd Contents
jbo@McJbo Contents % ll
total 16
drwxr-xr-x 9 root wheel 288 Mar 17 21:34 .
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 ..
-rw-r--r-- 1 root wheel 2147 Mar 17 21:34 Info.plist
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 MacOS
-rw-r--r-- 204 root wheel 8 Mar 17 21:34 PkgInfo
drwxr-xr-x 4 root wheel 128 Mar 17 21:34 PlugIns
drwxr-xr-x 54 root wheel 1728 Mar 17 21:34 Resources
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 _CodeSignature
-rw-r--r-- 1 root wheel 461 Mar 17 21:34 version.plist
jbo@McJbo Contents % cd MacOS
jbo@McJbo MacOS % ll
total 344
drwxr-xr-x 3 root wheel 96 Mar 17 21:34 .
drwxr-xr-x 9 root wheel 288 Mar 17 21:34 ..
-rwxr-xr-x 1 root wheel 540912 Mar 17 21:34 Calculator
jbo@McJbo MacOS %
Wie du sehen kannst, ist Calculator.app ein Verzeichnis. Darunter befindet sich ein einzelnes Element - ein weiteres Verzeichnis namens Contents.
Unter Contents befinden sich mehrere Elemente:
Info.plist - enthält Metadaten über die App. Mehr dazu später.MacOS - enthält die Haupt-Executable der App (wie in der dritten Verzeichnisauflistung zu sehen ist).PkgInfo - optional. Eine Binärdatei, die Paketinformationen enthält.PlugIns - optional. Ein Verzeichnis, das Plugins für die App enthalten kann. Calculator hat zwei - eines für "Basic and Scientific" und eines für "Hexadecimal" (ich weiß wirklich nicht, warum sie diese Trennung vorgenommen haben, und es ist mir auch egal).Resources - optional. Wie der Name vermuten lässt, enthält es Ressourcen. Du findest dort möglicherweise mehrere Elemente, darunter eine .icns-Datei mit Symbolen sowie Verzeichnisse mit dem Suffix .lprroj, die mit der Lokalisierung zusammenhängen._CodeSignature - optional. Wie der Name vermuten lässt - enthält Informationen zur Codesignierung.version.plist - optional, enthält Versionsinformationen.Beachte, dass es nur sehr wenige Elemente gibt, die offiziell erforderlich sind. Tatsächlich können wir unsere erste eigene App erstellen, ohne auch nur etwas zu kompilieren!
Aber zuerst müssen wir die Datei Info.plist besprechen.
Je mehr man sich macOS ansieht, desto mehr dieser seltsamen Dateien findet man. Sie sind nichts weiter als hochtrabend bezeichnete Konfigurationsdateien.
Sie haben immer eine .plist-Erweiterung, die nur eine Kurzform ihres formalen Namens ist: Property list-Dateien.
Leider gibt es drei verschiedene plist-Formate, die von Apple gepflegt werden:
xml-Format, das für Menschen lesbar ist.json-Format, das nicht weit verbreitet ist.bplist als Magic erkennbar ist.Glücklicherweise gibt es ein Dienstprogramm namens plutil, das alle Formate unterstützt. Um eine plist-Datei auszugeben, verwende einfach plutil -p. Zum Beispiel:
jbo@McJbo Contents % plutil -p Info.plist | head -n 20
{
"BuildMachineOSBuild" => "22A380007"
"CFBundleDevelopmentRegion" => "English"
"CFBundleExecutable" => "Calculator"
"CFBundleGetInfoString" => "10.14, Copyright © 2000-2018, Apple Inc."
"CFBundleHelpBookFolder" => "Calculator.help"
"CFBundleHelpBookName" => "com.apple.Calculator.help"
"CFBundleIconFile" => "AppIcon"
"CFBundleIconName" => "AppIcon"
"CFBundleIdentifier" => "com.apple.calculator"
"CFBundleInfoDictionaryVersion" => "6.0"
"CFBundleName" => "Calculator"
"CFBundlePackageType" => "APPL"
"CFBundleShortVersionString" => "10.16"
"CFBundleSignature" => "????"
"CFBundleSupportedPlatforms" => [
0 => "MacOSX"
]
"CFBundleVersion" => "223"
"CTIgnoreUserFonts" => 1
jbo@McJbo Contents %