🎯 Contexte

Publié le 3 avril 2026 par SafeDep, cet article documente une campagne de supply chain attack via npm ciblant spécifiquement les déploiements Strapi CMS d’une plateforme de paiement en cryptomonnaies identifiée comme Guardarian. La campagne s’est déroulée sur une fenêtre de 13 heures le 3 avril 2026.

📦 Vecteur d’attaque

Trente-six packages npm malveillants ont été publiés via 4 comptes sock-puppet (umarbek1233, kekylf12, tikeqemif26, umar_bektembiev1), tous imitant la convention de nommage strapi-plugin-* avec la version 3.6.8 pour paraître légitimes. Chaque package contient 3 fichiers (package.json, index.js, postinstall.js), le payload s’exécutant automatiquement via le hook postinstall sans interaction utilisateur.

🔧 8 variantes de payloads

  • Payload 1 (strapi-plugin-cron) : Exploitation Redis RCE via CONFIG SET pour injecter des entrées crontab, écrire des webshells PHP et reverse shells Node.js, injecter des clés SSH, lire le disque brut via mknod+dd, et exfiltrer un module API Guardarian
  • Payload 2 (strapi-plugin-config) : Redis + évasion Docker via overlay filesystem, reverse shell Python sur port 4444, recherche de HOT_WALLET, COLD_WALLET, MNEMONIC sur disque brut
  • Payload 3 (4 packages) : Reverse shells directs bash (port 4444) et Python (port 8888), conditionné au hostname contenant prod
  • Payload 4 (strapi-plugin-monitor) : Collecte de credentials en 8 phases, chasse aux connection strings PostgreSQL, boucle C2 de 2,5 minutes
  • Payload 5 (strapi-plugin-events) : Collecte complète en 11 phases : vol de .env, dump d’environnement, configs Strapi, dump Redis, reconnaissance réseau, secrets Docker/Kubernetes, clés privées, boucle C2 de 5 minutes
  • Payload 6 (strapi-plugin-seed) : Connexion PostgreSQL directe avec credentials hardcodés (user_strapi / 1QKtYPp18UsyU2ZwInVM), dump des tables Strapi, énumération de toutes les BDD, sondage explicite de guardarian, guardarian_payments, exchange, custody
  • Payload 7 (strapi-plugin-api@3.6.8) : Implant persistant conditionné au hostname exact prod-strapi, écriture de /tmp/.node_gc.js, persistance crontab
  • Payload 8 (strapi-plugin-api@3.6.9) : Reverse shell fileless via node -e, ciblage de /var/www/nowguardarian-strapi/ et /opt/secrets/strapi-green.env, référence à un pipeline Jenkins

🏗️ Infrastructure C2

Toutes les communications transitent en HTTP non chiffré vers 144.31.107.231:9999. Les ports 4444 (bash) et 8888 (Python) sont utilisés pour les reverse shells. Les chemins C2 incluent /exfil/, /c2/<id>/, /db/<id>/, /shell/, /build/<id>/, /bshell/.

🎯 Cible confirmée

La cible est identifiée comme Guardarian, une plateforme de paiement en cryptomonnaies, via : le répertoire /app/exteranl-apis (typo correspondant à l’infrastructure réelle), les chemins /var/www/nowguardarian-strapi/, les credentials PostgreSQL hardcodés, et les références explicites aux bases guardarian_payments, exchange, custody.

📊 Type d’article

Analyse technique détaillée d’une campagne de supply chain attack npm, documentant l’évolution en temps réel des payloads et fournissant l’ensemble des IoCs pour la détection et la réponse à incident.

🧠 TTPs et IOCs détectés

TTP

  • T1195.002 — Supply Chain Compromise: Compromise Software Supply Chain (Initial Access)
  • T1059.004 — Command and Scripting Interpreter: Unix Shell (Execution)
  • T1059.006 — Command and Scripting Interpreter: Python (Execution)
  • T1059.007 — Command and Scripting Interpreter: JavaScript (Execution)
  • T1053.003 — Scheduled Task/Job: Cron (Persistence)
  • T1505.003 — Server Software Component: Web Shell (Persistence)
  • T1098.004 — Account Manipulation: SSH Authorized Keys (Persistence)
  • T1071.001 — Application Layer Protocol: Web Protocols (Command and Control)
  • T1041 — Exfiltration Over C2 Channel (Exfiltration)
  • T1552.001 — Unsecured Credentials: Credentials In Files (Credential Access)
  • T1552.007 — Unsecured Credentials: Container API (Credential Access)
  • T1082 — System Information Discovery (Discovery)
  • T1083 — File and Directory Discovery (Discovery)
  • T1046 — Network Service Discovery (Discovery)
  • T1613 — Container and Resource Discovery (Discovery)
  • T1611 — Escape to Host (Privilege Escalation)
  • T1552.004 — Unsecured Credentials: Private Keys (Credential Access)
  • T1005 — Data from Local System (Collection)
  • T1190 — Exploit Public-Facing Application (Initial Access)
  • T1036.005 — Masquerading: Match Legitimate Name or Location (Defense Evasion)
  • T1027.011 — Obfuscated Files or Information: Fileless Storage (Defense Evasion)
  • T1543 — Create or Modify System Process (Persistence)

IOC

  • IPv4 : 144.31.107.231AbuseIPDB · VT · ThreatFox
  • URLs : http://144.31.107.231:9999/exfil/URLhaus
  • URLs : http://144.31.107.231:9999/shell.shURLhaus
  • URLs : http://144.31.107.231:9999/c2/URLhaus
  • URLs : http://144.31.107.231:9999/db/URLhaus
  • URLs : http://144.31.107.231:9999/shell/URLhaus
  • URLs : http://144.31.107.231:9999/build/URLhaus
  • URLs : http://144.31.107.231:9999/bshell/pollURLhaus
  • URLs : http://144.31.107.231:9999/bshell/resultURLhaus
  • Emails : cla4d@sharebot.net
  • Emails : w1gtd@sharebot.net
  • Fichiers : postinstall.js
  • Fichiers : shell.php
  • Fichiers : revshell.js
  • Fichiers : .node_gc.js
  • Fichiers : redis_exec.sh
  • Fichiers : vps_shell.sh
  • Fichiers : .hooks.js
  • Fichiers : strapi-green.env
  • Chemins : /tmp/.node_gc.js
  • Chemins : /tmp/redis_exec.sh
  • Chemins : /tmp/vps_shell.sh
  • Chemins : /app/public/uploads/shell.php
  • Chemins : /app/public/uploads/revshell.js
  • Chemins : /app/node_modules/.hooks.js
  • Chemins : /opt/secrets/strapi-green.env
  • Chemins : /var/www/nowguardarian-strapi/.env
  • Chemins : /opt/secrets/

Malware / Outils

  • strapi-plugin-cron (other)
  • strapi-plugin-config (other)
  • strapi-plugin-server (backdoor)
  • strapi-plugin-database (backdoor)
  • strapi-plugin-core (backdoor)
  • strapi-plugin-hooks (backdoor)
  • strapi-plugin-monitor (stealer)
  • strapi-plugin-events (stealer)
  • strapi-plugin-seed (stealer)
  • strapi-plugin-api (backdoor)
  • .node_gc.js (rat)

IOCs confirmés externellement :

  • 144.31.107.231 (ip) → VT (5/94 détections) + ThreatFox (Unknown malware)

🔗 Source originale : https://safedep.io/malicious-npm-strapi-plugin-events-c2-agent/