概要
Handlebars.js は JavaScript の テンプレート エンジン として npm エコシステム で 広く 利用 されて いる ライブラリ です。バージョン 4.0.0 から 4.7.8 まで の Handlebars.js に おいて、動的 パーシャル の 解決 処理 に リモート コード 実行 の 脆弱性 が 発見 されました。
Handlebars.js の 動的 パーシャル 機能 は、テンプレート の レンダリング 時 に パーシャル 名 を 動的 に 決定 する 機能 です。この 機能 の 内部 で は resolvePartial() 関数 が パーシャル の 検索 を 行い、見つかった パーシャル を invokePartial() 関数 が 実行 します。
攻撃者 が テンプレート コンテキスト に 細工 した オブジェクト を 注入 する と、resolvePartial() の ガード 処理 を バイパス し、invokePartial() が undefined を 返す 状態 を 作り出す こと が できます。この 場合、Handlebars.js は フォールバック として 細工 された AST オブジェクト を コンパイル しよう と するため、結果 として 任意 の JavaScript コード が サーバー 上 で 実行 されます。
この 脆弱性 は CWE-94(コード インジェクション)および CWE-843(型 の 混同)に 分類 されます。CVSS スコア は 8.1 と 評価 されて おり、High に 分類 される 深刻 な 脆弱性 です。
攻撃 が 成立 する ため の 条件 として、攻撃者 が テンプレート コンテキスト の データ を ある 程度 制御 できる 必要 が あります。例えば、Web アプリケーション で ユーザー 入力 を テンプレート コンテキスト に 含める 場合 や、API から 取得 した 外部 データ を テンプレート に 渡す 場合 に、この 攻撃 が 成立 する 可能性 が あります。
特に サーバーサイド レンダリング を 行う Node.js アプリケーション で は、テンプレート コンテキスト に 渡す データ の 型 と 構造 を 厳密 に 検証 する こと が 重要 です。動的 パーシャル の ルックアップ に ユーザー 制御 の データ を 使用 して いる 場合 は、速やか に 修正 バージョン へ の アップデート を 実施 して ください。
CVSSベクトル
| 項目 | 値 |
|---|---|
| CVSSスコア | 8.1 |
| 深刻度 | High |
| CWE | CWE-94 (コードインジェクション) / CWE-843 (型の混同) |
影響を受けるソフトウェア
| 製品 | ベンダー | 影響バージョン |
|---|---|---|
| Handlebars.js | handlebars-lang | v4.0.0 から v4.7.8 まで |
修正バージョンと回避策
- 修正バージョン: Handlebars.js v4.7.9 へ アップデート する こと で この 脆弱性 は 修正 されます。
npm update handlebarsまたはnpm install handlebars@4.7.9で アップデート を 実施 して ください。 - 暫定回避策 1: ランタイム 専用 ビルド(
handlebars/runtime)を 使用 して ください。ランタイム 専用 ビルド で は テンプレート の 動的 コンパイル が 行われない ため、フォールバック コンパイル の パス が 存在 しません。 - 暫定回避策 2: テンプレート コンテキスト に 渡す データ を サニタイズ し、オブジェクト の 型 と 構造 を 事前 に 検証 して ください。特に、ユーザー 入力 から 直接 オブジェクト が コンテキスト に 渡される パス を 排除 する こと が 重要 です。
- 暫定回避策 3: 動的 パーシャル の ルックアップ に ユーザー 制御 の データ を 使用 しない よう に テンプレート を 修正 して ください。パーシャル 名 は 静的 な 文字列 リテラル で 指定 する か、許可 リスト に 基づいて 検証 する こと を 推奨 します。
- 暫定回避策 4: テンプレート レンダリング を サンドボックス 環境 で 実行 し、コード 実行 が 発生 した 場合 の 影響 範囲 を 限定 して ください。
関連リンク
データソース: NVD (NIST) AI解説は Claude API により自動生成されています。正確性については原文をご確認ください。
