Modern Frontend CVEs

対象CVE: GHSA-w28w-gp39-m4p6

[緊急] @prompty/coreに深刻なRCE脆弱性!フロントエンド開発者が知るべきSSTIの脅威と対策

@prompty/coreのNunjucksレンダラーに、サーバーサイドテンプレートインジェクションからリモートコード実行に至る致命的な脆弱性が発見されました。本記事では、この脆弱性の詳細と、フロントエンドエンジニアが取るべき緊急対策を解説します。

はじめに:なぜフロントエンドエンジニアがこの脆弱性を知るべきなのか?

皆さん、こんにちは。今回は、Node.js環境で動作する`@prompty/core`というライブラリに発見された、非常に深刻な脆弱性(GHSA-w28w-gp39-m4p6)について解説します。フロントエンドエンジニアの方々の中には「バックエンドのライブラリだから関係ないのでは?」と思う方もいるかもしれません。

しかし、Next.jsやNuxt.jsなどのフレームワークを用いたサーバーサイドレンダリング(SSR)やAPIルーティング、あるいはBFF(Backend For Frontend)アーキテクチャでNode.jsを使用している場合、この脆弱性はあなたのアプリケーションに直接的な脅威となり得ます。最悪の場合、外部からの攻撃によって、サーバー上で任意のコードが実行されてしまう(Remote Code Execution: RCE)可能性があります。

脆弱性の概要:Server-Side Template Injection (SSTI) からRCEへ

この脆弱性は、`@prompty/core`ライブラリのNunjucksテンプレートレンダラーに存在します。Nunjucksは、PythonのJinja2にインスパイアされた、Node.jsでも利用できる人気のテンプレートエンジンです。`@prompty/core`はLLM(大規模言語モデル)のプロンプト管理を助けるライブラリですが、このライブラリ内のTypeScript Nunjucksレンダラーが、信頼できない`.prompty`テンプレートボディを、無制限のJavaScriptメンバーアクセスを許可した状態で評価していました。

攻撃者は、特別に細工したテンプレートを介して、JavaScriptのコンストラクタやプロトタイプチェーンのプロパティを横断し、最終的にホストとなるNode.jsプロセス内で任意のJavaScriptコードを実行することが可能でした。これは、典型的なServer-Side Template Injection (SSTI) の手法がリモートコード実行(RCE)に悪用されるケースです。深刻度は「critical」と評価されています。

SSTIとは?(改めて解説)

SSTI(Server-Side Template Injection)とは、Webアプリケーションがユーザーからの入力をテンプレートエンジンに渡す際、その入力が適切にサニタイズ(無害化)されていない場合に発生する脆弱性です。

攻撃者は、テンプレートエンジンの構文(例: `{{ ... }}`や`{% ... %}`)を利用して、意図しない処理をテンプレートに挿入します。これにより、テンプレートエンジンが持つ機能を超えた、ファイル読み取り、機密情報の漏洩、そして最悪の場合、今回のようにサーバー上での任意のコマンド実行(RCE)へと繋がる可能性があります。

影響を受けるパッケージとバージョン

この脆弱性の影響を受けるのは、以下の`@prompty/core`のバージョンです。

<ul><li><code>npm @prompty/core</code> バージョン <code>&lt;= 0.1.4</code></li><li><code>npm @prompty/core</code> バージョン <code>&lt;= 2.0.0-beta.4</code></li></ul>

もしあなたのプロジェクトで上記のバージョンを使用しており、信頼できないソースから提供された、あるいはLLMによって生成された`.prompty`ファイルをTypeScriptランタイムでレンダリングしている場合、直ちに危険にさらされる可能性があります。

緊急対策:直ちにアップグレードを!

この脆弱性に対する最も効果的な対策は、影響を受けないバージョンにアップグレードすることです。開発元は、以下のバージョンへのアップグレードを推奨しています。

<ul><li><code>@prompty/core</code> <strong><code>2.0.0-beta.5</code></strong> 以降</li></ul>

アップグレードは以下のコマンドで実行できます(使用しているパッケージマネージャーに応じて適宜変更してください)。

```bash npm install @prompty/core@latest # または yarn add @prompty/core@latest ```

修正バージョンでは、レンダラーが入力値を「自身のデータのみ」にサニタイズするように改善されました。これにより、コンストラクタやプロトタイプのメンバー横断が拒否され、またテンプレート内での関数呼び出しも許可されなくなります。しかし、通常の補間(<code>{{ variable }}</code>)、条件分岐(<code>{% if ... %}</code>)、ループ(<code>{% for ... %}</code>)、およびネストされた自身のデータプロパティの利用は引き続きサポートされるため、基本的なテンプレート機能に影響はありません。

この修正は、GitHubのPR #404にてマージされており、デフォルトのNunjucksレンダリング、明示的なレンダラー使用、安全でないメンバー参照、およびテンプレート関数呼び出しの試行に対する回帰テストも含まれています。

フロントエンドエンジニアが取るべき行動まとめ

<ol><li><strong>依存関係の確認:</strong> あなたのプロジェクトの<code>package.json</code>、<code>package-lock.json</code>、または<code>yarn.lock</code>ファイルを確認し、<code>@prompty/core</code>が使用されていないか、また使用されている場合はそのバージョンを確認してください。</li><li><strong>速やかなアップグレード:</strong> もし影響を受けるバージョンを使用している場合は、直ちに<code>2.0.0-beta.5</code>以降にアップグレードしてください。</li><li><strong>テンプレート利用のベストプラクティス:</strong> ユーザーからの入力や信頼できないソースからのデータをテンプレートエンジンで処理する際は、常に適切なサニタイズとエスケープ処理を行うことを徹底してください。サンドボックス化された環境での実行も検討しましょう。</li><li><strong>情報収集の継続:</strong> 使用しているライブラリやフレームワークのセキュリティ情報を常にチェックし、脆弱性情報に注意を払う習慣をつけましょう。</li></ol>

まとめ

今回の`@prompty/core`の脆弱性は、SSTIがRCEに直結する非常に危険なケースです。Node.js環境で開発を行うフロントエンドエンジニアにとっても、決して無視できない問題であることをご理解いただけたかと思います。

セキュリティは常に進化する脅威との戦いです。最新の情報をキャッチアップし、適切な対策を講じることで、安全で堅牢なアプリケーションを開発していきましょう。

ご自身のプロジェクトのセキュリティを今一度ご確認ください。

← ブログ一覧に戻る