本文へスキップ
MameTechNews
バックエンド

Handlebars 4.7.9以前、オブジェクト渡しのcompileにコード注入

## POINTS

  • 影響は4.0.0以上4.7.9以下。修正は4.7.10。テンプレート文字列だけを渡す使い方は、このアドバイザリの対象外だ。
  • JSONなどオブジェクトをcompileへ渡すと、描画時にサーバ上でJavaScriptが実行され得る。引数は文字列かを先に確認する。
  • ビルド時プリコンパイルなら、サーバはhandlebars/runtimeに寄せるとcompile自体を呼べない。間接依存のバージョンも見る。

handlebarsのメンテナは10月5日、アドバイザリGHSA-8r5x-fm3f-whwjを公開した。深刻度はCritical、CVSS 9.8。影響範囲はnpmのhandlebars 4.0.0以上4.7.9以下で、修正版は4.7.10だ。4.7.9で入ったASTの検証を迂回し、チェックしていない値を生成後のJavaScriptへ書き込める。

Handlebars.compile()とprecompile()は、テンプレート文字列だけでなく、あらかじめパースされたASTオブジェクトも受ける。信頼できないオブジェクトがここへ届くと、compile()では描画時にNode.jsプロセスの権限でJavaScriptが実行される。precompile()では生成物にコードが入り、その出力を読み込む場所、たとえばブラウザで実行される。

対象になる条件

文字列だけを渡しているアプリは影響を受けない。問題になるのは、JSONのリクエストボディなど、オブジェクトのままcompile()へ渡す経路だ。回避策は、渡す前に文字列であることを確認して、そうでなければ拒否すること。ビルド時にプリコンパイルし、サーバではhandlebars/runtimeだけを使う方法も案内されている。このビルドにはcompile()がない。

テンプレートを利用者入力から組み立てているサービスは、ロックファイル上のバージョンを確認し、4.7.10へ上げたうえで、引数が文字列以外なら落ちる検査を残すとよい。文字列しか渡していない依存の間接利用なら、まず呼び出し元がオブジェクトを渡していないかを見る。