Threat Intelligence

Storm-3168 (JADEPUFFER) : un service principal Azure fuité sur GitHub, et sept minutes pour effacer un tenant

Admin CyberAfrik 02 October 2026 47 lectures
Storm-3168 (JADEPUFFER) : un service principal Azure fuité sur GitHub, et sept minutes pour effacer un tenant

Rapport CTI technique du 2 octobre 2026

Résumé exécutif

Microsoft a publié le 25 septembre 2026 la première analyse détaillée de Storm-3168, l'acteur que Sysdig suit sous le nom JADEPUFFER et qu'il décrit comme la première opération de rançongiciel pilotée par agent autonome. L'intrusion étudiée ne repose sur aucune faille logicielle : elle part de deux service principals Azure légitimes du même tenant, dont les secrets avaient été exposés. Un identifiant a été publié en clair dans une issue GitHub publique par un employé de l'organisation victime, puis retiré, mais resté accessible via l'historique d'édition de l'issue.

Une fois ces identités non humaines détenues, l'acteur a agi à une vitesse qui trahit l'automatisation. Reconnaissance de deux souscriptions en cinq secondes, puis en 35 minutes plus de 150 opérations destructrices ou de vol de clés, dont une phase de destruction d'environ sept minutes. Plus de cent comptes de stockage visés, un Key Vault, une Function App et un App Service plan supprimés. Ce qui a sauvé une partie des données ne tient pas à la détection mais à des contrôles indépendants : verrous de ressources Azure et protection contre la suppression, actifs même quand l'identité compromise dispose de droits d'administration larges.

Chronologie

DateÉvénement
Juillet 2026Sysdig documente JADEPUFFER, qualifié de première opération de rançongiciel pilotée par agent
Début juin 2026Première identité : ~15 h 30 de reconnaissance, plus de 300 lectures réussies
+90 minutesSeconde identité : énumération de VM et groupes de ressources sur deux souscriptions en 5 secondes
+16 heuresSeconde identité : lecture des magasins de configuration App Service, recherche de credentials exposés
Peu après35 minutes d'opérations destructrices et de vol de clés, dont ~7 minutes de destruction effective
25 septembre 2026Publication du rapport Microsoft sur Storm-3168

Fiche acteur / campagne

Storm-3168 | Alias : JADEPUFFER (Sysdig) | Cible : identités cloud Azure (service principals)

Mode opératoire. L'acteur n'exploite pas de vulnérabilité pour l'accès initial dans ce cas : il réutilise des secrets de service principals exposés publiquement. Microsoft n'a pas pu confirmer avec certitude le vecteur exact, mais a retrouvé le client ID, le client secret et le tenant ID publiés en clair dans l'historique d'une issue GitHub de la victime. Deux identités compromises du même tenant se répartissent les rôles : l'une pour la reconnaissance, l'autre pour la découverte, la destruction et le vol de clés.

Signature technique. Même infrastructure réseau, même empreinte, même user agent python-requests/2.34.2 pour les deux identités. Jetons multiples utilisés en parallèle (jusqu'à deux jetons de suppression actifs simultanément pendant 70 secondes). Le minutage, la division du travail et les flux de jetons superposés indiquent une exécution scriptée ou agentique.

Droits utilisés. Aucune élévation de privilèges. Les suppressions de stockage s'appuient sur un rôle Storage Account Contributor hérité d'un groupe. Les suppressions d'App Service, Key Vault et Function App, ainsi qu'une récupération de clé, s'appuient sur un accès Contributor direct. Les tentatives sur Azure SQL utilisaient un accès SQL DB Contributor direct. L'accès était déjà en place.

Classement. Microsoft décrit un schéma cohérent avec un rançongiciel ou une extorsion, mais sans note de rançon observée ni exfiltration de données confirmée dans ce cas précis. Ce qui est établi : destruction, entrave à la restauration, collecte de clés.

Diagramme de la chaîne d'attaque

Écosystème de la campagne Storm-3168 dans Azure

Vue radiale de la campagne : secret exposé, identités compromises, actions sur les ressources Azure, contrôles ayant résisté. Sources : Microsoft, Sysdig.

Analyse technique

Étape 1 : secret exposé, puis « retiré »

Le point de départ est un secret de service principal publié en clair dans une issue GitHub publique. L'issue a ensuite été éditée pour retirer le secret, mais l'historique d'édition public a continué de l'exposer. C'est la leçon centrale : retirer un secret d'un emplacement public ne l'invalide pas. Tout identifiant exposé, même brièvement, doit être considéré comme compromis et révoqué ou renouvelé.

Étape 2 : reconnaissance à deux identités

La première identité passe environ quinze heures et demie à lister VM, souscriptions, groupes de ressources, avec plus de 300 lectures réussies. Quatre vingt dix minutes plus tard, la seconde identité couvre deux souscriptions en cinq secondes. Seize heures après, elle inspecte les magasins de configuration App Service à la recherche de credentials, puis sonde sans succès des ressources OpenSearch. La différence de rythme entre une identité « humaine » et une identité scriptée est en soi un signal de détection.

Étape 3 : destruction et entrave à la restauration

Soixante dix secondes après une tentative de ListKey sur un compte de stockage inexistant, la destruction démarre. En 35 minutes, plus de 150 opérations destructrices ou liées aux clés. L'identité tente de supprimer plus de cent comptes de stockage et réussit sur la plupart, supprime un Key Vault, une Function App et un App Service plan du même groupe de ressources. Elle vise aussi les systèmes de sauvegarde : tentatives de retrait des verrous Azure Site Recovery et Azure Backup, ciblage de comptes de stockage dont les noms évoquent Terraform et les sauvegardes, pour compliquer la reprise.

Étape 4 : ce qui a tenu

Les verrous de ressources Azure et la protection contre la suppression des comptes de stockage ont bloqué plusieurs suppressions, malgré des droits d'administration larges sur l'identité compromise. Les suppressions de bases Azure SQL ont toutes échoué parce que le script utilisait une version d'API non supportée pour ce type de ressource. Une erreur technique côté attaquant a ainsi neutralisé une partie de l'attaque. Enseignement opérationnel : des contrôles indépendants de l'identité restent efficaces là où l'IAM seul échoue.

Étape 5 : collecte de clés pour plus tard

Une demi-heure après la dernière suppression, l'identité revient pour les clés. Elle inventorie les comptes de stockage et envoie plus de 30 requêtes ListKeys réussies, dont certaines sur des comptes liés à Azure Site Recovery. Un compte de stockage épargné lors de la destruction est ensuite visé par une récupération de clé réussie. La collecte de clés, même sans exfiltration confirmée, ouvre la porte à un vol de données ultérieur.

Indicateurs de compromission

TypeValeur
User agentpython-requests/2.34.2
IPv4 (sondage/requêtes)45.131.66[.]106
IPv4 (sondage/requêtes)34.153.223[.]102
IPv4 (sondage/requêtes)64.20.53[.]230
Chemins sondés/wp-admin, PHP-CGI, /api/v1/validate/code (LangFlow)
ComportementÉnumération de deux souscriptions en ~5 secondes
ComportementJetons de suppression multiples actifs en parallèle (70 s)
ComportementListKeys massif post-destruction (>30 requêtes)

MITRE ATT&CK

Microsoft n'a pas publié de matrice formelle. Cartographie technique proposée à partir du rapport.

TactiqueTechniqueIDJustification
Initial AccessValid Accounts: Cloud AccountsT1078.004Service principals compromis via secret exposé
Credential AccessUnsecured Credentials in RepositoriesT1552.004Secret publié dans une issue GitHub publique
DiscoveryCloud Infrastructure DiscoveryT1580Énumération VM, souscriptions, groupes de ressources
Credential AccessCredentials from Configuration StoresT1552Lecture des magasins de configuration App Service
Credential AccessSteal Application Access TokenT1528Requêtes ListKeys massives sur les comptes de stockage
ImpactData DestructionT1485Suppression de >100 comptes de stockage et ressources
ImpactInhibit System RecoveryT1490Ciblage des verrous Azure Site Recovery et Backup

Remédiation : checklist opérationnelle

  1. Traiter tout identifiant exposé sur Internet, même retiré depuis, comme compromis : révoquer ou renouveler, et vérifier son historique d'utilisation, y compris l'historique d'édition des issues et commits.
  2. Interdire les secrets dans le code, les fichiers de configuration, les dépôts et les tickets. Mettre en place un scan de secrets côté dépôt et une détection de secrets exposés.
  3. Appliquer le moindre privilège aux service principals : n'accorder que les permissions dont l'application a besoin, auditer les rôles hérités de groupes.
  4. Activer les plans Defender for Cloud pertinents : Resource Manager, Storage, Key Vault, App Service, Databases.
  5. Protéger les ressources de sauvegarde et de reprise : verrous de ressources, protection contre la suppression, surveillance des tentatives de modification de ces protections.
  6. Alerter sur les signaux d'automatisation : volume d'opérations anormal en quelques secondes, user agent python-requests, jetons multiples en parallèle depuis un même service principal.
  7. Bloquer et chasser le trafic depuis 45.131.66[.]106, 34.153.223[.]102 et 64.20.53[.]230.
  8. Alerter sur les pics de ListKeys et les suppressions en masse de comptes de stockage et de Key Vaults.

Sources

Tags : Storm-3168JADEPUFFERAzureservice principalMicrosoftransomwarecloudsecret exposé
Partager cet article