pybars4にコード実行の脆弱性、0.9.13以前が対象
Handlebarsテンプレートを扱うPythonライブラリpybars4の0.9.13以前に、細工したテンプレートでアプリ内のコードを実行される脆弱性が公表されました。利用者が書いたテンプレートを処理するシステムは、使用版を調べて修正版の有無を告知で確認してください。
急ぎ度: 早めに
CVSS v3は8.1、v4は9.2と高く、テンプレートを外部から受け取る構成なら認証なしで狙われうるため、早めの確認が要ります。
関係があるか
pybars4でHandlebarsテンプレートをコンパイルし、そのテンプレートを社外の利用者や信頼できない相手が書ける環境が最も影響を受けます。テンプレートをすべて自社で固定している場合は、リスクが大きく下がります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| pybars4(PythonのHandlebarsテンプレートライブラリ) | 0.9.13以前 | 修正版の有無と版番号は、プロジェクトの公式リポジトリと公表元の告知で確認してください |
確かめ方
- 1
pip show pybars4で導入の有無と版を調べます。0.9.13以前なら対象です。出力のRequired-byの欄に、pybars4に依存している別のパッケージが出ることもあります。 - 2requirements.txt、poetry.lock、Pipfile.lockなどの依存関係ファイルにpybars4が含まれていないか検索します。コンテナイメージや社内配布のアプリも対象に含めます。
- 3pybars4を使うコードで、テンプレートの文字列がどこから来るかを確認します。利用者の入力、外部のAPI、データベースの値から組み立てている場合は、優先して調べます。
何が起きたか
pybars4の0.9.13以前には、細工されたHandlebarsテンプレートを処理させると、アプリケーションが動いているプロセスの中で任意のPythonコードを実行されてしまう脆弱性があります。
原因はpybars/_compiler.pyにあります。pybars4はテンプレートをPythonのコードに変換して実行しますが、角括弧で囲んだパスの区間(bracketed path segments)がエスケープされないまま、生成コードの文字列に埋め込まれます。ヘルパーやブロックの引数に細工した区間が入っていると、生成されるresolve()の文字列リテラルから抜け出し、そこに書かれた内容がコードとして動きます。分類はCWE-94(コードインジェクション)です。
この脆弱性は2026年10月30日に公表されました。
攻撃の流れ
-
1
テンプレート投入
攻撃者が、pybars4で処理されるテンプレートに細工した角括弧のパス区間を含めます。
-
2
コンパイル
アプリがテンプレートをPythonコードに変換するとき、区間がエスケープされずに文字列リテラルへ入ります。
-
3
文字列から脱出
生成されたresolve()の文字列リテラルが途中で閉じられ、攻撃者の内容がコードとして解釈されます。
-
4
コード実行
アプリのプロセスの権限で任意のPythonコードが動きます。
どう悪用されるか
認証は不要で、ネットワーク経由で狙われます。利用者の操作も要りません。ただし攻撃複雑度は高く、攻撃者が細工したテンプレートをアプリに渡せることが前提です。テンプレートの中身を自社だけが決めている構成では、この前提が成り立ちません。
悪用されると、アプリのプロセスが持つ権限で任意のコードが動きます。機密性・完全性・可用性のすべてに高い影響が出ます。環境変数やデータベースの接続情報の読み取り、データの書き換え、サービスの停止が起こりえます。
今すぐやること
-
1
pybars4の使用有無と版を調べる
本番・検証・バッチ処理・コンテナイメージのすべてで、導入の有無と版を調べます。他のパッケージ経由で入っている場合もあるため、依存関係のファイルも確認します。
pip show pybars4 -
2
テンプレートの入力経路を洗い出す
テンプレートの文字列が、利用者の入力、外部システム、管理画面の編集欄などから届いていないかを確認します。届いている場合は優先して対応します。
-
3
修正版を確認して更新する
公式リポジトリと公表元の告知で修正版を確認し、あれば更新します。更新後は、テンプレートを使う画面や処理が従来どおり動くかをテスト環境で確かめてから本番に反映します。
-
4
更新できないときは回避策を入れる
修正版がまだ出ていない、または今すぐ当てられない場合は、下の回避策でテンプレートの入口を絞ります。
-
5
不審な動作の跡を調べる
外部から受け取ったテンプレートを処理している場合は、公表前後のアプリログに、見覚えのないテンプレートの投入や、プロセスからの想定外の通信・ファイル操作がないかを確認します。
修正版がないあいだのつなぎ
利用者や外部システムから受け取った文字列を、テンプレートとしてコンパイルしない構成にします。テンプレートは自社が管理する固定のものだけを使い、利用者の入力はデータとして渡します。どうしても利用者にテンプレートを編集させる必要がある場合は、編集できる人を信頼できる範囲に限り、アプリのプロセスに与える権限(ファイルアクセス、ネットワーク、環境変数の秘密情報)を最小限に絞ります。
背景
pybars4は、JavaScriptで広く使われるテンプレート言語Handlebarsを、Pythonのアプリで使えるようにしたライブラリです。メール本文、帳票、画面の一部などを、データとテンプレートから生成する場面で組み込まれます。
テンプレートを一度Pythonのコードに変換してから実行する方式のため、変換のときにテンプレートの一部をコードの文字列へ埋め込む処理があります。今回の脆弱性はこの埋め込みで、角括弧のパス区間が適切にエスケープされないことから生じています。テンプレートエンジンは、テンプレートの文字列そのものが外から渡されると、データ値の入力よりも強い権限を相手に与えてしまいます。そのため、テンプレートを誰が書けるかが、影響の大きさを決めます。
よくある質問
Q.テンプレートを編集できるのが社内の管理者だけなら、急がなくてよいですか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| up9inc | pybars4 |
0.9.13 以前 |
— |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
pybars4 through 0.9.13 contains a code injection vulnerability in pybars/_compiler.py that allows attackers to execute Python code via unescaped bracketed path segments in Handlebars templates. Attackers can supply a template with a crafted segment in a helper or block argument to break out of the generated resolve() string literal and execute code in the application process.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory github.com
- advisory vulncheck.com
- advisory nvd.nist.gov
- advisory github.com
- package github.com
- web github.com
- web github.com