pybars3にコード実行の脆弱性、0.9.7以前が対象
Handlebarsテンプレートを扱うPythonライブラリpybars3の0.9.7以前に、テンプレート経由でPythonコードを実行される脆弱性が公表されました。外部から受け取ったテンプレートを処理するアプリは、使用の有無を洗い出し、修正版の有無を確認してください。
急ぎ度: 早めに
CVSS v3は8.1、v4は9.2と高く、攻撃複雑性は高とされていますが、修正版の有無を告知で確かめる必要があるため、該当するアプリから早めに確認するのが妥当です。
関係があるか
pybars3でHandlebarsテンプレートをコンパイルしているPythonアプリが対象です。とくに、利用者や外部の人がテンプレートを登録・編集できる仕組みでは影響が大きくなります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| pybars3 | 0.9.7以前 | 0.9.7より新しい版が出ていればその版。公開状況はリポジトリのIssueとアドバイザリで確認してください |
確かめ方
- 1Python環境ごとに
pip show pybars3を実行し、Versionが0.9.7以前か確かめる。Required-byの欄には、pybars3に依存している別のパッケージが出ます。 - 2requirements.txt、poetry.lock、Pipfile.lockなどの依存ファイルでpybars3を検索する。コンテナイメージや社内配布のアプリも含めて見てください。
- 3pybars3を使うコードで、テンプレートの文字列がどこから来るかを追う。開発者が書いて同梱した固定のテンプレートだけなのか、画面入力・DB・外部APIなどから来るものが混ざるのかで、優先度が変わります。
何が起きたか
pybars3に、テンプレートを経由してアプリの中で任意のPythonコードを実行させられる脆弱性が見つかりました。pybars3はHandlebarsのテンプレートを処理するライブラリで、0.9.7までの版が対象です。
原因は、テンプレートをPythonコードへ変換するpybars/_compiler.pyにあります。括弧で囲んだパスの区間がエスケープされないままコードに埋め込まれるため、ヘルパーやブロックの引数に細工があると、文字列リテラルの外へ抜け出してしまいます。その結果、テンプレートの内容がそのままアプリのプロセス内でPythonとして動きます。
CWEの分類はコードインジェクション(CWE-94)です。
攻撃の流れ
-
1
テンプレートを渡す
細工した区間を含むHandlebarsテンプレートが、アプリの処理経路に入る。
-
2
コンパイルされる
pybars3がテンプレートをPythonコードに変換する際、括弧付きのパスがエスケープされない。
-
3
文字列から抜ける
ヘルパーやブロックの引数の文字列リテラルが破られ、別のコードが混ざる。
-
4
Pythonが実行される
アプリのプロセスの権限で、意図しないコードが動く。
どう悪用されるか
CVSSの評価では、ネットワーク経由で、認証も利用者の操作も要りません。ただし攻撃複雑性は高とされています。実際には、攻撃者が細工したテンプレートをアプリに処理させられる経路があることが前提です。
テンプレートを開発者だけが管理し、外部の入力がテンプレートの文字列にならない構成なら、悪用の余地は小さいとみられます。逆に、顧客向けのメール文面やレポートの書式などを利用者が編集できる機能があると、そこが入口になりえます。
悪用されると、アプリのプロセスと同じ権限でPythonコードが動きます。機密性・完全性・可用性のいずれも高い影響が想定され、アプリが読める情報の流出、データの書き換え、サービス停止が起こりえます。
今すぐやること
-
1
pybars3を使っている環境を洗い出す
本番・検証・コンテナイメージ・バッチ処理を含め、依存ファイルと実環境の両方で版を確認します。他のライブラリ経由で入っている場合もあります。
pip show pybars3 -
2
テンプレートの入力元を確認する
テンプレートの文字列が、利用者の入力、DB、外部システムなど、開発者以外の手から来ていないかをコードで追います。該当するアプリを最優先にします。
-
3
修正版の有無を確認して更新する
pybars3のリポジトリのIssueとアドバイザリで、0.9.7より新しい修正版が出ているかを見ます。出ていれば、検証環境で動作を確かめてから本番へ更新します。
pip list --format=freeze -
4
外部由来のテンプレートの受け付けを見直す
修正版を当てるまでの間、利用者がテンプレートを編集できる機能は、停止するか編集者を限定するかを判断します。
-
5
不審な動きがないかログを見る
テンプレートの登録・更新の履歴、アプリが起動した不審なプロセス、想定外の外部通信がないかを確認します。
修正版がないあいだのつなぎ
修正版を当てられない間は、信頼できないテンプレートをpybars3でコンパイルしない構成にします。テンプレートはリポジトリで管理した固定のものだけにし、利用者の入力はテンプレートの文字列ではなく、差し込むデータとして渡してください。利用者がテンプレートを編集する機能は、当面は管理者だけに絞るか止めておくと安全です。
背景
pybars3は、JavaScript向けテンプレートエンジンHandlebarsのPython実装です。テンプレートをいったんPythonのコードに変換して実行する作りのため、テンプレートを書ける人は、実質的にそのコードの一部を書ける人になります。今回の脆弱性は、変換のときに括弧付きのパス区間をエスケープし損ねたことで、その境界が破れた点に特徴があります。
テンプレートエンジンでは、テンプレートの文字列を外部から受けると、そのままコード実行に結びつく危険があることが以前から知られています。多くの現場ではテンプレートは開発者が管理するため、ふだんは意識されにくいのですが、メール文面やレポート書式を利用者が編集できる機能を持つアプリでは、前提が変わります。
よくある質問
Q.自分でpybars3を入れた覚えがありません。それでも確認が要りますか。
pip show pybars3で版を確かめ、Required-byの欄に出るパッケージから、どのアプリが使っているかをたどれます。Q.JavaScriptのHandlebarsも影響を受けますか。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| wbond | pybars3 |
0.9.7 以前 |
— |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
pybars3 through 0.9.7 contains a code injection vulnerability in pybars/_compiler.py that allows template authors to execute Python code via unescaped bracketed path segments. Attackers can supply Handlebars templates with crafted segments in helper or block arguments to break out of string literals and execute Python 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
- report github.com
- web github.com
- web github.com