
Plongée pédagogique dans la protection intégrée d'Apple contre les malwares : bases de données de signatures, règles YARA, intégration de Gatekeeper, binaires de remédiation et flux de détection macOS.
Poursuivant ma série d'articles de blog sur l'introduction à macOS, j'ai décidé de consacrer un court article à XProtect.
XProtect est le système antivirus et de signatures de logiciels malveillants intégré d'Apple pour macOS.
Il fonctionne dans le cadre du service XProtectService, qui analyse les applications et autres contenus exécutables à la recherche de signatures de logiciels malveillants connues.
XProtect fonctionne en arrière-plan et est mis à jour silencieusement par Apple via le mécanisme XProtectRemediator (plus de détails plus loin).
Il a 3 fonctions principales :
Le répertoire /Library/Apple/System/Library/CoreServices/XProtect.bundle est le principal bundle qui contient la configuration et les définitions de signatures de XProtect.
Il s'agit d'un répertoire système en lecture seule, mis à jour silencieusement par Apple via les mises à jour de XProtect.
Dans ce répertoire, on trouve certains fichiers intéressants, tous mis à jour périodiquement par Apple et protégés par System Integrity Protection (SIP).
Le fichier /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.plist stocke les signatures de logiciels malveillants utilisées par XProtect pour détecter les menaces connues.
Il contient des entrées associant des familles de logiciels malveillants à des règles de détection spécifiques, notamment des hashs et des modèles de noms de fichiers.
Voici un exemple d'une famille de logiciels malveillants - Bundalore :
<dict>
<key>Description</key>
<string>OSX.Bundlore.D</string>
<key>LaunchServices</key>
<dict>
<key>LSItemContentType</key>
<string>com.apple.application-bundle</string>
</dict>
<key>Matches</key>
<array>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>46617364554153</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>20006500630068006F002000</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>20007C0020006F00700065006E00730073006C00200065006E00630020002D006100650073002D003200350036002D0063006600620020002D007000610073007300200070006100730073003A</string>
</dict>
<dict>
<key>MatchFile</key>
<dict>
<key>NSURLTypeIdentifierKey</key>
<string>com.apple.applescript.script</string>
</dict>
<key>MatchType</key>
<string>Match</string>
<key>Pattern</key>
<string>002D00730061006C00740020002D00410020002D00610020002D00640020007C002000620061007300680020002D0073</string>
</dict>
</array>
</dict>
C'est assez lisible, la seule partie notable est que l'argument string de chaque correspondance est en représentation hexadécimale, par exemple 002D00730061006C00740020002D00410020002D00610020002D00640020007C002000620061007300680020002D0073 correspond à -salt -A -a -d | bash -s.
C'est, bien sûr, une mine d'or pour les auteurs de logiciels malveillants, qui savent exactement quels modèles éviter.
Le fichier /Library/Apple/System/Library/CoreServices/XProtect.bundle/XProtect.meta.plist est un fichier de métadonnées qui définit des règles supplémentaires pour XProtect, notamment les politiques d'application et les informations de version.
Il spécifie quelles versions de macOS appliquent certaines règles de XProtect et les actions prises lors de la détection, ainsi que les listes noires pour les plugins.
Voici un exemple :
<key>JavaWebComponentVersionMinimum</key>
<string>1.6.0_45-b06-451</string>
<key>PlugInBlacklist</key>
<dict>
<key>10</key>
<dict>
<key>com.apple.java.JavaAppletPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>14.8.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.apple.java.JavaPlugin2_NPAPI</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>14.8.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.macromedia.Flash Player ESR.plugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>18.0.0.382</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.macromedia.Flash Player.plugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>32.0.0.101</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.microsoft.SilverlightPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>5.1.41212.0</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
<key>com.oracle.java.JavaAppletPlugin</key>
<dict>
<key>MinimumPlugInBundleVersion</key>
<string>1.8.51.16</string>
<key>PlugInUpdateAvailable</key>
<true/>
</dict>
</dict>
</dict>
Comme vous pouvez le voir, ceux-ci contiennent par exemple des informations de version pour les plugins "mis sur liste noire".