Stealers sur MacOS, Observés : Ce Que Les Défenseurs Doivent Surveiller
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
L’article présente un voleur de crédentiels macOS associé à l’écosystème AMOS, livré via de fausses pages de mise à jour logicielle. Les victimes sont incitées à exécuter une chaîne de commandes qui extrait un binaire d’assistance depuis rvdownloads.com, l’exécute via zsh, et déclenche un AppleScript obfusqué pour recueillir des mots de passe, des artefacts de navigateur, des extensions de portefeuille crypto, des Notes Apple et des fichiers locaux. La persistance est établie à l’aide d’un fichier plist LaunchAgent malveillant qui se fait passer pour un composant légitime de Spotlight. L’article partage également les IOC observés et les étapes d’analyse utilisées pour valider le flux d’infection.
Investigation
Le chercheur a capturé la commande initiale curl en ligne qui a récupéré une URL encodée en Base64, l’a décodée, et a observé un téléchargement de binaire d’assistance par curl. Le binaire d’assistance a exécuté deux AppleScripts : l’un pour la détection de VM et un autre qui a géré la collecte et l’exfiltration. Le voleur a extrait les crédentiels de la Keychain, a tenté de terminer les outils de sécurité, a collecté les données de navigateur et de portefeuille, a copié les Notes Apple, a regroupé les résultats dans une archive, et les a téléchargés sur laislivon.com. La persistance a été créée en installant un LaunchAgent qui relance la chaîne de scripts complète à la connexion de l’utilisateur.
Atténuation
Réduisez l’exposition en bloquant les domaines malveillants identifiés, en restreignant l’exécution de scripts non signés, et en surveillant les activités inhabituelles de lancement de launchctl lié aux nouveaux LaunchAgents. Utilisez des contrôles des points de terminaison qui signalent les combinaisons suspectes de curl et osascript, surtout lorsqu’ils extraient du contenu distant depuis des hôtes inconnus. Limitez l’exécution privilégiée autant que possible et appliquez une liste de permissions d’applications pour empêcher les binaires d’assistance non approuvés de se lancer.
Réponse
Si des indicateurs sont trouvés, isolez le point de terminaison, terminez les processus malveillants actifs, supprimez le binaire d’assistance et supprimez le fichier plist de LaunchAgent frauduleux. Réinitialisez les crédentiels et les jetons potentiellement exposés, en priorisant les secrets Keychain et les données stockées dans le navigateur. Collectez les artefacts médico-légaux pour les IOC listés, examinez les journaux système pour l’exécution de curl/osascript, et surveillez les rappels répétés ou les tentatives de téléchargement liées à la même infrastructure C2.
"graph TB %% Définitions de Classe classDef action fill:#99ccff classDef tool fill:#cccccc classDef technique fill:#ffedcc classDef process fill:#e2e2ff %% Noeuds – Actions action_initial_access["<b>Action</b> – <b>T1219 Outils d’Accès à Distance</b><br/>Exécutez une commande curl qui décode une URL base64 et exécute un shell zsh pour télécharger une charge utile secondaire à partir de rvdownloads.com/frozenfix/update."] class action_initial_access action action_obfuscation["<b>Action</b> – <b>T1027 Obfuscation</b><br/>Le script d’assistance masque les chaînes en utilisant le Base64, l’arithmétique personnalisée, le remplissage binaire et l’insertion de code inutile."] class action_obfuscation action action_sandbox_evasion["<b>Action</b> – <b>T1497.002 Évasion de Sandbox de Virtualisation</b><br/>AppleScript vérifie la sortie system_profiler pour les indicateurs de VM tels que QEMU, VMware et KVM."] class action_sandbox_evasion action action_credential_harvest["<b>Action</b> – <b>T1056.002 Capture d’Entrée GUI</b><br/>Dialogue osascript fabriqué demandant le mot de passe admin, le valide contre la Keychain et le stocke dans ~/.pwd."] class action_credential_harvest action action_defense_evasion["<b>Action</b> – <b>T1027.005 Suppression d’Indicateurs des Outils</b><br/>Le malware termine Little Snitch et BlockBlock et décharge leurs agents de lancement."] class action_defense_evasion action action_browser_theft["<b>Action</b> – <b>T1217 Découverte d’Informations du Navigateur</b><br/>Énumère les profils Chrome, Brave, Edge, Opera et Firefox et extrait les données de connexion, les cookies, le remplissage automatique et les données d’extension, ciblant les extensions de portefeuilles crypto‑wallet."] class action_browser_theft action action_notes_theft["<b>Action</b> – Vol de Données Apple Notes<br/>Copie la base de données SQLite des Notes et les fichiers multimédias associés dans un dossier de mise en scène."] class action_notes_theft action action_data_staging["<b>Action</b> – <b>T1132 Encodage de Données</b><br/>Copie les fichiers collectés dans /tmp/stolen_data et les compresse dans archive.tar.gz."] class action_data_staging action action_c2["<b>Action</b> – <b>T1102 Service Web</b><br/>Télécharge l’archive compressée via un curl POST vers https://laislivon.com/upload."] class action_c2 action action_persistence["<b>Action</b> – <b>T1543.001 Persistance d’Agent de Lancement</b><br/>Écrit un fichier plist LaunchAgent (com.apple.mdworker.plist) dans ~/Library/LaunchAgents et le charge avec launchctl."] class action_persistence action action_execution["<b>Action</b> – <b>T1127.003 Exécution Par Proxy d’Utilitaires de Développeur de Confiance</b><br/>Exécute l’AppleScript malveillant à chaque connexion en utilisant osascript, exploitant des utilitaires de développeur de confiance."] class action_execution action %% Noeuds – Outils tool_curl["<b>Outil</b> – <b>Nom</b>: curl<br/><b>Description</b>: Transfère les données depuis des serveurs distants en utilisant la syntaxe URL."] class tool_curl tool tool_osascript["<b>Outil</b> – <b>Nom</b>: osascript<br/><b>Description</b>: Exécute AppleScript ou les scripts JavaScript pour l’Automatisation sur macOS."] class tool_osascript tool tool_launchctl["<b>Outil</b> – <b>Nom</b>: launchctl<br/><b>Description</b>: Gère les agents de lancement et les démons sur macOS."] class tool_launchctl tool %% Noeuds – Techniques (détail supplémentaire) tech_T1027_008["<b>Technique</b> – T1027.008 Charges Utiles Dépouillées<br/>Les charges utiles sont dépouillées de symboles et d’informations de débogage pour gêner l’analyse."] class tech_T1027_008 technique tech_T1027_001["<b>Technique</b> – T1027.001 Remplissage Binaire<br/>Ajoute des octets nonu2011fonctionnels aux binaires pour changer la taille et le hash."] class tech_T1027_001 technique tech_T1027_007["<b>Technique</b> – T1027.007 Résolution Dynamique de l’API<br/>Résout les appels API au moment de l’exécution pour éviter la détection statique."] class tech_T1027_007 technique tech_T1027_016["<b>Technique</b> – T1027.016 Insertion de Code Inutile<br/>Insère des instructions non pertinentes pour confondre les outils d’analyse."] class tech_T1027_016 technique tech_T1140["<b>Technique</b> – T1140 Déobfuscation/Décodage de Fichiers ou d’Informations<br/>Décode ou désobfusque les données avant l’exécution."] class tech_T1140 technique tech_T1555_001["<b>Technique</b> – T1555.001 Crédentiels depuis les Magasins de Mots de Passe : Keychain<br/>Extrait les crédentiels stockés depuis la Keychain de macOS."] class tech_T1555_001 technique tech_T1555_002["<b>Technique</b> – T1555.002 Crédentiels depuis les Magasins de Mots de Passe : Mémoire Securityd<br/>Lit les crédentiels depuis la mémoire du démon de sécurité."] class tech_T1555_002 technique tech_T1555_003["<b>Technique</b> – T1555.003 Crédentiels depuis les Navigateurs Web<br/>Vole les mots de passe enregistrés depuis les navigateurs."] class tech_T1555_003 technique tech_T1606_001["<b>Technique</b> – T1606.001 Forger des Crédentiels Web : Cookies Web<br/>Collecte des cookies de navigateur pour un détournement de session."] class tech_T1606_001 technique tech_T1132_001["<b>Technique</b> – T1132.001 Encodage Standard<br/>Utilise un encodage standard (par exemple, gzip) pour la compression des données."] class tech_T1132_001 technique tech_T1546_009["<b>Technique</b> – T1546.009 Exécution Déclenchée par un Évènement : DLLs AppCert<br/>Déclenche l’exécution via des évènements système de confiance."] class tech_T1546_009 technique %% Connexions de Flux action_initial_access –>|utilise| tool_curl tool_curl –>|télécharge| action_obfuscation action_obfuscation –>|emploie| tech_T1027_008 action_obfuscation –>|emploie| tech_T1027_001 action_obfuscation –>|emploie| tech_T1027_007 action_obfuscation –>|emploie| tech_T1027_016 action_obfuscation –>|emploie| tech_T1140 action_obfuscation –>|mène à| action_sandbox_evasion action_sandbox_evasion –>|vérifie| tech_T1497_002 action_sandbox_evasion –>|mène à| action_credential_harvest action_credential_harvest –>|utilise| tool_osascript action_credential_harvest –>|capture| tech_T1056_002 action_credential_harvest –>|extrait| tech_T1555_001 action_credential_harvest –>|extrait| tech_T1555_002 action_credential_harvest –>|mène à| action_defense_evasion action_defense_evasion –>|supprime| tech_T1027_005 action_defense_evasion –>|mène à| action_browser_theft action_browser_theft –>|découvre| tech_T1217 action_browser_theft –>|vole| tech_T1555_003 action_browser_theft –>|collecte| tech_T1606_001 action_browser_theft –>|mène à| action_notes_theft action_notes_theft –>|stocke dans| action_data_staging action_data_staging –>|compresse avec| tech_T1132 action_data_staging –>|utilise encodage| tech_T1132_001 action_data_staging –>|mène à| action_c2 action_c2 –>|télécharge via| tool_curl action_c2 –>|utilise| tech_T1102 action_c2 –>|mène à| action_persistence action_persistence –>|crée| tech_T1543_001 action_persistence –>|charge avec| tool_launchctl action_persistence –>|mène à| action_execution action_execution –>|exécute avec| tool_osascript action_execution –>|exploite| tech_T1127_003 action_execution –>|déclenché par| tech_T1546_009 "
Flux d’Attaque
Détections
Tentative Possible d’Énumération via System_profiler (via création de processus)
Voir
Collecte Possible par Entrée de Crédentiels Locaux macOS (via ligne de commande)
Voir
Archive Créée dans Dossier Temporaire macOS (via événement de fichier)
Voir
Tentative Possible de Découverte de Mots de Passe de Navigateur macOS (via ligne de commande)
Voir
Tentative Suspendue d’Exécution de Curl [MacOS] (via ligne de commande)
Voir
Manipulation Possible de Chaînes Encodées en Base64 [MacOS] (via ligne de commande)
Voir
Détection de l’Exécution de Commande Malveillante curl et Base64 [Création de Processus Linux]
Voir
Détection de Persistance de Voleur macOS et Exfiltration de Données [Événement de Fichier Linux]
Voir
Exécution de Simulation
Prérequis : Le contrôle préalable Télémetry & Baseline doit avoir été passé.
Raison : Cette section détaille l’exécution précise de la technique de l’adversaire (TTP) conçue pour déclencher la règle de détection. Les commandes et le récit DOIVENT directement refléter les TTP identifiés et viser à générer la télémétrie exacte attendue par la logique de détection.
-
Récit et Commandes de l’Attaque :
Un attaquant ayant acquis un accès de niveau utilisateur sur la machine victime souhaite établir une persistance et exfiltrer les crédentiels collectés.
- Persistance : L’attaquant écrit un fichier plist de LaunchAgent malveillant dans le répertoire standard des LaunchAgents de macOS (simulé sur le collecteur Linux via un chemin du répertoire personnel).
- Collecte de Données : Les fichiers sensibles sont copiés dans un dossier de mise en scène.
- Préparation à l’Exfiltration : Les données mises en scène sont archivées dans
/tmp/archive.tar.gzà l’aide de l’utilitaire natiftarutility. - Activation : L’attaquant charge le LaunchAgent avec
launchctl, provoquant l’exécution du code malveillant à chaque connexion utilisateur.
Les lignes de commande exactes correspondent aux chaînes surveillées par la règle, assurant la génération d’une alerte.
-
Script de Test de Régression :
#!/usr/bin/env bash set -euo pipefail # 1. Créez un fichier "volé" factice echo "password123" > /tmp/credentials.txt # 2. Créer un fichier plist de LaunchAgent malveillant (emplacement simulé) PLIST_PATH="$HOME/Library/LaunchAgents/com.apple.mdworker.plist" mkdir -p "$(dirname "$PLIST_PATH")" cat > "$PLIST_PATH" <<EOF <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key><string>com.apple.mdworker</string> <key>ProgramArguments</key> <array> <string>/usr/bin/cat</string> <string>/tmp/credentials.txt</string> </array> <key>RunAtLoad</key><true/> </dict> </plist> EOF # 3. Archivez les données "volées" (chemin exact que la règle surveille) tar -czf /tmp/archive.tar.gz -C /tmp credentials.txt # 4. Chargez le LaunchAgent (cela génère la ligne de commande que la règle surveille) launchctl load "$PLIST_PATH" echo "Simulation complète – la détection devrait avoir été déclenchée." -
Commandes de Nettoyage :
#!/usr/bin/env bash set -euo pipefail # Déchargez le LaunchAgent launchctl unload "$HOME/Library/LaunchAgents/com.apple.mdworker.plist" || true # Supprimez les fichiers rm -f "$HOME/Library/LaunchAgents/com.apple.mdworker.plist" rm -f /tmp/archive.tar.gz rm -f /tmp/credentials.txt echo "Nettoyage terminé."