# Fake Maccy Stealer Infostealer macOS · Rust ARM64 · Observé pour la première fois le 26 juin 2026 ## Présentation Fake Maccy Stealer est une campagne de vol d'identifiants sur macOS qui usurpe le gestionnaire de presse-papiers légitime Maccy afin de distribuer un infostealer développé en Rust au moyen d'un flux d'exécution trompeur dans l'Éditeur de scripts. Au lieu d'exploiter une vulnérabilité, la campagne s'appuie sur la confiance de l'utilisateur, la persistance via les éléments d'ouverture et la furtivité après exécution pour collecter des identifiants, des données de navigateur et le contenu du presse-papiers, tout en maintenant un canal de commande chiffré actif. La campagne a été identifiée et analysée par l'équipe **Threat Intelligence EDR de ManageEngine** lors de l'étude d'une opération de vol d'identifiants sur macOS exploitant des workflows d'applications fiables et des chemins d'exécution trompeurs. L'attaquant a enregistré `maccyapp[.]com` comme domaine similaire au projet Maccy légitime, distribué depuis `maccy.app` et via les versions GitHub du développeur Alexey Rodionov. Le faux domaine fournit une image disque `maccy.dmg`, un format qui n'a jamais figuré dans l'historique des versions légitimes de Maccy, exclusivement distribuées sous forme de `Maccy.app.zip`. La victime y est dirigée par des résultats de recherche optimisés pour le SEO, affichés à côté de la fiche du projet authentique. Ce qui distingue cette campagne de la plupart des activités récentes d'infostealers sur macOS est la surface d'exécution. Au lieu du flux de copier-coller dans Terminal utilisé par les campagnes ClickFix visant macOS, Fake Maccy Stealer fournit un script JavaScript for Automation (JXA) qui s'ouvre dans l'Éditeur de scripts de macOS lorsque le DMG est monté. L'utilisateur est invité à cliquer sur Exécuter. L'Éditeur de scripts est une application Apple propriétaire bénéficiant de la confiance totale du système ; les protections contre le collage dans Terminal ajoutées à macOS Tahoe 26.4 ne s'y appliquent pas. La charge utile malveillante est masquée sous la fenêtre visible par un remplissage d'espaces, derrière un code décoratif qui cite l'URL légitime de l'App Store comme faux signal de confiance. Une fois exécuté, le dropper place un binaire Mach-O natif ARM64, compilé en Rust, dans un faux paquet d'application nommé `Finder.app`. Il utilise l'icône authentique d'Apple Finder copiée depuis `/System/Library/CoreServices/` ainsi que l'identifiant de paquet `com.apple.finder.monitor`. Le binaire s'exécute comme un second processus Finder dans le Moniteur d'activité, visuellement impossible à distinguer du véritable processus. La persistance est établie au moyen des éléments d'ouverture et des API `LSSharedFileList` et `SMAppService`, en évitant délibérément LaunchAgents et LaunchDaemons, sur lesquels la couverture de détection est la plus dense. Le logiciel malveillant collecte les identifiants du Trousseau macOS, les mots de passe et cookies enregistrés dans les navigateurs ainsi que le contenu du presse-papiers, chiffre les données recueillies avec ChaCha20-Poly1305 (RFC 8439), puis les exfiltre vers `https://avengerflow[.]com/api/sync`. Le canal C2 est bidirectionnel : le serveur renvoie des réponses chiffrées, ce qui fait de l'implant une porte dérobée de vol d'identifiants plutôt qu'un infostealer à exécution unique. Lors de sa première soumission à VirusTotal, l'échantillon n'était détecté que par un moteur sur 70. La campagne s'inscrit dans un schéma documenté d'opérateurs MaaS russophones ciblant les professionnels macOS au moyen de leurres liés aux outils de développement. Le dropper JXA met en œuvre quatre contrôles indépendants de géorestriction visant la CEI, fondés sur le fuseau horaire, le code pays, la langue de saisie du clavier et l'architecture du processeur ; il s'arrête silencieusement sur les machines associées à la Russie ou à onze autres pays alignés sur la CEI. ### Profil de la menace Mis à jour le 30 juin 2026 | Détail | Valeur | |---|---| | Type | Infostealer / porte dérobée (macOS) | | Première observation | 26 juin 2026 | | Risque en aval | Compromission complète des identifiants · C2 actif | | Plateforme | macOS — ARM64 (natif Apple Silicon) | | Langage | Rust (confirmé par les chaînes de la bibliothèque standard, les symboles TLS et la constante sigma de ChaCha20) | | Leurre | Faux gestionnaire de presse-papiers Maccy (`maccyapp[.]com`) | | Distribution | Domaine similaire + DMG → dropper JXA via l'Éditeur de scripts | | Persistance | Éléments d'ouverture (`LSSharedFileList` + `SMAppService`) | | Usurpation | `com.apple.finder.monitor` / `Finder.app` | | Chiffrement | ChaCha20-Poly1305 (IETF RFC 8439) | | C2 | `avengerflow[.]com/api/sync` (derrière Cloudflare) | | Signature de code | Ad hoc — aucun Apple Developer ID — TeamIdentifier=non défini | | VirusTotal | 1 / 70 lors de la première soumission | | Attribution de l'opérateur | Géorestriction CEI cohérente avec des opérateurs MaaS russophones | ## Chaîne d'attaque opérationnelle ### Domaine similaire **Départ** `maccyapp[.]com` via un résultat de recherche optimisé pour le SEO. ### Téléchargement du faux DMG Maccy **Étape 1** Format `maccy.dmg` non utilisé par le projet légitime. ### Le script JXA s'ouvre dans l'Éditeur de scripts **Étape 2 — Utilisateur** L'utilisateur clique sur Exécuter (« ⌘ + R ») — aucun Terminal ni copier-coller. ### Géorestriction CEI → URL C2 déchiffrée avec RC4 **Étape 3** Quatre contrôles anti-ciblage ; clé dérivée de l'empreinte du système. ### Téléchargement et installation du binaire Rust **Étape 4** - Icône Finder clonée - Signature de code ad hoc ### Enregistrement de la persistance via un élément d'ouverture **Étape 5** `LSSharedFileList` + `SMAppService` — apparaît comme « Finder » dans Réglages Système. ### Vol d'identifiants et capture du presse-papiers **Étape 6** Trousseau · SQLite des navigateurs · `NSPasteboard` · interception PAM. ### Exfiltration ChaCha20-Poly1305 → C2 actif **Impact** POST HTTPS vers `avengerflow[.]com` · bidirectionnel — l'hôte est traité comme un implant actif. Le leurre de l'Éditeur de scripts est ce qui distingue cette campagne des flux ClickFix reposant sur Terminal. Le geste d'approbation est le même — cliquer sur Exécuter dans une application Apple de confiance — mais il contourne entièrement les protections contre le collage dans Terminal ajoutées à macOS Tahoe 26.4. ## Tactiques, techniques et procédures [Fake Maccy Stealer](https://meblog.manageengine.com/uems/endpoint-central/fake-maccy-stealer.html) superpose sept couches distinctes de contournement au cours des phases d'accès initial, d'exécution, de persistance, de contournement des défenses, d'accès aux identifiants et d'exfiltration. La densité de techniques est la plus élevée dans le contournement des défenses, où le logiciel malveillant associe usurpation, obscurcissement, géorestriction pour contourner les sandbox, indicateurs de fenêtre masquée et détournement des contrôles de confiance au sein d'une même chaîne de distribution. ### Couverture MITRE ATT&CK | Tactique | Nombre de techniques | |---|---| | Accès initial | 1 | | Exécution | 2 | | Persistance | 1 | | Élévation de privilèges | 0 | | Contournement des défenses | 6 | | Accès aux identifiants | 2 | | Découverte | 1 | | Collecte | 2 | | Commande et contrôle | 2 | | Exfiltration | 1 | | Mouvement latéral | 0 | | Reconnaissance | 0 | ### Détail des techniques | Tactique | Techniques | Action de Fake Maccy Stealer | |---|---|---| | Accès initial | [Compromission par navigation T1189](https://attack.mitre.org/techniques/T1189/) | Un domaine similaire optimisé pour le SEO (`maccyapp[.]com`) fournit un DMG malveillant aux utilisateurs qui recherchent le gestionnaire de presse-papiers Maccy légitime. | | Exécution | [Exécution par l'utilisateur : fichier malveillant T1204.002](https://attack.mitre.org/techniques/T1204/002/)
[Commandes et scripts : JavaScript T1059.007](https://attack.mitre.org/techniques/T1059/007/) | La victime clique sur Exécuter dans l'Éditeur de scripts de macOS afin d'exécuter le dropper JXA obscurci. Aucun exploit ni CVE. L'utilisateur approuve l'exécution par l'intermédiaire d'une application Apple propriétaire de confiance. | | Persistance | [Éléments d'ouverture T1547.015](https://attack.mitre.org/techniques/T1547/015/) | Le dropper JXA enregistre le faux `Finder.app` comme élément d'ouverture au moyen de l'ancienne API `LSSharedFileList` et de la nouvelle `SMAppService` (`ServiceManagement.framework`), afin que le logiciel malveillant survive au redémarrage. L'entrée apparaît sous le nom « Finder », avec l'icône authentique d'Apple Finder, dans Réglages Système → Général → Ouverture. | | Contournement des défenses | [Usurpation : nom légitime T1036.005](https://attack.mitre.org/techniques/T1036/005/)
[Masquage d'artefacts : fichiers masqués T1564.001](https://attack.mitre.org/techniques/T1564/001/)
[Masquage d'artefacts : fenêtre masquée T1564.003](https://attack.mitre.org/techniques/T1564/003/)
[Fichiers obscurcis : obscurcissement de commandes T1027.010](https://attack.mitre.org/techniques/T1027/010/)
[Fichiers ou informations obscurcis T1027](https://attack.mitre.org/techniques/T1027/)
[Détournement des contrôles de confiance T1553](https://attack.mitre.org/techniques/T1553/) | L'identifiant de paquet `com.apple.finder.monitor` imite la convention DNS inversée d'Apple. Le binaire est nommé `F8C06C86` (huit caractères hexadécimaux, vraisemblablement propres à chaque hôte afin d'empêcher le partage des IOC de hachage). L'icône authentique de Finder est copiée depuis `/System/Library/CoreServices/`. `LSUIElement=true` et `LSBackgroundOnly=true` suppriment toute icône du Dock et toute interface. Les fichiers de configuration et les marqueurs utilisent des noms de fichiers cachés (`.config`, `.lock`, `.Maccy`). Le script JXA applique l'inversion de chaînes, des calculs XOR sur les codes de caractères et des constructeurs `Function()` encodés en URI pour masquer sa logique. Le binaire Rust utilise ChaCha20-Poly1305 pour toutes les données exfiltrées. La surface de confiance de l'Éditeur de scripts est détournée pour contourner l'évaluation de quarantaine de Gatekeeper. | | Accès aux identifiants | [Trousseau T1555.001](https://attack.mitre.org/techniques/T1555/001/)
[Identifiants provenant des navigateurs T1555.003](https://attack.mitre.org/techniques/T1555/003/) | Les entrées du Trousseau sont extraites via `SecItemCopyMatching` ciblant `kSecClassGenericPassword`. Les bases d'identifiants des navigateurs (Chrome `Login Data`, Firefox `logins.json`, éléments du Trousseau Safari) sont consultées directement via `libsqlite3.dylib`. Le logiciel malveillant est également lié à `libpam.2.dylib`, la bibliothèque Pluggable Authentication Module, qui peut intercepter les mots de passe sudo et les réponses aux boîtes de dialogue d'authentification du système. | | Découverte | [Découverte des informations système T1082](https://attack.mitre.org/techniques/T1082/) | Le dropper JXA collecte le fuseau horaire, le code pays, la langue de saisie du clavier et l'architecture du processeur avant de s'exécuter. Le binaire Rust collecte operatingSystemVersion et l'identifiant matériel via `IOKit.framework` afin d'établir l'empreinte de l'hôte et d'étiqueter la télémétrie de campagne. | | Collecte | [Données du presse-papiers T1115](https://attack.mitre.org/techniques/T1115/)
[Données du système local T1005](https://attack.mitre.org/techniques/T1005/) | Le contenu du presse-papiers est capturé via `NSPasteboard.generalPasteboard`. Les bases d'identifiants des navigateurs, les entrées du Trousseau et les artefacts d'authentification système sont lus dans le stockage local. Le logiciel malveillant cible un appareil que l'utilisateur a expressément configuré pour gérer des données sensibles du presse-papiers ; le choix du leurre est donc délibérément aligné sur l'objectif de collecte. | | Commande et contrôle | [Protocoles Web T1071.001](https://attack.mitre.org/techniques/T1071/001/)
[Canal chiffré : symétrique T1573.001](https://attack.mitre.org/techniques/T1573/001/) | POST HTTPS vers `avengerflow[.]com/api/sync` via `NSURLSession`. Le canal est bidirectionnel. Tout le trafic est chiffré avec ChaCha20-Poly1305 (RFC 8439). Le domaine C2 est placé derrière Cloudflare (`172.67.210.219`, `104.21.93.138`), avec une origine backend présumée sur AWS EC2 en Espagne (`51.92.110.33`). Les balises portent le préfixe de campagne codé en dur `MacOSapp1`. | | Exfiltration | [Exfiltration sur le canal C2 T1041](https://attack.mitre.org/techniques/T1041/) | Toutes les données collectées sont chiffrées avec ChaCha20-Poly1305 et envoyées sur le canal HTTPS C2 existant. Le format de balise C2 confirmé est `MacOSapp1{"data":""}`. Un horodatage de balise confirmé, `2026-06-26 07:38:02 UTC`, a été récupéré dans la propre base de données cache SQLite du logiciel malveillant. | | Reconnaissance / Élévation de privilèges / Mouvement latéral / Impact | — | Non observé dans cette campagne. Le logiciel malveillant fonctionne entièrement dans le contexte de la session utilisateur et ne tente aucune élévation de privilèges ni aucun mouvement latéral. | ### Le leurre du domaine similaire **Étape 1** · T1189 · T1204.002 Maccy est un gestionnaire de presse-papiers open source très utilisé, distribué depuis `maccy.app` et GitHub, développé et signé par Alexey Rodionov (Team Identifier `MN3X4648SC`). L'attaquant a enregistré `maccyapp[.]com` comme domaine quasi identique et l'a optimisé afin qu'il apparaisse dans les résultats de recherche à côté de la fiche du projet légitime. Le domaine malveillant prétend distribuer Maccy version 2.7.3, un numéro de version auquel ne correspond aucune balise GitHub dans le référentiel authentique. La charge utile est fournie sous la forme `maccy.dmg`. Le projet Maccy officiel n'a jamais distribué de DMG ; toutes les versions légitimes sont publiées sous forme de `Maccy.app.zip` sur GitHub. Cette différence de format constitue le premier signal détectable. Le SHA-256 de l'image disque malveillante (`45bd0e321aa85b63b5dee4e87465e4088546eea5da6efb9c96847023384c48c9`) ne correspond au hachage d'aucune version légitime de Maccy. Les binaires Maccy authentiques sont signés avec un Apple Developer ID, notariés avec ticket incorporé et validés par Gatekeeper sans avertissement. La charge utile malveillante est signée ad hoc, sans Team Identifier, et est explicitement rejetée par `spctl --assess`. Le choix du leurre est délibéré. Les gestionnaires de presse-papiers sont utilisés de manière disproportionnée par les développeurs, les administrateurs IT et les professionnels de la sécurité, qui copient et collent régulièrement des données sensibles : jetons d'API, clés SSH, phrases de récupération, mots de passe temporaires et codes 2FA. Sur un tel hôte, le presse-papiers forme un cache structuré de secrets récemment utilisés. La campagne vise à compromettre l'outil auquel ses cibles confient précisément ces données. ### Le dropper JXA de l'Éditeur de scripts **Étape 2** · T1059.007 · T1027.010 · T1553 Lorsque la victime monte le DMG, un fichier JXA `.scpt` compilé s'ouvre automatiquement dans l'Éditeur de scripts de macOS. La partie visible du script contient un bloc de configuration court et plausible, faisant référence à l'URL officielle de Maccy dans l'Apple App Store, ainsi que des instructions demandant d'appuyer sur `⌘ + R` ou de cliquer sur le bouton Exécuter. L'URL de l'App Store constitue un signal de confiance délibéré, mais ne joue aucun rôle fonctionnel. La véritable charge utile est une routine JXA fortement obscurcie, masquée sous la fenêtre visible de l'éditeur par un remplissage d'espaces. **Pourquoi l'Éditeur de scripts contourne les protections macOS :** il s'agit d'une application Apple propriétaire bénéficiant de la confiance totale du système. Les protections contre le collage dans Terminal de macOS Tahoe 26.4 ciblent la surface d'attaque précise où les victimes sont invitées à coller des commandes dans Terminal. Ces contrôles n'ont aucun effet sur du code exécuté en cliquant sur Exécuter dans l'Éditeur de scripts. macOS affiche bien un avertissement « développeur non identifié » lorsque le script s'exécute, mais il s'agit de la même invite que les utilisateurs ont été conditionnés à ignorer pendant des années, et le leurre est conçu pour les amener à faire exactement cela. L'obscurcissement du script JXA repose sur trois techniques superposées. Inversion des chaînes : les constantes sont stockées à l'envers et assemblées à l'exécution. Arithmétique XOR sur les codes de caractères : chaque caractère est dérivé d'opérations arithmétiques appliquées à des nombres entiers. Constructeurs Function() encodés en URI : l'instruction `Function('return decodeURIComponent(\'%69%6d%70%6f%72%74\')')()` produit `'import'` à l'exécution. Le résultat est un dropper dont le texte source ne contient aucune URL C2 ni aucun chemin de fichier lisible. Le script JXA importe trois frameworks macOS via le pont Objective-C : `Cocoa` (interface utilisateur, NSWorkspace, NSFileManager), `IOKit` (énumération du matériel) et `CoreFoundation` (requêtes de fuseau horaire et de paramètres régionaux). Ces imports servent de base aux quatre contrôles de géorestriction exécutés avant le téléchargement de toute charge utile. ### Géorestriction CEI et déchiffrement de l'URL C2 lié à la machine **Étape 3** · T1082 · T1027 Avant de télécharger ou d'installer quoi que ce soit, le dropper JXA exécute quatre contrôles indépendants afin d'interrompre l'exécution sur les machines associées à la Russie ou à dix autres pays alignés sur la CEI. Ce modèle est cohérent avec le comportement d'opérateurs MaaS russophones cherchant à éviter de créer des victimes susceptibles de déposer une plainte dans leur propre pays, une pratique documentée dans plusieurs familles d'infostealers macOS actives dans le même écosystème. - **Contrôle du fuseau horaire :** `NSTimeZone.localTimeZone.name` comparé à 12 identifiants CEI, notamment `Europe/Moscow`, `Asia/Almaty`, `Europe/Minsk` et des zones apparentées. - **Contrôle du code pays :** `CFLocaleCopyPreferredLanguages` comparé à l'expression régulière `RU|BY|KZ|AM|AZ|KG|MD|TJ|UZ|TM|GE`. - **Contrôle de la source de saisie du clavier :** `TISCreateInputSourceList` énuméré par rapport à une liste d'identifiants de langue de clavier de la CEI. - **Contrôle de l'architecture :** `sysctlbyname("hw.optional.arm64")` indique ARM64 ou x86_64 au C2, ce qui permet au serveur de fournir le binaire approprié. Ce contrôle confirme que le ciblage principal porte sur Apple Silicon. L'URL C2 est stockée dans le script JXA sous forme de blob chiffré avec RC4, distinct du chiffrement ChaCha20-Poly1305 utilisé dans le binaire Rust. La clé de déchiffrement RC4 est dérivée des résultats des quatre contrôles de géorestriction concaténés dans une empreinte système de 32 octets. De ce fait, l'URL C2 se déchiffre en une valeur différente sur chaque machine ; un chercheur qui extrait le blob chiffré du code source du script ne peut pas récupérer l'URL sans exécuter les contrôles sur un hôte admissible. L'extraction statique de l'URL C2 à partir du seul script du dropper est impossible. ### Usurpation de Finder et persistance via les éléments d'ouverture **Étape 4** · T1036.005 · T1564.001 · T1564.003 · T1553 Une fois les contrôles de géorestriction validés, le dropper JXA télécharge le binaire Rust depuis l'URL C2 déchiffrée au moyen de `NSURLSession` et construit sur le disque la structure suivante : ```text ~/Library/Application Support/com.apple.finder.monitor/ └── Finder.app/ ├── Contents/ │ ├── Info.plist (LSUIElement=true · LSBackgroundOnly=true) │ ├── MacOS/ │ │ └── F8C06C86 (944,464 bytes — Rust ARM64 infostealer) │ └── Resources/ │ └── AppIcon.icns (copied from /System/Library/CoreServices/Finder.app) ├── .config (34 bytes — C2 URL plaintext: https://avengerflow.com/api/sync) ├── .lock (0 bytes — single-instance mutex) └── .Maccy (0 bytes — clipboard monitoring marker) ``` Trois aspects de cette structure sont spécifiquement conçus pour éviter la détection. Le nom de répertoire `com.apple.finder.monitor` imite la convention DNS inversée utilisée par Apple pour ses propres services en arrière-plan. Le paquet s'appelle `Finder.app` et utilise une copie de l'icône authentique d'Apple Finder récupérée dans le chemin système, ce qui crée dans le Moniteur d'activité un second processus visuellement identique au véritable Finder. Le nom de l'exécutable qu'il contient se compose de huit caractères hexadécimaux dérivés de l'hôte et semble varier à chaque installation, empêchant le partage des IOC de hachage binaire au niveau du nom de fichier. Le `Info.plist` définit `LSUIElement=true` (aucune icône dans le Dock) et `LSBackgroundOnly=true` (aucune interface), de sorte que le processus s'exécute de manière entièrement invisible. Après avoir écrit le paquet, le dropper auto-signe le binaire au moyen de `codesign -fs - --deep` (signature ad hoc), ce qui entraîne un rejet par Gatekeeper lors d'une évaluation avec `spctl --assess`. Cependant, le binaire a déjà été autorisé lorsque l'utilisateur a approuvé le script dans l'Éditeur de scripts ; Gatekeeper ne le réévalue donc pas à ce stade. La persistance est enregistrée simultanément au moyen de deux API : l'ancienne `LSSharedFileList` (`LSSharedFileListInsertItemURL` sur `kLSSharedFileListSessionLoginItems`) et la nouvelle `SMAppService` de `ServiceManagement.framework`. L'élément d'ouverture obtenu apparaît dans Réglages Système → Général → Ouverture sous le nom « Finder », avec l'icône authentique d'Apple Finder. La base de données Background Task Manager (BTM) l'enregistre sous `2.com.apple.finder.monitor` avec l'état `[enabled, allowed, visible, notified]`. Le choix d'utiliser les éléments d'ouverture plutôt que LaunchAgents ou LaunchDaemons est important sur le plan opérationnel. La couverture de détection de `~/Library/LaunchAgents/*.plist` et `/Library/LaunchDaemons/*.plist` est bien établie dans les outils de sécurité macOS. La persistance via `LSSharedFileList` et `SMAppService` bénéficie d'une surveillance nettement moindre, et l'entrée de la base de données BTM n'est pas examinée par défaut dans la plupart des inventaires d'outils de sécurité. ### Vol d'identifiants et exfiltration **Étape 5** · T1555.001 · T1555.003 · T1115 · T1041 · T1573.001 Le binaire Rust s'exécute silencieusement, toutes les entrées et sorties étant redirigées vers `/dev/null`. Il fonctionne entièrement dans le contexte de la session utilisateur et ne tente aucune élévation de privilèges. Les données auxquelles il peut accéder dans ce contexte sont néanmoins nombreuses. **Identifiants du Trousseau :** le binaire appelle `SecItemCopyMatching` avec `kSecClassGenericPassword`, `kSecAttrService`, `kSecReturnData` et `kSecReturnAttributes`. Cette chaîne d'API extrait les entrées de mots de passe génériques du trousseau de session, notamment les mots de passe Wi-Fi et applicatifs ainsi que les identifiants stockés par les gestionnaires de mots de passe et les navigateurs utilisant le Trousseau comme backend. **Identifiants des navigateurs :** un accès SQLite direct via `libsqlite3.dylib` cible les bases `Login Data` et `Cookies` de Chrome, les fichiers `logins.json` et `key4.db` de Firefox ainsi que les éléments du Trousseau Safari. Les cookies de session sont capturés en conservant leurs indicateurs de sécurité, ce qui permet le détournement de session sans devoir casser un second facteur d'authentification. **Contenu du presse-papiers :** `NSPasteboard.generalPasteboard` capture tout ce que l'utilisateur copie pendant l'exécution du processus. Il s'agit précisément des données qu'un utilisateur de gestionnaire de presse-papiers s'attend à retrouver : mots de passe, jetons, phrases de récupération et codes de récupération copiés dans le cadre du travail habituel. **Interception PAM :** le binaire est lié à `libpam.2.dylib`, la bibliothèque Pluggable Authentication Module. Il peut ainsi intercepter des événements d'authentification système et éventuellement capturer les mots de passe saisis dans des invites `sudo` ou des boîtes de dialogue de sécurité du système après l'installation. Les données collectées sont chiffrées avec ChaCha20-Poly1305, variante IETF conforme à la RFC 8439. La présence de la chaîne `expand 32-byte k` dans les chaînes du binaire confirme la constante sigma de ChaCha20 issue du crate Rust `chacha20poly1305`. Chaque blob chiffré présente la structure suivante : `[version : 1 octet = 0x02] [nonce : 12 octets] [texte chiffré : N octets] [balise Poly1305 : 16 octets]`. Le corps de la balise utilise le format `MacOSapp1{"data":""}`, confirmé dans la propre base de données cache SQLite du logiciel malveillant, qui a enregistré un contact C2 le `2026-06-26 07:38:02 UTC` avec `https://avengerflow.com/api/sync`. Le canal C2 est bidirectionnel. Une réponse C2 capturée contenant un blob chiffré confirme que le serveur renvoie des commandes à l'implant. Un hôte compromis doit être traité comme un implant actif, et non comme une fuite ponctuelle d'identifiants. Tous les identifiants doivent être considérés comme exposés et renouvelés, et toutes les sessions actives doivent être invalidées. ### Aspect de la chaîne d'attaque dans la télémétrie des terminaux ```text Script Editor.app [PID ...] // first-party Apple app — inherently trusted └─ JXA obfuscated dropper [hidden below whitespace in .scpt] User clicked Run — no Terminal, no paste └─ 4x geo-fence checks NSTimeZone · CFLocale · TISInputSource · sysctlbyname("hw.optional.arm64") └─ RC4 decrypt C2 URL key = 32-byte system fingerprint — unique per host Static URL extraction not possible └─ NSURLSession download Rust ARM64 binary → ~/Library/Application Support/com.apple.finder.monitor/Finder.app/Contents/MacOS/F8C06C86 └─ codesign -fs - --deep ad-hoc self-sign — no Developer ID Gatekeeper rejects but binary already authorized └─ LSSharedFileListInsertItemURL + SMAppService registration Login Item persistence — T1547.015 Finder [real — /System/Library/CoreServices/Finder.app] Finder [FAKE — ~/Library/Application Support/com.apple.finder.monitor/Finder.app/Contents/MacOS/F8C06C86] Second Finder in Activity Monitor └─ SecItemCopyMatching kSecClassGenericPassword → Keychain entries T1555.001 └─ libsqlite3.dylib reads Login Data · logins.json · key4.db T1555.003 └─ NSPasteboard.generalPasteboard clipboard capture T1115 └─ NSURLSession HTTPS POST MacOSapp1{"data":""} → avengerflow[.]com/api/sync T1041 · T1573.001 ``` ## Indicateurs de compromission Les indicateurs sont répartis entre, d'une part, les IOC comportementaux et structurels durables, qui résistent au changement de variante, et, d'autre part, les IOC réseau volatils, liés à l'infrastructure de cette campagne précise et susceptibles de changer si l'opérateur la reconstruit. ### Chemins du système de fichiers (durables) Artefacts structurels cohérents d'une variante de campagne à l'autre. Ces chemins résultent de choix délibérés destinés à imiter les conventions de nommage d'Apple et ne changeront pas entre les mises à jour du binaire. - `~/Library/Application Support/com.apple.finder.monitor/` — Root malware directory — presence is high-confidence indicator - `~/Library/Application Support/com.apple.finder.monitor/Finder.app/Contents/MacOS/` — Rust binary location — binary name (e.g. F8C06C86) rotates per host - `~/Library/Application Support/com.apple.finder.monitor/.config` — 34-byte plaintext C2 URL file - `~/Library/Application Support/com.apple.finder.monitor/.Maccy` — Zero-byte clipboard monitoring marker - `~/Library/Caches/com.apple.finder.monitor/` — SQLite cache containing confirmed C2 contact timestamps - `~/Library/HTTPStorages/com.apple.finder.monitor/` — HTTP storage artifacts - `Bundle identifier: com.apple.finder.monitor` — Fake Apple bundle identifier — not used by any legitimate Apple software ### Modèles de processus et d'identité (durables) Indicateurs comportementaux et de signature qui subsistent lorsque le binaire est remplacé. - `Finder.app running from path other than /System/Library/CoreServices/` — High-confidence indicator of active infection - `codesign: Signature=adhoc · TeamIdentifier=not set on Finder.app` — Real Finder is signed with Apple Root CA; ad-hoc signing is unambiguous - `Login Item named "Finder" with path outside /System/Library/CoreServices/` — BTM entry: `2.com.apple.finder.monitor` - `C2 beacon prefix: MacOSapp1{"data":"...` — Campaign identifier hardcoded in Rust binary ### Comportement réseau (volatil) Ces indicateurs sont liés à l'infrastructure actuelle de la campagne. Bloquez-les au niveau du DNS et du proxy lorsque cela est possible, mais considérez-les comme volatils : l'opérateur peut changer de domaine sans modifier les autres comportements. - `avengerflow[.]com` — C2 domain — Cloudflare-fronted - `https://avengerflow[.]com/api/sync` — Confirmed C2 endpoint (cache DB timestamp: 2026-06-26 07:38:02 UTC) - `172.67.210.219` — Cloudflare front IP - `104.21.93.138` — Cloudflare front IP - `51.92.110.33 (ec2-51-92-110-33.eu-south-2.compute.amazonaws.com)` — Suspected C2 origin — AWS EC2 eu-south-2 (Spain) ### Hachages de fichiers (volatils) Les hachages binaires changeront à chaque nouvelle compilation de l'opérateur. Utilisez les indicateurs comportementaux comme détection principale. Le nom du binaire (p. ex. F8C06C86) semble varier à chaque installation. Considérez ces hachages comme des éléments de confirmation et non comme des détections principales. - `45bd0e321aa85b63b5dee4e87465e4088546eea5da6efb9c96847023384c48c9` — SHA-256 — maccy.dmg sample (1/70 VT at first submission) - `0b7529782694bee95f784a854ef3abb8f4056f61408fbc0f72cfafa5e416bc73` — SHA-256 — EDR capture variant ## Recommandations de détection La détection fondée sur les signatures échoue largement contre cette campagne. Le binaire Rust n'était détecté que par un moteur sur 70 lors de sa première soumission et son nom varie à chaque installation. La chaîne comportementale est différente : un second processus Finder provenant d'un chemin non système, un élément d'ouverture « Finder » situé hors du chemin CoreServices et du trafic POST HTTPS issu d'un paquet signé ad hoc portant cet identifiant constituent chacun une anomalie. Ensemble, ils ne laissent aucun doute. ### Second processus Finder issu d'un chemin non système **Télémétrie des processus** Générez une alerte pour tout processus nommé `Finder`, ou dont le nom d'affichage est Finder, lorsque le chemin de l'exécutable ne commence pas par `/System/Library/CoreServices/Finder.app`. Le véritable Finder s'exécute toujours depuis ce chemin. Tout écart constitue un indicateur de confiance élevée d'une activité d'usurpation. **Pourquoi cela fonctionne :** Le logiciel malveillant ne peut pas modifier le chemin depuis lequel son binaire s'exécute. Le faux paquet est installé dans la bibliothèque de l'utilisateur et cette différence de chemin est permanente, vérifiable au moyen d'une seule règle EDR. Aucun faux positif n'est attendu : aucun logiciel légitime n'exécute un processus nommé Finder hors du chemin CoreServices. ### Audit des éléments d'ouverture : Finder depuis un chemin non système **Persistance / Télémétrie BTM** Énumérez les éléments d'ouverture et générez une alerte pour toute entrée nommée « Finder » ou portant l'identifiant de paquet `com.apple.finder.monitor` dont le chemin d'application ne correspond pas à `/System/Library/CoreServices/Finder.app`. Auditez l'entrée de la base BTM (`sfltool dumpbtm`) et le fichier `backgrounditems.btm` dans `~/Library/Application Support/com.apple.backgroundtaskmanagementagent/`. **Pourquoi cela fonctionne :** la persistance via les éléments d'ouverture est le mécanisme précis qu'utilise cette campagne pour éviter la détection des LaunchAgents et LaunchDaemons. L'audit des éléments d'ouverture comble cette lacune. La base de données BTM enregistre l'identifiant de paquet, qui contient la chaîne propre à la campagne `com.apple.finder.monitor`. ### Signature de code ad hoc du paquet Finder.app **Télémétrie de signature de code** Surveillez les paquets d'application nommés `Finder.app` dont `Signature=adhoc` et `TeamIdentifier=non défini`. Le Finder macOS légitime est signé par Apple avec une chaîne Developer ID complète et passe la notarisation. Un paquet nommé Finder et signé ad hoc est sans ambiguïté illégitime. **Pourquoi cela fonctionne :** le logiciel malveillant utilise `codesign -fs -` pour s'auto-signer, ce qui constitue le minimum nécessaire à l'exécution d'un paquet d'application macOS. Il ne peut pas usurper la chaîne de signature d'Apple. Cette différence de signature est permanente et détectable sans analyse comportementale. ### Éditeur de scripts exécutant un JXA qui récupère du contenu réseau **Télémétrie EDR / des processus** Générez une alerte lorsque `Script Editor.app` lance des processus enfants qui accèdent à des ressources réseau, écrivent des fichiers dans `~/Library/Application Support/`, appellent `codesign` ou `LSSharedFileListInsertItemURL`. L'utilisation normale de l'Éditeur de scripts n'implique ni écriture de fichiers hors du répertoire de travail de l'utilisateur ni enregistrement d'éléments d'ouverture. **Pourquoi cela fonctionne :** la surface d'exécution de l'Éditeur de scripts est ce qui contourne les protections contre le collage dans Terminal. La surveillance de l'Éditeur de scripts comme surface d'exécution, de la même manière que les EDR surveillent `osascript` et `bash`, détecte l'étape d'exécution initiale de cette campagne sans devoir faire correspondre un hachage. ### Processus autre qu'un navigateur lisant les bases d'identifiants des navigateurs **Télémétrie d'accès aux fichiers** Générez une alerte lorsqu'un processus autre que `Google Chrome`, `Firefox`, `Safari` ou un composant auxiliaire de navigateur reconnu lit `Login Data`, `logins.json`, `key4.db` ou `login.keychain-db`. Le faux processus Finder accède directement à ces fichiers au moyen de `libsqlite3.dylib`. **Pourquoi cela fonctionne :** les navigateurs lisent légitimement leurs propres magasins d'identifiants. Un processus nommé Finder qui lit une base SQLite de Chrome n'est pas un navigateur. Le modèle d'accès aux fichiers constitue l'indicateur direct de l'étape de vol d'identifiants. ### Accès au Trousseau depuis un processus non système et autre qu'un navigateur **Télémétrie du Trousseau / framework Security** Surveillez les appels `SecItemCopyMatching` avec `kSecClassGenericPassword` provenant de processus situés hors des chemins `/Applications/` ou `/System/`. Le faux binaire Finder s'exécute depuis la bibliothèque de l'utilisateur et émet des requêtes Trousseau depuis ce contexte de chemin. **Pourquoi cela fonctionne :** l'accès au Trousseau par un processus usurpant Finder mais s'exécutant depuis un chemin non système est anormal. Les frameworks de sécurité des terminaux sur macOS peuvent exposer le chemin du processus appelant avec les appels d'API du Trousseau, ce qui rend cette corrélation possible. ### POST HTTPS sortant depuis l'identifiant de paquet com.apple.finder.monitor **Télémétrie réseau / DNS / proxy** Générez une alerte pour les connexions sortantes vers `avengerflow[.]com` ou les requêtes POST HTTPS provenant de l'identifiant de paquet `com.apple.finder.monitor`. Le Finder légitime n'émet pas de requêtes POST HTTPS sortantes ; toute activité réseau issue de cet identifiant de paquet est malveillante. **Pourquoi cela fonctionne :** la télémétrie réseau sur macOS peut être attribuée aux identifiants de paquets d'applications. Le format de balise C2 (`MacOSapp1{...}`) constitue également une chaîne distinctive susceptible d'apparaître dans le déchiffrement TLS ou l'inspection du proxy, lorsqu'ils sont disponibles. ## Recommandations de durcissement Les contrôles sont classés selon l'effort de mise en œuvre. **Action rapide** = déployable en quelques jours par une configuration MDM standard ou manuelle. **Standard = nécessite une modification du workflow ou un déploiement de stratégie sur les terminaux gérés.** ### Vérifier que les téléchargements de Maccy proviennent uniquement des sources officielles **Action rapide** L'application Maccy légitime est distribuée exclusivement depuis `maccy.app`, la page des versions GitHub (`github.com/p0deje/Maccy/releases`), le Mac App Store (éditeur Alexey Rodionov, Team Identifier `MN3X4648SC`) et Homebrew (`brew install --cask maccy`). Chaque build légitime est fourni sous forme de `Maccy.app.zip`, jamais en `.dmg`. Tout DMG prétendant être Maccy doit être considéré comme suspect. **Vérification :** exécutez `codesign -dvvv Maccy.app` et confirmez `Authority=Developer ID Application: Alexey Rodionov (MN3X4648SC)`, `Notarization Ticket=stapled` et `Format=app bundle with Mach-O universal (x86_64 arm64)`. Une signature ad hoc ou l'absence de Team Identifier signale un build illégitime. ### Bloquer le domaine de distribution au niveau du DNS et du proxy **Action rapide** Bloquez `maccyapp[.]com` (distribution) et `avengerflow[.]com` (C2) au niveau des résolveurs DNS et du proxy sortant. Le domaine de distribution est un IOC permanent : le projet Maccy légitime ne l'utilisera jamais et son blocage ne présente aucun risque métier. Le domaine C2 doit être considéré comme volatil, mais bloqué pendant la durée de cette campagne. **Remarque :** le C2 est derrière Cloudflare ; le seul blocage par adresse IP est donc insuffisant. Un blocage DNS au niveau du domaine est nécessaire. ### Auditer les éléments d'ouverture à la recherche d'entrées anormales sur les Mac gérés **Action rapide** Exécutez `sfltool dumpbtm` afin d'énumérer les entrées de la base BTM sur les terminaux gérés. Signalez tout élément d'ouverture dont l'identifiant de paquet contient `com.apple.finder` et dont le chemin ne correspond pas à `/System/Library/CoreServices/Finder.app`. Il s'agit du contrôle unique le plus fiable pour repérer une infection par Fake Maccy Stealer à l'échelle d'un parc géré. **Chemin :** `/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v*.btm` et `~/Library/Application Support/com.apple.backgroundtaskmanagementagent/backgrounditems.btm` ### Traiter l'Éditeur de scripts comme une surface d'exécution surveillée **Standard** macOS Tahoe 26.4 a ajouté des protections contre le collage dans Terminal afin de contrer les attaques de type ClickFix. L'Éditeur de scripts n'est pas couvert par cette protection. Les outils de sécurité et la télémétrie des terminaux doivent traiter `Script Editor.app` comme une surface d'exécution surveillée, au même titre que `osascript` et `bash`, et signaler toute exécution JXA ou AppleScript qui déclenche des connexions réseau, l'écriture de fichiers dans les répertoires Library ou l'enregistrement d'un élément d'ouverture. **Action pratique :** ajoutez l'Éditeur de scripts à la stratégie de surveillance des terminaux comme surface d'exécution à haut risque. Générez une alerte lorsque l'Éditeur de scripts lance des processus enfants qui effectuent des activités réseau ou de persistance. Envisagez des restrictions MDM sur l'accès à l'Éditeur de scripts pour les fonctions qui n'en ont pas besoin. ### Réduire l'exposition persistante des identifiants du Trousseau et des navigateurs **Standard** Cette campagne extrait les entrées du Trousseau et les mots de passe enregistrés dans les navigateurs sans élévation de privilèges, au moyen d'API accessibles à tout processus exécuté dans le contexte utilisateur. Les organisations qui stockent des identifiants sensibles dans la saisie automatique des navigateurs ou sous forme d'entrées génériques du Trousseau s'exposent à une compromission complète des identifiants après une seule exécution réussie. La migration vers des gestionnaires de mots de passe d'entreprise dotés de contrôles d'accès au niveau des processus réduit la valeur des identifiants accessibles à un infostealer exécuté dans le contexte utilisateur. **Action de réponse :** pour toute infection confirmée, considérez comme compromis l'ensemble des entrées du Trousseau, des mots de passe enregistrés dans les navigateurs et du contenu du presse-papiers pendant la période d'infection, puis renouvelez-les immédiatement. Les contrôles 1 et 2 bloquent la distribution et le C2. Le contrôle 3 détecte l'infection active à l'échelle du parc. Les contrôles 4 et 5 réduisent la surface d'attaque de cette classe de techniques. Le canal C2 est bidirectionnel : une infection confirmée doit être traitée comme un implant actif et non comme une simple fuite d'identifiants. Isolez l'hôte avant de renouveler les identifiants. ## Références principales Sources sur lesquelles cette page est fondée. Les affirmations techniques proviennent de l'analyse d'échantillons, de la documentation MITRE ATT&CK, de la documentation de sécurité des plateformes et de recherches indépendantes sur les logiciels malveillants macOS. - [MITRE ATT&CK — T1547.015 : Exécution automatique au démarrage ou à l'ouverture de session : éléments d'ouverture](https://attack.mitre.org/techniques/T1547/015/) — Actuel - [MITRE ATT&CK — T1059.007 : Interpréteur de commandes et de scripts : JavaScript](https://attack.mitre.org/techniques/T1059/007/) — Actuel - [Microsoft Threat Intelligence — Une campagne ClickFix utilise de faux utilitaires macOS comme leurres pour distribuer des infostealers](https://www.microsoft.com/en-us/security/blog/2026/05/06/clickfix-campaign-uses-fake-macos-utilities-lures-deliver-infostealers/) — Mai 2026 - [Microsoft Defender Experts — Chasse aux infostealers : menaces macOS](https://techcommunity.microsoft.com/blog/microsoftsecurityexperts/hunting-infostealers---macos-threats/4494435) — Avr. 2026 - [Maccy — Référentiel GitHub officiel (p0deje/Maccy)](https://github.com/p0deje/Maccy) — Actuel - [Patrick Wardle — The Art of Mac Malware : persistance](https://taomm.org/PDFs/vol1/CH%200x02%20Persistence.pdf) — Référence - [MITRE ATT&CK — Référence du cadre Enterprise](https://attack.mitre.org/) — Actuel