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へ上げたうえで、引数が文字列以外なら落ちる検査を残すとよい。文字列しか渡していない依存の間接利用なら、まず呼び出し元がオブジェクトを渡していないかを見る。