European Cyber Week – Retrouvez-nous sur le stand 30

MetaStealer (1/2) : Un stealer très sophistiqué

Temps de lecture : 15 min

Dans son Panorama de la cybermenace 2025 publié en mars 2026, l’ANSSI/CERT-FR souligne une tendance de fond : les attaquants, qu’ils soient étatiques ou cybercriminels, s’appuient de plus en plus sur des logiciels légitimes pour les détourner à des fins malveillantes. Outils d’administration à distance comme AnyDesk ou ScreenConnect, services de stockage comme Dropbox ou Google Drive, tout y passe. Cette stratégie répond à une logique simple : en se camouflant derrière des marques connues et de confiance, les attaquants franchissent plus facilement les défenses techniques et contournent la vigilance des utilisateurs.

Ce n’est pas un phénomène nouveau. Depuis plusieurs années, des campagnes d’infostealers exploitent le recours massif aux outils de prise en main à distance popularisés par le télétravail. TeamViewer, AnyDesk, ScreenConnect : ces logiciels sont devenus des leurres de choix. Un utilisateur qui cherche à télécharger AnyDesk pour dépanner un collègue n’est pas naturellement méfiant face à un domaine comme anydeskt.app ou anydesck.net – la différence d’une lettre passe souvent inaperçue.

MetaStealer illustre parfaitement cette tendance. Actif depuis 2022 et observé jusqu’en fin d’année dernière, ce malware-as-a-service (MaaS) a fait de la tromperie par logiciel légitime l’un de ses vecteurs privilégiés. Dans cet article, nous reconstituons la première* des deux chaînes d’infection dont les artéfacts sont analysés sur la plateforme GLIMPS Malware Expert. Un parcours de cinq stades : du fichier LNK au payload Delphi protégé par machine virtuelle commerciale, qui illustre la sophistication croissante des opérateurs de MetaStealer.

*une seconde chaîne (downloader BAT → dropper → stealer .NET) sera traitée dans un prochain article.

Naissance d’un clone

Le 17 mars 2022, un acteur connu sous le pseudonyme _META_ publie une annonce sur le forum cybercriminel russophone WWH-Club : un nouvel infostealer est disponible à la vente. Tarif : 125 dollards par mois ou 1 000 dollards pour un accès illimité. Son pitch commercial est sans détour : il revendique « les mêmes fonctionnalités, le même code et le même panneau que RedLine Stealer, avec quelques améliorations. »

Ce n’est pas une vantardise. L’analyse technique ultérieure le confirmera : META Stealer n’est pas inspiré de RedLine, il est RedLine, légèrement modifié. Les deux malwares partagent le même créateur. La quasi-totalité du code est identique, avec de simples remplacements de la chaîne « RedLine » par « Meta ». Les certificats de signature des panneaux de contrôle sont communs, les schémas d’authentification utilisent les mêmes clés AES et RSA, et le module backend Nodes.Api traite indifféremment les requêtes des deux serveurs C2.

Trajectoire et démantèlement

En 2022, MetaStealer capture rapidement 11% du marché des infostealers, se positionnant en troisième position derrière RedLine (56%) et Raccoon Stealer (15%). La famille est activement utilisée dans des campagnes ciblées : les chercheurs de Mandiant documentent en juin 2024 son usage par le groupe UNC5537 pour compromettre des centaines d’instances Snowflake en exfiltrant des credentials depuis des machines de sous-traitants.

Le chapitre judiciaire s’ouvre le 28 octobre 2024 avec l’Opération Magnus : la police néerlandaise, le FBI et Eurojust coordonnent le démantèlement simultané de RedLine et MetaStealer. Trois serveurs sont saisis aux Pays-Bas, deux domaines confisqués, deux personnes arrêtées en Belgique, et des charges sont retenues aux États-Unis contre Maxim Rudometov, identifié comme l’un des développeurs et administrateurs de RedLine.

Analyse et mode opératoire

Cette chaîne est la plus sophistiquée que nous ayons observée pour MetaStealer. Elle mobilise cinq stages distincts : du fichier LNK jusqu’au payload final, en combinant typosquatting, file pumping et protection par machine virtuelle commerciale.

Stage 1 : les fichiers LNK, leurres AnyDesk

Documentée également par Huntress dans le cadre d’une variante ClickFix, cette technique repose sur des fichiers LNK distribués via des répertoires ouverts (serveur WsgiDAV) hébergés sur des domaines imitant AnyDesk :

  • anydeskt.app — ajout d’un « t »
  • anydesck.net — ajout d’un « c »

GLIMPS Malware permet de rapidement qualifier ces fichiers :

capture d'écran observables 1

capture d'écran observables suite

À l’inspection, ces raccourcis sont convaincants : leur icône est celle d’un document PDF (icon index 11 de msedge.exe), leur fenêtre s’exécute en mode minimisé (SW_SHOWMINNOACTIVE), et leur cible affichée est cmd.exe. La ligne de commande embarquée illustre la mécanique :

capture d'écran lignes de commande

L’icône à l’index 11 de msedge.exe correspond à un visuel pdf

Trois actions simultanées :

  1. Leurre : ouverture du vrai site anydesk.com dans Edge — la victime voit une navigation ordinaire
  2. Téléchargement silencieux : curl récupère le payload MSI sous une fausse extension .pdf
  3. Installation et effacement : msiexec /qn installe sans interface ; Taskkill supprime la fenêtre cmd

L’analyse comparative de deux LNK produits par le même opérateur révèle qu’ils ont été créés à la même seconde (2024-05-23 19:29:00 UTC), sur la même machine (desktop-gm3ka0f), avec le même SID utilisateur, preuve d’un outillage de génération automatisé.

Un second LNK utilise une légère variante syntaxique (/c et && au lieu de /k et &), avec une étape de renommage explicite du fichier téléchargé, et exploite un domaine différent (anydesck.net). Cette diversité indique plusieurs itérations du générateur de LNK, déployées en parallèle pour multiplier les vecteurs.

Nos bases de Threat Intelligence référencent l’ensemble de ces indicateurs. Les deux hashs LNK sont connus et tagués metastealer. Le domaine anydesck.net est tracké via l’URL de téléchargement du MSI, avec les labels infostealer, metastealer, msi, payload, stealer. Les deux domaines de typosquatting et l’IP de livraison 87.120.219.100 sont répertoriés comme « Malware payload delivery host », avec les tags metastealer et opendir, – confirmation que ces serveurs hébergent les payloads via des répertoires ouverts accessibles directement.

IoCs – LNK

Type Valeur Rôle
sha256 11dfb8a2ad0ba5af8c9dca541b6059
ae6f41383d66662a30c3b71032242c6011
LNK #1 (anydeskt.app)
sha256 bf90501b49ed366ef57d92c6e49cb36b
35772043525ab9351fe5b72fa51d68b6
LNK #2 (anydesck.net)
domain anydeskt.app Typosquatting AnyDesk (livraison LNK + MSI)
domain anydesck.net Typosquatting AnyDesk (livraison LNK + MSI)
url https://anydeskt.app/download/update.pdf URL de téléchargement du MSI
url https://anydesck.net/download/fhst.pdf URL de téléchargement du MSI
ip-dst 87.120.219.100 Backend de livraison MSI (URLhaus, tag opendir)
ip-dst 185.39.207.39 Infrastructure de livraison MSI (URLhaus, tag opendir)

Stage 2 : le MSI « Docusign Edit », packaging soigné

Le MSI téléchargé se présente comme « Docusign Edit 6.7.3.5« , packagé avec l’outil légitime MSI Wrapper (version 11.0.53.0). Les métadonnées internes trahissent cependant son origine : si la codepage de surface est 1252 (Western European), la codepage interne est 1251 (Cyrillic) et la locale est 1049 (Russe) – indicateur de l’environnement de compilation de l’auteur.

L’arbre de fichiers révélé par GLIMPS Malware décompose la chaîne :

Composant Verdict GLIMPS Rôle
MsiCustomActions.dll malicious Orchestration : EXPAND.EXE + ShellExecuteEx + nettoyage ICACLS
WrappedSetupProgram (CAB) malicious Archive contenant le payload
(labels : file-pumped, ls26, metastealer)
1.js malicious Nettoyage anti-forensics :
suppression récursive de %TEMP% après 5 s
ls26.exe malicious Payload MetaStealer (PE32 Delphi, 740 Mo, file pumped)

Le script 1.js mérite une attention particulière : via WScript.Shell + Scripting.FileSystemObject, il supprime l’intégralité de %TEMP% après un délai de 5 secondes, effaçant toutes les traces de l’installation. Notre nouveau modèle de détection et explicabilité « Multiscripts » (très bientôt disponible !) apporte une compréhension de ce fichier js.

multiscripts

Le payload ls26.exe pèse 740 Mo, non pas parce que le code est volumineux, mais par file pumping : le binaire est gonflé avec du padding à faible entropie (~1.4) pour dépasser les limites de scan des antivirus et des sandboxes contraintes en taille ou en durée.

IoCs – MSI

Type Valeur Rôle
sha256 0d7e3c762f5efaae862b98770a9788e79
434965a3727254972e95cfd5cb8cc7b
MSI « Docusign Edit 6.7.3.5 »
sha256 fd622cf73ea951a6de631063aba856487d
77745dd1500adca61902b8dde56fe1
MsiCustomActions.dll
sha256 513992d7076984d5c5a42affc12b6a00ee
f820f3254af75c9958ef3310190317
CAB WrappedSetupProgram
sha256 27901c689636f4a579689132c9fefb19f9c
757841fc902651140c6f213f19952
1.js (nettoyage %TEMP%)
pdb C:\ss2\Projects\MsiWrapper\MsiCustomActions
\Release\MsiCustomActions.pdb
Chemin PDB de la DLL

Nos bases de Threat Intelligence apportent ici un éclairage complémentaire. Le MSI est référencé avec les labels metastealer, msi et un label notable : anydeesk-ink – ce même label se retrouve sur le CAB, aux côtés de file-pumped, ls26, metastealer et d’un identifiant setup8491 qui pourrait correspondre à un marqueur de campagne ou de build.

L’une des adresse ip remontée 185.39.207.39 est confirmée comme « Malware payload delivery host » (tag opendir). Plusieurs composants sont également présents dans les bases communautaires attestant que cette campagne a été observée et signalée au-delà de notre périmètre d’analyse.

Le label anydeesk-ink est particulièrement intéressant : il relie directement le MSI au vecteur LNK, confirmant que l’ensemble de la chaîne, de la distribution jusqu’au payload, s’inscrit dans une campagne cohérente de typosquatting AnyDesk.

Stage 3 : ls26.exe, un stealer Delphi très sophistiqué sous armure commerciale

Afin de mener l’analyse de ce fichier, nous en avons généré une version stripped (débarassée de ses motifs répétitifs servant à « pump’) Le payload se présente donc comme Microsoft Edge PWA Launcher dans ses métadonnées PE – une mascarade soignée avec copyright Microsoft, version Edge 139.0.3405.102, et OriginalFilename: msedge_pwa_launcher.exe. Deux templates non résolus (@LANGUAGE_STRING@, @UPSTREAM_VERSION_NUMBER_STRING@) trahissent néanmoins l’injection artificielle de ces métadonnées.

La sandbox de GLIMPS Malware identifie les comportements suspects suivants :

  • Vérification de la locale système (HKLM\...\Nls\CustomLocale\en-GB)
  • Heuristique « détection de sandbox« 
  • Règle YARA GLIMPSCTI.shellcode.potential_nopSled sur les dumps mémoire La sandbox ne remontant pas plus d’informations, nous avons tenté d’en faire l’analyse statique plus approfondie.

Structure PE : un premier niveau d’opacité

Avant même d’exécuter une instruction, la structure du binaire trahit une obstruction délibérée. Les sections portent des noms aléatoires sans signification (.vopxwd, .vrbell, .wegeem, .qoseon…) – aucun compilateur standard ne les génère.

La section .wegeem (~5,2 Mo, entropie 7.95) est quasiment indistinguable d’un flux aléatoire : elle contient le bytecode P-Code et la configuration, entièrement chiffrés. La section .vopxwd présente un écart massif entre sa taille virtuelle (3,3 Mo) et sa taille sur disque (6 Ko) : elle est quasi-vide dans le fichier et ne sera peuplée qu’en mémoire, après déchiffrement.

La table d’imports se limite à trois fonctions de kernel32.dll : LoadLibraryA, GetProcAddress, ExitProcess. Tout le reste – plusieurs dizaines d’APIs Windows – est résolu dynamiquement à l’exécution, après déchiffrement des noms.

La protection ssLamePCode : une VM commerciale Delphi détournée

L’analyse statique révèle la raison de la résistance de ce sample à l’analyse : le code malveillant est protégé par ssLamePCode, un framework commercial de protection pour applications Delphi. Les unités RTTI identifiées dans le binaire – ssLamePCode, ssLameCrypt, ssZLib, SecurityEngine, Licensing, RegistrationDialog, EngineAPI, PreLoader – confirment la nature commerciale du produit, ici détourné comme couche de protection. La présence d’unités Licensing et RegistrationDialog indique que les opérateurs ont acquis ou cracké une licence de ce logiciel commercial.

Le fonctionnement repose sur cinq couches imbriquées, chacune potentiellement chiffrée par la précédente :

Loader PE custom (FUN_008a1680)
    ├── Parse headers PE
    ├── Init config chiffrée (localise la clé dans .wegeem)
    ├── CreateMutexW — anti-double-exécution
    ├── Applique relocations (table chiffrée)
    ├── Résout tous les imports (noms chiffrés → LoadLibrary + GetProcAddress)
    ├── Charge rehlpic-x32.pll (plugin packer complémentaire)
    ├── Exécute TLS callbacks (config chiffrée)
    └── Patche l'OEP → JMP Dispatcher indirect
              │
              ▼
    Dispatcher indirect (FUN_0089d294)
    Déchiffre un RVA depuis la config, calcule l'adresse absolue,
    appelle la cible — toutes les fonctions sont appelées ainsi,
    aucune xref statique possible
              │
              ├──► Anti-analyse (FUN_0089ab5c)
              │    timing check (GetTickCount vs seuil chiffré),
              │    registry check, sleep conditionnel, compteur d'exécutions
              │
              ├──► VM wrapper → Interpréteur P-Code (FUN_0089c904)
              │    24 opcodes, 10 registres virtuels, pile dédiée,
              │    accès natif aux APIs Windows (opcode CALL_NATIVE),
              │    génération de shellcode dynamique (opcode SHELLCODE_EMIT)
              │
              └──► Code stealer natif x86 (section .vopxwd déchiffrée)

On s’aperçoit clairement que le binaire a été conçu, by design, pour ralentir la rétroconception.

L’algorithme ssLameCrypt est un cipher XOR-SUB-XOR en cascade, octet par octet, avec trois propriétés:

  • Chaînage CBC-like : chaque octet déchiffré dépend de l’octet chiffré précédent, propagé comme nouvelle clé de chaînage
  • Parcours inverse de la clé : le buffer clé est consommé en sens inverse (décrémentation)
  • Dépendance positionnelle : un XOR final avec le compteur de position lie chaque octet à sa place dans le flux

La clé elle-même est les 4 096 premiers octets du flux de configuration, embarquée à l’offset 0x489DD0 dans le fichier PE. Toutes les données sensibles – noms d’API, paramètres de configuration, RVAs de fonctions, noms de mutex, chaînes GUI – sont stockées chiffrées et résolues dynamiquement par ce mécanisme. Résultat : aucune string lisible dans le binaire, résolution d’imports entièrement dynamique.

L’extraction de la configuration ssLamePCode chiffrée a permis de récupérer 58 entrées (malheureusement ce ne sont pas des configurations liées aux fonctionnalités du stealer en lui même) :

dont on a l’interprétation suivante :

Entrée Contenu Interprétation
Version packer "5u 5.9.0" Build précis du framework ssLamePCode
Identifiant build "NN59" Marqueur de campagne potentiel
Timeout anti-analyse 120000 ms Détection de sandbox par timing
Compteur max exécutions 40 Auto-destruction après 40 exécutions
Mutex/fichiers "dx1817420930v.wwt",
"gv1148627575a.byf"
IoCs potentiels (noms aléatoires)

Le code stealer s’exécute en x86 natif dans la section .vopxwd une fois déchiffrée – le P-Code n’orchestre que la phase de dépackage, pas le stealer lui-même. La section déchiffrée contient 2 643 fonctions au total : 17 fonctions logiques réelles (>2 Ko, avec des appels internes) pour 2 626 wrappers junk (~1,5 Ko chacun, aucun appel interne, aucune xref sortante) générés par le framework ssLamePCode pour gonfler le code et noyer l’analyse – un ratio de 99,4% de bruit. Les deux fonctions les plus volumineuses (~12 Ko et ~10 Ko) accèdent directement au PEB Windows via fs:[0x30] pour la résolution d’adresses en mémoire, technique caractéristique des stealers cherchant à éviter les hooks.

A l’heure actuelle, l’analyse statique n’est pas encore terminée mais nous avons déjà beaucoup d’éléments permettant de qualifier cette menace.

Observables – Payload ls26.exe

Type Valeur Rôle
sha256 4b2a7f682993a239ff3eba7862f3f2d35
4cb6a04aa813e14fc05ce30642a1da0
ls26.exe (version stripped)
sha256 32a7eee91ca6fb3bfb8aa07a7ace9894a53
6964bc59533cee3ff55b3079b7ec6
Payload dépacké (dump CAPE)
sha256 815df83dbf9b0cd22812dbfbe3b3817d271
e698404edfdcf85120d7480255ce0
Procdump CAPE
av-sig TR/Crypt.XPACK.Gen2 (Avira) Détection AV
yara GLIMPSCTI.shellcode.potential_nopSled Shellcode détecté dans les dumps mémoire
mutex dx1817420930v.wwt Anti-double-exécution
mutex gv1148627575a.byf Anti-double-exécution
registry HKLM\SYSTEM\ControlSet001\Control\
Nls\CustomLocale\en-GB
Vérification locale (anti-sandbox)

Ce que l’analyse révèle des capacités de MetaStealer

La chaîne que nous venons de reconstituer – et en particulier l’analyse du payload ls26.exe – permet de déduire certaines capacités potentielles de la famille. Ce que le sample ne dit pas explicitement dans ses strings (elles sont toutes chiffrées et obfusquées), il le révèle dans son comportement dynamique et dans la structure de son code déprotégé :

  • Vol de credentials navigateurs : décryptage AES-GCM, 3DES et DPAPI pour extraire mots de passe, cookies et données de cartes bancaires des profils Chromium et Firefox
  • Lecture directe des bases SQLite des navigateurs
  • Vol de tokens Discord avec validation en temps réel via l’API officielle
  • Capture d’écran et collecte d’informations système (processeurs, GPU, liste des processus et programmes installés)
  • Communication C2 via WCF/NetTcp – protocole rarement filtré par les proxies d’entreprise
  • Exfiltration de wallets crypto dans certaines variantes

Le tout délivré en MaaS clé en main, accessible à des affiliés sans compétences techniques avancées – et protégé par une VM commerciale.

Chaîne d’infection

A partir des indices révélés lors de notre analyse, nous pouvons modéliser la chaine d’infection suivante:

schéma chaine d'infection

Techniques MITRE ATT&CK

Technique ID Composant
Typosquatting / Mascarade de domaine T1583.001 LNK
Windows Command Shell T1059.003 LNK
Ingress Tool Transfer T1105 LNK (curl)
Mascarade de processus / métadonnées PE T1036.005 ls26.exe (Edge PWA)
Obfuscation par taille (file pumping) T1027.001 ls26.exe (740 Mo)
Anti-sandbox (timing, locale check) T1497 ls26.exe
Évasion de debugger T1622 ls26.exe
Nettoyage des traces T1070.004 1.js (suppression %TEMP%)
Signed Binary Proxy Execution: Msiexec T1218.007 LNK → MSI

Conclusion : MetaStealer, une chaîne d’infection à cinq étapes

Cette chaîne d’infection illustre la maturité opérationnelle des opérateurs MetaStealer : chaque étape est conçue pour tromper un niveau de défense différent. Le LNK abuse de la confiance envers AnyDesk et Edge. Le MSI se cache derrière Docusign et un packager commercial légitime. Le payload se protège derrière une VM commerciale Delphi en se faisant passer pour Edge. Et le file pumping neutralise les sandboxes contraintes en ressources.

L’Opération Magnus d’octobre 2024 a démantelé l’infrastructure centrale, mais les techniques restent actives. Comme le rappelle l’ANSSI, les logiciels légitimes continueront d’être détournés comme leurres tant que les utilisateurs et les outils de défense ne les traiteront pas avec la même méfiance que des fichiers inconnus.

À suivre : de RedLine à MetaStealer ?

La chaîne LNK → MSI que nous venons de documenter est la plus sophistiquée que nous ayons observée pour MetaStealer. Mais ce n’est pas la seule. Dans le prochain article, nous analysons une seconde chaîne d’infection à l’aide de GLIMPS Malware – plus directe, mais tout aussi révélatrice.

Références externes