En bref

  • CVE-2026-26980 (CVSS 9.4 Critique) — injection SQL aveugle non authentifiée dans l'API Content de Ghost CMS, versions 3.24.0 à 6.19.0.
  • Systèmes affectés : toute installation Ghost auto-hébergée avec SQLite (par défaut) ou MySQL ; images Docker officielles jusqu'au tag 6.19.0.
  • Action urgente : mettre à jour vers Ghost 6.19.1 immédiatement, puis auditer les articles publiés et faire pivoter toutes les clés API Admin.

Les faits

Une vulnérabilité critique d'injection SQL aveugle (CVE-2026-26980, CVSS v3.1 : 9.4) a été identifiée dans Ghost CMS, la plateforme de publication open-source basée sur Node.js. La faille affecte toutes les versions de 3.24.0 à 6.19.0 incluse, soit dix-huit mois de releases. Elle permet à un attaquant non authentifié d'exfiltrer l'intégralité du contenu de la base de données — clés API Admin, hachages de mots de passe, sessions — en soumettant de simples requêtes GET à l'API publique du site. Le vecteur CVSS est AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L.

La cause racine se situe dans le fichier slug-filter-order.js du sérialiseur d'entrée de l'API Content. Ghost utilise son propre langage de requête, NQL (Ghost Query Language), pour filtrer et trier le contenu. La fonction interne slugFilterOrder(table, filter) convertit les expressions NQL en fragments SQL bruts via une interpolation de template JavaScript. Le problème : NQL accepte des tokens STRING entre guillemets comme valeur unique même s'ils contiennent des virgules, mais la fonction effectue un .split(',') naïf sans respecter les limites de citation NQL. Un attaquant peut ainsi injecter plusieurs fragments SQL synthétiques directement dans une clause ORDER BY — sans aucune sanitisation ni paramétrage des requêtes.

L'oracle de timing repose sur la fonction SQLite length(hex(randomblob(50000000))) qui produit environ 400 ms de délai lorsque la condition est vraie, contre moins de 10 ms lorsqu'elle est fausse. Ce delta suffisamment large permet l'extraction bit-à-bit des données. Pour les déploiements MySQL, un oracle équivalent est disponible via SLEEP(). La clé API Content, normalement requise pour l'appel, est intégrée dans le HTML du thème Ghost et donc publiquement accessible — rendant l'exploitation purement non authentifiée en pratique.

Ghost a silencieusement corrigé la faille dans la version 6.19.1 publiée le 19 février 2026, en remplaçant l'interpolation JavaScript vulnérable par des objets paramétrisés compatibles Knex {sql, bindings}. Aucune note de sécurité n'a accompagné cette release, laissant la majorité des administrateurs dans l'ignorance de la criticité du patch. La CVE n'a été officiellement assignée que le 28 avril 2026 par Echo CNA — soit plus de deux mois après le correctif — privant les outils de gestion de vulnérabilités basés sur les CVE de toute visibilité pendant cette période.

La campagne d'exploitation à grande échelle a été détectée pour la première fois par les équipes XLab (Qianxin) le 7 mai 2026. À cette date, au moins deux clusters d'acteurs malveillants distincts exploitaient simultanément la faille — on a même observé ces groupes s'écraser mutuellement leur code injecté sur les mêmes victimes. Dès le 10 mai 2026, 156 domaines étaient confirmés compromis. Le 17 mai 2026, ce chiffre dépassait 700 domaines répartis sur 18 catégories d'activité, selon le rapport technique de XLab / Qianxin. Parmi les victimes notables figurent l'université Harvard, l'université d'Oxford, l'université d'Auburn et le moteur de recherche DuckDuckGo.

Une fois la clé API Admin exfiltrée via l'oracle SQL, les attaquants passent immédiatement à la phase de compromission de contenu. Ils appellent l'endpoint PUT /ghost/api/admin/posts/:id/ pour injecter un loader JavaScript malveillant dans chaque article publié. Deux variantes de loader ont été observées par SentinelOne et XLab : une première génération utilisant atob() pour décoder une payload en base64, et une variante optimisée stockant l'état en localStorage pour n'exécuter le redirect qu'une seule fois par session navigateur, réduisant la visibilité lors d'audits répétés.

Le vecteur d'attaque côté utilisateur est du type ClickFix : la victime qui charge une page Ghost compromise voit s'afficher une fausse page de CAPTCHA Cloudflare rendue dans un iframe. Cette interface invite l'utilisateur à « prouver qu'il n'est pas un robot » en pressant Windows+R puis en collant une commande qui a été silencieusement pré-copiée dans le presse-papiers. Le payload final (installer.dll, MD5 5659292833ec421da11ebde005d9c9a8, compilé le 16 février 2026 ; variante UtilifySetup.exe, MD5 18a7251ddde77ed24bc54700d84d9be1, compilé le 16 mai 2026 avec zéro détection VirusTotal lors du déploiement) est un trojan stealer conçu pour exfiltrer identifiants navigateur, cookies de session, données de remplissage automatique et informations système vers des serveurs C2 sous contrôle attaquant.

Les domaines C2 identifiés incluent clo4shara[.]xyz, cloud-verification[.]com, jalwat[.]com, com-apps[.]cc et web-telegram[.]ug. Ces indicateurs de compromission sont à bloquer immédiatement au niveau DNS et pare-feu. Selon BleepingComputer et The Hacker News, la campagne reste active au 27 mai 2026.

Impact et exposition

Ghost CMS est déployé par des milliers d'organisations indépendantes, médias, universités et entreprises tech dans le monde entier. L'installation par défaut utilise SQLite et expose l'API Content publiquement — réunissant exactement les conditions requises pour une exploitation triviale. Les versions 3.24.0 à 6.19.0 représentent dix-huit mois de releases, une fenêtre d'exposition exceptionnellement large. Les images Docker officielles sont concernées jusqu'au tag 6.19.0.

L'exploitation ne requiert aucune authentification, aucune interaction utilisateur et aucune configuration spéciale. Un attaquant disposant d'un accès réseau au site peut lancer l'extraction de la base de données en quelques secondes avec des outils automatisés. La corrélation entre la date de publication silencieuse du patch (19 février 2026) et la date d'attribution CVE (28 avril 2026) signifie que deux mois de déploiements se sont faits sans indication de criticité dans les scanners de vulnérabilités standard.

L'impact au-delà du site compromis est particulièrement préoccupant : les visiteurs du site deviennent eux-mêmes victimes via le vecteur ClickFix. Un blog professionnel ou un site d'université compromis bénéficie d'une réputation élevée auprès des utilisateurs, qui sont donc plus susceptibles d'interagir avec une fausse page Cloudflare. Les stealers déployés ciblent spécifiquement les mots de passe et cookies stockés dans les navigateurs, permettant la prise de contrôle de comptes bancaires, réseaux sociaux et applications métier.

Les organisations utilisant Ghost pour des newsletters ou publications internes intégrant des données sensibles (contrats, communications internes) sont exposées à une exfiltration complète du contenu de la base de données, en plus du risque de compromission des visiteurs.

Recommandations immédiates

  • Mettre à jour Ghost vers la version 6.19.1 ou supérieure — Ghost Security Advisory 2026-05. Pour les images Docker : docker pull ghost:latest et redéployer.
  • Faire pivoter TOUTES les clés API Admin et les mots de passe administrateurs — traiter toute instance exposée sur Internet depuis le 19 février 2026 comme potentiellement compromise.
  • Auditer le HTML de chaque article publié : rechercher des balises <script> inattendues, des patterns atob(, btoa(, ou des iframes non autorisées.
  • Analyser les logs Apache/Nginx pour des requêtes GET anormales vers /ghost/api/content/posts/ avec des paramètres filter= ou order= inhabituels.
  • Bloquer les IoC réseau : clo4shara[.]xyz, cloud-verification[.]com, jalwat[.]com, com-apps[.]cc, web-telegram[.]ug.
  • Scanner les endpoints exposés avec les signatures CVE-2026-26980 disponibles dans les templates Nuclei communautaires (disponibles depuis le 20 mai 2026).

⚠️ Urgence

Exploitation massive confirmée — plus de 700 sites compromis dont des universités et entreprises tech mondiales. Toute instance Ghost non mise à jour est considérée comme compromise. Agir immédiatement : patch, rotation des clés, audit de contenu.

Comment savoir si je suis vulnérable ?

Vérifiez votre version Ghost : ghost version (CLI) ou consultez la page Settings → About dans l'interface Admin. Si la version est comprise entre 3.24.0 et 6.19.0 incluse, vous êtes vulnérable. Pour détecter une compromission existante : grep -r "atob\|btoa\|randomblob\|UtilifySetup" /var/www/ghost/content/ et inspecter manuellement le HTML des articles publiés récemment depuis l'interface Admin.

Votre infrastructure est-elle exposée ?

Ayi NEDJIMI réalise des audits ciblés pour identifier et corriger vos vulnérabilités.

Demander un audit