概要
Handlebars.js は JavaScript の テンプレート エンジン として npm エコシステム で 広く 利用 されて いる ライブラリ です。バージョン 4.0.0 から 4.7.8 まで の Handlebars.js に おいて、未登録 の デコレータ を 参照 する テンプレート を 処理 した 際 に TypeError が 発生 し、Node.js プロセス が クラッシュ する サービス拒否(DoS)の 脆弱性 が 発見 されました。
Handlebars.js の デコレータ 機能 は、テンプレート の コンパイル 結果 を 変換 する ため の 高度 な 機能 です。テンプレート 内 で デコレータ 構文({{* decorator}} や {{#* inline "name"}} など)を 使用 する と、Handlebars.js の ランタイム は 登録 された デコレータ 関数 を lookupProperty を 通じて 検索 します。
しかし、参照 された デコレータ が 登録 されて いない 場合、lookupProperty は undefined を 返します。Handlebars.js の ランタイム は この 返り値 を 関数 として 呼び出そう と する ため、TypeError: undefined is not a function が 発生 します。この エラー が 適切 に ハンドリング されて いない 場合、Node.js プロセス 全体 が クラッシュ し、サービス拒否 状態 に 陥ります。
この 脆弱性 は CWE-754(例外的 な 条件 に 対する 不適切 な チェック)に 分類 されます。CVSS スコア は 7.5 と 評価 されて おり、High に 分類 される 脆弱性 です。
攻撃 の シナリオ として は、ユーザー が テンプレート の 内容 を 制御 できる 環境 で、未登録 の デコレータ を 含む テンプレート を 送信 する こと で、サーバー プロセス を クラッシュ させる こと が 可能 です。特に、CMS やテンプレート エディタ など、ユーザー が カスタム テンプレート を 作成 して サーバーサイド で レンダリング する アプリケーション で は、この 脆弱性 の 影響 が 大きく なります。
また、Express.js 等 の Web フレームワーク と 組み合わせて 使用 して いる 場合、プロセス の クラッシュ が 全て の リクエスト 処理 に 影響 する ため、単一 の 悪意 ある リクエスト で サービス 全体 が 停止 する 可能性 が あります。PM2 や クラスタ モード を 使用 して いて も、繰り返し の 攻撃 に よって 全 ワーカー が クラッシュ する リスク が あります。
CVSSベクトル
| 項目 | 値 |
|---|---|
| CVSSスコア | 7.5 |
| 深刻度 | High |
| CWE | CWE-754 (例外的な条件に対する不適切なチェック) |
影響を受けるソフトウェア
| 製品 | ベンダー | 影響バージョン |
|---|---|---|
| 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: テンプレート の コンパイル および レンダリング 処理 を
try/catchブロック で 囲み、TypeError が 発生 した 場合 で も プロセス が クラッシュ しない よう に エラー ハンドリング を 追加 して ください。 - 暫定回避策 2: テンプレート の 入力 を バリデーション し、デコレータ 構文(
{{*や{{#*)を 含む テンプレート を 拒否 する フィルタ を 実装 して ください。アプリケーション で デコレータ 機能 を 使用 して いない 場合、この 対策 が 有効 です。 - 暫定回避策 3: Node.js の
process.on('uncaughtException')ハンドラ を 設定 し、予期 しない 例外 に よる プロセス の 即座 の 終了 を 防止 して ください。ただし、この 方法 は 根本 対策 で は なく、アプリケーション の 状態 が 不整合 に なる リスク が あります。 - 暫定回避策 4: PM2 や systemd 等 の プロセス マネージャ を 使用 し、クラッシュ 時 の 自動 再起動 を 設定 する こと で、サービス の 可用性 を 維持 して ください。
関連リンク
データソース: NVD (NIST) AI解説は Claude API により自動生成されています。正確性については原文をご確認ください。
