概要
Handlebars.js は JavaScript の テンプレート エンジン として npm エコシステム で 非常 に 広く 利用 されて いる ライブラリ です。バージョン 4.0.0 から 4.7.8 まで の Handlebars.js に おいて、NumberLiteral AST ノード の value フィールド が テンプレート コンパイル 時 に 生成 される JavaScript コード に 直接 埋め込まれる 問題 が 発見 されました。
通常、NumberLiteral ノード の value フィールド に は 数値 が 格納 される こと が 期待 されます が、Handlebars.js の コンパイラ は この フィールド の 型 を 検証 して いません でした。そのため、攻撃者 が 細工 した AST オブジェクト を compile() 関数 に 渡す こと で、任意 の JavaScript コード を 注入 し、サーバーサイド で リモート コード 実行 (RCE) を 達成 する こと が 可能 です。
この 脆弱性 は CWE-94(コード インジェクション)および CWE-843(型 の 混同)に 分類 されます。CVSS スコア は 9.8 と 評価 されて おり、Critical に 分類 される 非常 に 深刻 な 脆弱性 です。Handlebars.js を サーバーサイド の テンプレート エンジン として 使用 して いる アプリケーション は、特 に 外部 から の 入力 を テンプレート として 受け付ける 場合、早急 な 対応 が 必要 です。
この 問題 は Handlebars.js の テンプレート コンパイル パイプライン の 根幹 に 関わる もの であり、AST を 直接 操作 できる 状況 で 攻撃 が 成立 します。サーバー 上 で テンプレート を コンパイル する ユースケース に おいて は、攻撃者 が 制御 可能 な データ が compile() に 到達 する パス を 確認 し、適切 な 入力 バリデーション を 実施 する こと が 重要 です。
なお、Handlebars.js の ランタイム 専用 ビルド(プリコンパイル 済み テンプレート のみ を 実行 する モード)を 使用 して いる 場合 は、compile() 関数 が 含まれない ため、この 脆弱性 の 影響 を 受けません。
CVSSベクトル
| 項目 | 値 |
|---|---|
| CVSSスコア | 9.8 |
| 深刻度 | Critical |
| 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:
compile()関数 に 渡す 入力 の 型 を 事前 に 検証 し、必ず 文字列 で ある こと を 確認 して ください。AST オブジェクト が 直接 渡される こと を 防止 する バリデーション を 追加 します。 - 暫定回避策 2: ランタイム 専用 ビルド(
handlebars/runtime)を 使用 し、テンプレート の コンパイル を ビルド 時 に のみ 行う 構成 に 変更 する こと で、compile()関数 の 攻撃 面 を 排除 できます。 - 暫定回避策 3: テンプレート の コンパイル を サンドボックス 環境 で 実行 し、万一 の コード インジェクション が 発生 した 場合 で も、影響 を 最小限 に 抑える 対策 を 講じて ください。
関連リンク
データソース: NVD (NIST) AI解説は Claude API により自動生成されています。正確性については原文をご確認ください。
