
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 .
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".
Dans les versions récentes, XProtect semble avoir commencé à prendre en charge YARA.
Le fichier /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/XProtect.yara contient plusieurs règles YARA au format texte, voici un court exemple :
rule XProtect_MACOS_SLEEPYSTEGOSAURUS_SYM {
meta:
description = "MACOS.SLEEPYSTEGOSAURUS.SYM"
uuid = "BB4F7D16-C939-4047-A9AF-E74E7B51FAC1"
strings:
$a1 = { 45 78 65 63 43 6D 64 }
$a2 = { 47 65 74 48 6F 73 74 49 6E 66 6F }
$a3 = { 52 75 6E 53 63 72 69 70 74 }
$a4 = { 52 75 6E 53 63 72 69 70 74 55 72 6C }
$a5 = { 4C 61 75 6E 63 68 50 6C 69 73 74 }
$a6 = { 43 68 65 63 6B 50 72 6F 63 65 73 73 }
$a7 = { 43 68 65 63 6B 49 6E }
$a8 = { 52 75 6E 43 6D 64 46 69 6C 65 }
$a9 = { 53 68 6F 77 48 74 6D 6C }
$a10 = { 50 6C 69 73 74 48 65 6C 70 65 72 }
$a11 = { 4C 61 75 6E 63 68 64 48 65 6C 70 65 72 }
$a12 = { 43 6F 6D 6D 61 6E 64 46 69 6C 65 }
$a13 = { 57 72 69 74 65 50 6C 69 73 74 }
$a14 = { 4A 53 4F 4E 46 69 6C 65 50 72 6F 63 65 73 73 6F 72 }
$a15 = { 43 68 72 6F 6D 65 48 65 6C 70 65 72 }
$a16 = { 53 61 6E 64 62 6F 78 65 72 }
condition:
Macho and filesize < 2MB and all of them
}
Cet article n'est pas consacré aux règles YARA, mais comme précédemment - c'est une mine d'or pour les auteurs de logiciels malveillants (par exemple 43 68 65 63 6B 50 72 6F 63 65 73 73 correspond à CheckProcess).
Ici, vous pouvez voir comment Apple a conçu XProtect pour être intégré à Gatekeeper - ce fichier est cependant principalement utilisé par syspolicyd.
Le fichier /Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db est une base de données SQLite contenant une "liste noire" de hashs de fichiers et d'identifiants d'équipe à bloquer.
Vous pouvez le consulter avec l'utilitaire sqlite3 :
jbo@McJbo ~ $ sqlite3 "/Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db" .schema
CREATE TABLE settings (name TEXT, value TEXT, PRIMARY KEY (name));
CREATE TABLE blocked_hashes (hash BLOB, hash_type INTEGER, flags INTEGER, PRIMARY KEY (hash, hash_type));
CREATE TABLE blocked_teams (team_id TEXT, flags INTEGER, PRIMARY KEY (team_id));
jbo@McJbo ~ $ sqlite3 "/Library/Apple/System/Library/CoreServices/XProtect.bundle/Contents/Resources/gk.db" "SELECT * FROM blocked_teams LIMIT 5;"
F9X83Q5222|1
Q6XAB4776L|0
DK5C9Y86C8|0
8VK2WEPW22|0
5LWMEF3EX3|0
jbo@McJbo ~ $
C'est encore une fois une information intéressante pour les auteurs de logiciels malveillants, par exemple - pour savoir quand l'identifiant d'équipe qu'ils ont utilisé pour signer leur logiciel malveillant est sur le radar d'Apple.
Alors que le binaire XProtect se trouve dans /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/MacOS/, vous y trouverez des binaires supplémentaires.
Ce sont des fichiers de remédiation pour des familles spécifiques :
jbo@McJbo ~ $ ls -l /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/MacOS/
total 47256
-rwxr-xr-x 1 root wheel 513696 Feb 27 16:54 XProtect
-rwxr-xr-x 1 root wheel 2498784 Feb 27 16:54 XProtectRemediatorAdload
-rwxr-xr-x 1 root wheel 2367952 Feb 27 16:54 XProtectRemediatorBadGacha
-rwxr-xr-x 1 root wheel 2053968 Feb 27 16:54 XProtectRemediatorBlueTop
-rwxr-xr-x 1 root wheel 2332752 Feb 27 16:54 XProtectRemediatorBundlore
-rwxr-xr-x 1 root wheel 2299648 Feb 27 16:54 XProtectRemediatorCardboardCutout
-rwxr-xr-x 1 root wheel 2333248 Feb 27 16:54 XProtectRemediatorColdSnap
-rwxr-xr-x 1 root wheel 2052736 Feb 27 16:54 XProtectRemediatorCrapyrator
-rwxr-xr-x 1 root wheel 2859040 Feb 27 16:54 XProtectRemediatorDolittle
-rwxr-xr-x 1 root wheel 2205520 Feb 27 16:54 XProtectRemediatorDubRobber
-rwxr-xr-x 1 root wheel 2334752 Feb 27 16:54 XProtectRemediatorEicar
-rwxr-xr-x 1 root wheel 2053120 Feb 27 16:54 XProtectRemediatorFloppyFlipper
-rwxr-xr-x 1 root wheel 2053616 Feb 27 16:54 XProtectRemediatorGenieo
-rwxr-xr-x 1 root wheel 2053504 Feb 27 16:54 XProtectRemediatorGreenAcre
-rwxr-xr-x 1 root wheel 2332800 Feb 27 16:54 XProtectRemediatorKeySteal
-rwxr-xr-x 1 root wheel 4659088 Feb 27 16:54 XProtectRemediatorMRTv3
-rwxr-xr-x 1 root wheel 2382448 Feb 27 16:54 XProtectRemediatorPirrit
-rwxr-xr-x 1 root wheel 2333024 Feb 27 16:54 XProtectRemediatorRankStank
-rwxr-xr-x 1 root wheel 2299728 Feb 27 16:54 XProtectRemediatorRoachFlight
-rwxr-xr-x 1 root wheel 2384416 Feb 27 16:54 XProtectRemediatorSheepSwap
-rwxr-xr-x 1 root wheel 2053232 Feb 27 16:54 XProtectRemediatorSnowBeagle
-rwxr-xr-x 1 root wheel 2350624 Feb 27 16:54 XProtectRemediatorSnowDrift
-rwxr-xr-x 1 root wheel 2019712 Feb 27 16:54 XProtectRemediatorToyDrop
-rwxr-xr-x 1 root wheel 2105696 Feb 27 16:54 XProtectRemediatorTrovi
-rwxr-xr-x 1 root wheel 2332768 Feb 27 16:54 XProtectRemediatorWaterNet
jbo@McJbo ~ $
Une nouvelle application système XProtect stockée sous /Library/Apple/System/Library/CoreServices/XProtect.app a été introduite dans macOS Monterey et est responsable de l'exécution de XProtect Remediator.
Contrairement au XProtect traditionnel (qui utilisait principalement la détection par signatures), XProtect Remediator analyse et supprime activement les logiciels malveillants des systèmes infectés.
Il s'exécute en tant que processus d'arrière-plan et peut automatiquement supprimer les menaces détectées sans intervention de l'utilisateur.
Le répertoire /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/Resources contient des scripts de remédiation et une logique de détection supplémentaire pour l'analyse active.
Le fichier /Library/Apple/System/Library/CoreServices/XProtect.app/Contents/Resources/com.apple.XProtect.agent.scan.plist contient des paramètres sur le moment où exécuter des analyses périodiques.
Par exemple :
<key>com.apple.XProtect.PluginService.agent.slow.scan</key>
<dict>
<key>Repeating</key>
<true/>
<key>PowerNap</key>
<true/>
<key>CPUIntensive</key>
<true/>
<key>DiskIntensive</key>
<true/>
<key>AllowBattery</key>
<false/>
<key>Priority</key>
<string>Utility</string>
<key>Interval</key>
<integer>604800</integer>
</dict>
Cela montre certaines conditions de performance et même la période d'analyse (604800 secondes = une fois tous les 7 jours).
Certains d'entre vous ont peut-être entendu parler de MRT (Malware Removal Tool).
Stocké dans /Library/Apple/System/Library/CoreServices/MRT.app, MRT est un autre composant de sécurité de macOS qui fonctionne aux côtés de XProtect.
Il est responsable de la suppression des logiciels malveillants détectés par XProtect et fonctionne silencieusement en arrière-plan.
MRT est plus agressif que XProtect pour éradiquer les menaces détectées et peut supprimer des fichiers malveillants même s'ils sont en cours d'exécution.
Notez que contrairement à XProtect, MRT ne conserve pas de fichiers de configuration - tout est intégré dans le binaire.
Même l'examen des chaînes de caractères du binaire principal (/Library/Apple/System/Library/CoreServices/MRT.app/Contents/MacOS/MRT) révèle des chaînes intéressantes, par exemple :
import sys,base64;exec(base64.b64decode('
import sys,base64,warnings;warnings.filterwarnings('ignore');exec(base64.b64decode('
import sys;import re, subprocess;cmd = "ps -ef | grep Little\ Snitch | grep -v grep"
Lorsqu'un fichier est téléchargé via un navigateur ou une application (par exemple Safari, Mail, Messages), il est marqué avec un attribut de quarantaine (com.apple.quarantine) - j'ai déjà mentionné cet attribut dans mon précédent article de blog sur Gatekeeper.
Gatekeeper vérifie si le fichier est signé et notarisé. Si ce n'est pas le cas, l'utilisateur reçoit un avertissement avant l'exécution.
Si l'exécution est autorisée, XProtect analyse le fichier par rapport à ses signatures de logiciels malveillants connues (issues de XProtect.plist, XProtect.yara, etc.).
Si un logiciel malveillant est détecté, le système empêche son exécution. Si le logiciel malveillant est connu et peut être traité, XProtect Remediator ou MRT peut le supprimer ou le neutraliser.
Apple met à jour XProtect, MRT et XProtect Remediator silencieusement en arrière-plan via le processus XProtectService.
Plus tôt cette année, CheckPoint a publié un article de blog sur un échantillon de logiciel malveillant surnommé Banshee.
Cela a suscité beaucoup d'attention car il utilisait le même algorithme de chiffrement que les binaires XProtect Remediator utilisent pour "masquer leurs règles YARA".
L'algorithme lui-même est simple :
def macos_xprotect_string_decryption(encrypted: bytes, encr_key: int) -> str:
"""
Author: @Check Point Research
Decrypts MacOS Xprotect binaries & Banshee Stealer encrypted strings.
"""
decrypted = "".join(
chr(
(encr_key >> ((i * 8) & 0x38) & 0xFF) ^ encrypted[i]
)
for i in range(len(encrypted))
)
return decrypted.partition("\\x00")[0]
De toute évidence, les auteurs de logiciels malveillants pensaient que cet algorithme ne pouvait pas être détecté par des signatures statiques (car il est garanti de générer des faux positifs).
J'ai trouvé un code similaire dans la plupart des binaires de remédiation, par exemple :
10000592a if (data_1000ffe7e != 0)
10000592c void* rax_1 = &data_1000fb0a0
100005933 int64_t i = 0
100005951 do
100005940 *rax_1 = *rax_1 ^ (0x363a34363a303900 u>> (i.b & 0x38)).b
100005943 i = i + 8
100005947 rax_1 = rax_1 + 1
100005951 while (i != 0x26ef0)
100005953 data_1000ffe7e = 0
Le chercheur en sécurité qui l'a initialement découvert (ald3ns) a publié un outil appelé XPR-dump qui semble encore fonctionner avec la version la plus récente de XProtect. Vous devriez absolument y jeter un œil !
Le principal enseignement de cet article est que XProtect joue au chat et à la souris avec les attaquants (comme n'importe quel antivirus) - la mise sur liste noire, l'exécution de YARA ou les simples signatures statiques font toutes partie du jeu.
Le fait que ces fichiers soient déployés sur tous les terminaux et soient faciles à analyser permet aux auteurs de logiciels malveillants de trouver facilement des contournements pour bon nombre de ces contrôles.
Restez à l'écoute !
Jonathan Bar Or (https://jonathanbaror.com)