Selon Jamf Threat Labs (blog Jamf), une nouvelle itération de l’infostealer macOS MacSync Stealer abandonne les chaînes d’exécution « drag‑to‑terminal/ClickFix » au profit d’un dropper Swift code‑signé et notarisé, distribué dans une image disque, qui récupère et exécute un script de second étage de façon plus discrète.
Le binaire Mach‑O universel est signé et notarisé (Developer Team ID GNJLS3UYZ4) et a été livré dans un DMG nommé zk-call-messenger-installer-3.9.2-lts.dmg, accessible via https://zkcall.net/download. Le DMG est volumineux (25,5 Mo) en raison de fichiers leurres (PDF liés à LibreOffice) intégrés. Au moment de l’analyse initiale, les hachages n’étaient pas révoqués, puis Jamf a signalé l’abus à Apple et le certificat a été révoqué. Sur VirusTotal, les échantillons allaient de 1 à 13 détections, classés surtout comme téléchargeurs génériques (familles « coins » ou « ooiid »).
La détection a été déclenchée par une règle YARA surveillant l’exécution de scripts Bash obfusqués, révélant un script /tmp/runner lancé depuis une application signée directement depuis un DMG monté. Contrairement aux anciennes variantes (glisser‑déposer/paste‑in‑terminal avec base64 -D, gunzip, eval puis curl), ce dropper récupère un script encodé depuis un serveur distant et l’exécute via un exécutable helper écrit en Swift.
Sur le plan technique, la fonction _main crée journaux et répertoires (~/Library/Logs/UserSyncWorker.log, ~/Library/Application Support/UserSyncWorker/), définit un intervalle minimal (~3600 s) et vérifie la connectivité avant d’appeler runInstaller(). La fonction runInstaller() applique un throttling via les fichiers last_up/last_update, supprime les artefacts /tmp existants, puis télécharge la charge utile vers /tmp/runner et /tmp/runner.headers via /bin/zsh -lc et curl vers https://gatemaden.space/curl/985683bd660c0c47c6be513a2d1f0a554d52d241714bb17fb18ab0d0f8cc2dc6 avec l’UA “UserSyncWorker/1.0 (macOS)” et des options -fL -sS –noproxy. Le dropper enlève l’attribut com.apple.quarantine, applique des permissions 750, valide le type avec /usr/bin/file et effectue un contrôle Gatekeeper via spctl -a -v, exécute le script, puis supprime /tmp/runner et met à jour l’horodatage. Le contenu décodé correspond aux charges MacSync précédentes (domaine focusgroovy[.]com, fonction daemon_function identique), et un dialogue osascript typique apparaît ensuite. Jamf note également que l’infostealer Odyssey adopte des méthodes de distribution similaires.
IoCs 🧭:
- Fichier DMG: zk-call-messenger-installer-3.9.2-lts.dmg
- URL de distribution: https://zkcall.net/download
- Developer Team ID: GNJLS3UYZ4 (ultérieurement révoqué)
- Domaines/URL: focusgroovy[.]com ; https://gatemaden.space/curl/985683bd660c0c47c6be513a2d1f0a554d52d241714bb17fb18ab0d0f8cc2dc6
- Chemins/fichiers: /tmp/runner ; /tmp/runner.headers ; ~/Library/Logs/UserSyncWorker.log ; ~/Library/Application Support/UserSyncWorker/{last_up,gate,last_update}
- Binaire/helper: runtimectl (Swift, universel)
- User-Agent: UserSyncWorker/1.0 (macOS)
TTPs 🧰:
- Distribution via application Swift code‑signée et notarisée dans un DMG avec fichiers leurres
- Téléchargement conditionnel (vérification Internet), throttling temporel, exécution en mémoire limitée et nettoyage d’artefacts
- Récupération par curl avec -fL -sS et –noproxy ; UA personnalisé ; écriture dans /tmp
- Suppression de com.apple.quarantine ; validation du type de fichier ; contrôle Gatekeeper via spctl
- Évitement de sandbox/offline et légères variations pour la fiabilité/évasion; recourt à osascript
Article: analyse de menace détaillant l’évolution du dropper MacSync Stealer, ses mécanismes et IoCs/TTPs. 🔎
🧠 TTPs et IOCs détectés
TTP
[‘Distribution via application Swift code-signée et notarisée dans un DMG avec fichiers leurres’, ‘Téléchargement conditionnel (vérification Internet), throttling temporel, exécution en mémoire limitée et nettoyage d’artefacts’, ‘Récupération par curl avec -fL -sS et –noproxy ; UA personnalisé ; écriture dans /tmp’, ‘Suppression de com.apple.quarantine ; validation du type de fichier ; contrôle Gatekeeper via spctl’, ‘Évitement de sandbox/offline et légères variations pour la fiabilité/évasion; recourt à osascript’]
IOC
{‘fichier_dmg’: ‘zk-call-messenger-installer-3.9.2-lts.dmg’, ‘url_distribution’: ‘https://zkcall.net/download', ‘developer_team_id’: ‘GNJLS3UYZ4’, ‘domaines_url’: [‘focusgroovy[.]com’, ‘https://gatemaden.space/curl/985683bd660c0c47c6be513a2d1f0a554d52d241714bb17fb18ab0d0f8cc2dc6’], ‘chemins_fichiers’: [’/tmp/runner’, ‘/tmp/runner.headers’, ‘/Library/Logs/UserSyncWorker.log’, ‘/Library/Application Support/UserSyncWorker/{last_up,gate,last_update}’], ‘user_agent’: ‘UserSyncWorker/1.0 (macOS)’}
🔗 Source originale : https://www.jamf.com/blog/macsync-stealer-evolution-code-signed-swift-malware-analysis/