
Plongée pédagogique en profondeur dans les bundles d'applications macOS, les fichiers plist et le comportement des processus launchd, avec des notes de sécurité offensive sur l'empaquetage de payloads sous forme de fichiers .app et le contournement de la surveillance de l'arborescence des processus.
Passer de Linux ou Windows à macOS peut donner l'impression de débarquer dans un nouveau monde inconnu. Linux étant open-source et Windows étant bien documenté et très populaire (et macOS n'étant ni l'un ni l'autre, exactement), macOS peut être parfois difficile à appréhender. Dans cet article, j'ai l'intention d'aborder certaines des premières choses que vous pourriez remarquer sur macOS - des Apps, des Apps partout !
Venant d'un environnement Windows ou Linux, le concept d'Apps peut sembler étrange. Nous savons tous que les threads sont des « unités d'exécution » et que les processus sont des conteneurs de threads avec leur propre espace d'adressage -- quoi de plus à comprendre ? Eh bien, les processus sont rarement déployés dans un seul fichier. Sur Windows comme sur Linux, le code peut avoir besoin de nombreuses choses pour fonctionner, parmi lesquelles :
.dll, .so). Par exemple, la bibliothèque d'exécution C (msvcr<version>.dll sur Windows, libc-<version>.so) ainsi que d'autres dépendances.PE, qui possède des répertoires - l'un d'eux est le répertoire de ressources (même partiellement documenté ici) qui peut contenir des ressources (images, chaînes de caractères, etc.). Les ressources peuvent également être chargées dynamiquement depuis le disque, bien évidemment.PE lui-même (lisez ici) ou dans des fichiers de catalogue (c'est-à-dire, en externe).xml, ini, json) et la base de registre Windows.Eh bien, macOS met fortement l'accent sur les Application Bundles. L'idée est d'empaqueter (presque) tout ce qui est nécessaire au fonctionnement du programme dans une structure de répertoires - y compris les ressources, les informations de localisation, etc. Bien sûr, tout ne peut pas être joliment empaqueté (comme la bibliothèque d'exécution C, par exemple) - mais cela signifie tout de même que les éléments sont regroupés proprement - pas besoin de naviguer dans une énorme base de registre ni de lire des pages de manuel pour trouver des emplacements de fichiers de configuration obscurs. Les application bundles sont simplement des répertoires se terminant par .app - même si l'interface utilisateur masque l'extension .app (et le fait qu'il s'agisse d'un répertoire).
Du point de vue d'un attaquant, c'est intéressant - puisqu'une Application Bundle peut avoir des icônes arbitraires et masque l'extension .app - la livraison de malware pourrait être réalisée en trompant un utilisateur peu méfiant pour qu'il clique sur une telle app. Par exemple, pensez à un fichier Resume.app avec une icône de PDF.
La structure de répertoires d'une Application Bundle peut être facilement examinée, évidemment avec l'application Calculator intégrée :
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 %
Comme vous pouvez le voir, Calculator.app est un répertoire. Sous celui-ci se trouve un seul élément - un autre répertoire appelé Contents.
Sous Contents se trouvent plusieurs éléments :
Info.plist - contient les métadonnées de l'App. Plus de détails à ce sujet plus loin.MacOS - contient l'exécutable principal de l'App (comme on peut le voir dans la 3ème liste de répertoires).PkgInfo - non obligatoire. Un fichier binaire contenant des informations sur le paquet.PlugIns - non obligatoire. Un répertoire pouvant contenir des plugins pour l'App. Calculator en a deux - un pour « Basic and Scientific » et un pour « Hexadecimal » (je ne sais vraiment pas pourquoi ils ont fait cette séparation, et je m'en fiche).Resources - non obligatoire. Comme son nom l'indique, contient des ressources. On peut y trouver plusieurs éléments, notamment un fichier .icns contenant les icônes, ainsi que des répertoires avec le suffixe .lprroj liés à la localisation._CodeSignature - non obligatoire. Comme son nom l'indique - contient les informations de signature de code.version.plist - non obligatoire, contient des informations de version.Remarquez qu'il y a très peu d'éléments officiellement requis. En fait, nous pouvons créer notre propre première App sans même compiler quoi que ce soit !
Mais il faut d'abord aborder ce fichier Info.plist.
Plus vous regardez macOS, plus vous trouverez ces fichiers étranges. Ce ne sont rien de plus que des fichiers de configuration améliorés.
Ils ont toujours une extension .plist, qui n'est qu'un raccourci pour leur nom formel : les fichiers Property list.
Malheureusement, il existe 3 formats plist différents maintenus par Apple :
xml, lisible par les humains.json, peu utilisé.bplist comme signature magique.Heureusement, il existe un utilitaire appelé plutil qui prend en charge tous les formats. Pour afficher un fichier plist, utilisez simplement plutil -p. Par exemple :
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 %