
Approfondimento didattico sui bundle di app macOS, sui file plist e sul comportamento dei processi launchd, con note di sicurezza offensiva sull'impacchettamento di payload come file .app e sull'elusione del monitoraggio dell'albero dei processi.
Passare a macOS da Linux o Windows può sembrare come camminare in una terra nuova e sconosciuta. Dato che Linux è open-source e Windows è ben documentato e molto popolare (e macOS non è né l'uno né l'altro, per l'esattezza), macOS può essere impegnativo a volte. In questo articolo del blog, intendo discutere alcune delle prime cose che potresti notare su macOS - App, App ovunque!
Venendo da un background Windows o Linux, il concetto di App potrebbe sembrare strano. Sappiamo tutti che i thread sono "unità di esecuzione" e che i processi sono contenitori per thread con il proprio spazio di indirizzamento -- cosa c'è altro? Beh, i processi sono raramente distribuiti in file singoli. Sia su Windows che su Linux ci sono molte cose di cui il codice potrebbe aver bisogno per funzionare, alcune delle quali sono:
.dll, .so). Ad esempio, la libreria runtime del C (msvcr<version>.dll su Windows, libc-<version>.so) così come altre dipendenze.PE, che ha delle directory - una di queste è la directory delle risorse (anche in qualche modo documentata qui) che può contenere risorse (immagini, stringhe e altro). Le risorse potrebbero anche essere caricate dinamicamente dal disco, ovviamente.PE stesso (leggi qui) o nei file di catalogo (cioè, esternamente).xml, ini, json) e il Registro di Windows.Beh, macOS pone una forte enfasi sui Application Bundle. L'idea è di impacchettare (quasi) tutto ciò che serve al programma per funzionare in una struttura di directory - incluse risorse, informazioni di localizzazione, ecc.. Naturalmente, non tutto può essere impacchettato in modo ordinato (come la libreria runtime del C, per esempio) - ma significa comunque che le cose sono raggruppate insieme in modo pulito - nessun bisogno di navigare un enorme Registro o di leggere pagine di manuale per oscure posizioni di file di configurazione. Gli application bundle sono semplicemente directory che terminano con .app - anche se l'interfaccia utente nasconde l'estensione .app (e il fatto che sia una directory).
Dal punto di vista di un attaccante questo è interessante - poiché un Application Bundle può avere icone arbitrarie e nasconde l'estensione .app - consegnare malware potrebbe essere ottenuto ingannando un utente ignaro facendogli cliccare una tale app. Per esempio, pensa a un file Resume.app con un'icona PDF.
La struttura delle directory per un Application Bundle può essere facilmente esaminata, ovviamente con l'app Calculator integrata:
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 %
Come puoi vedere, Calculator.app è una directory. Sotto di essa c'è un singolo elemento - un'altra directory chiamata Contents.
Sotto Contents ci sono diversi elementi:
Info.plist - contiene metadati sull'App. Ne parleremo più avanti.MacOS - contiene l'eseguibile principale dell'App (come si può vedere nel terzo elenco di directory).PkgInfo - non obbligatorio. Un file binario che contiene informazioni sul pacchetto.PlugIns - non obbligatorio. Una directory che potrebbe contenere plugin per l'App. Calculator ne ha due - uno per "Base e Scientifica" e uno per "Esadecimale" (non so davvero perché abbiano fatto quella separazione, né mi interessa).Resources - non obbligatorio. Come suggerisce il nome, contiene risorse. Potresti trovare diversi elementi lì, inclusi file .icns con icone, oltre a directory con il suffisso .lprroj che sono relative alla localizzazione._CodeSignature - non obbligatorio. Come suggerisce il nome - contiene informazioni sulla firma del codice.version.plist - non obbligatorio, contiene informazioni sulla versione.Nota che ci sono pochissimi elementi che sono ufficialmente richiesti. In effetti, possiamo creare la nostra prima App senza nemmeno compilare nulla! Ma prima dobbiamo discutere di quel file Info.plist.
Più guardi macOS, più troverai questi strani file. Non sono altro che glorificati file di configurazione.
Avranno sempre un'estensione .plist, che è solo un modo abbreviato per chiamare il loro nome formale: file Property list.
Sfortunatamente, ci sono 3 diversi formati plist mantenuti da Apple:
xml, leggibile dagli esseri umani.json, non ampiamente utilizzato.bplist come magic.Fortunatamente, esiste un'utilità chiamata plutil che supporta tutti i formati. Per visualizzare un file plist, basta usare plutil -p. Per esempio:
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 %