Python ReportLab PDF Lib の深刻な脆弱性:悪意の HTML を読ませるだけでコード実行

Exploit released for RCE flaw in popular ReportLab PDF library

2023/05/31 BleepingComputer — HTML 入力から PDF ファイルを生成するために、数多くのプロジェクトで使用されている人気の Python ライブラリ ReportLab Toolkit に存在する。リモートコード実行 (RCE) の脆弱性に対応する PoC エクスプロイトが公開された。昨日に GitHub で公開された、脆弱性 CVE-2023-33733 の PoC エクスプロイトには、技術的な詳細を提供する記事も含まれるため、現実世界における悪用の可能性が高くなる。ReportLab Toolkit は、PDF ライブラリとして複数のプロジェクトで利用されており、PyPI (Python Package Index) において、月間約 350万のペースでダウンロードされている。

古い修正プログラムを迂回する

この問題は、悪意のコードの実行を防ぐ役割を持つ “rl_safe_eval” のサンドボックス制限を回避する機能に起因しており、潜在的に危険な Python 組み込み関数への、攻撃者によるアクセスにつながる。

“rl_safe_eval” 関数は、2019年に発見された同様のリモートコード実行問題を防ぐために導入されたものであり、そのバイパスに対して研究者は焦点を当てた。

提示された PoC は、”str” クラスを継承する、”Word” という名前の新しいクラスを作成する、ビルトインの “type” 関数を取得する。それにより、セキュリティ・チェックがバイパスされ、”code” などの機密属性へのアクセスが可能になってしまう。

続いて、引数の数の制限に関する safe eval チェックを回避するために、”type” 自体が呼び出される。それにより攻撃者は、元のビルトイン “type” 関数を悪用して、新しいクラスやオブジェクトを作成できるようになる。

つまり、コンパイルされた関数のバイトコードから、悪意の関数が構築され、それが実行されると、任意のアクションの実行が可能になる。 この研究者が示した例では、OS コマンドを呼び出して、”/tmp/” ディレクトリに “exploited” というファイルが作成される。

研究者は、エクスプロイト・コード全体を eval で実行する場合に、1つの式で実行する必要があるため、”list comprehension” のトリックを使用して、そのように構造化したと指摘している。

Exploit for CVE-2023-33733
Exploit for CVE-2023-33733 (GitHub)

Cure53 の研究者である Elyas Damej は、脆弱性 CVE-2023-33733 の悪用について、ReportLab ライブラリを使用するソフトウェア上で、PDF に変換する HTML ファイルに悪意のコードを組み込むだけでよいと、その書き出しで警告している。

Example of a malicious HTML triggering the flaw in xhtml2pdf
Example of a malicious HTML triggering the flaw in xhtml2pdf (GitHub)

このライブラリが広く利用され、また、 PoC エクスプロイトが公開されたことで、多くのユーザーが危険にさらされることになる。このライブラリを使用しているソフトウェア・ベンダーは、利用可能なセキュリティ・アップデートを適用することで、サプライチェーンのリスクに対処すべきである。

Damej は BleepingComputer に対して、この問題が発見された時点で ReportLab の開発者に報告を行い、2023年4月27日にリリースされた Ver 3.6.13 で修正が施されたことを明らかにしている。

この研究者は、脆弱性 CVE-2023-33733 は、以前からの全てのバージョンに影響を与えると指摘している。

Python ライブラリ ReportLab Toolkit ですが、手軽に PDF を生成できるということで、広い範囲で利用されているようです。この脆弱性 CVE-2023-33733 ですが、NVD でが CVSS が割り振られていませんが、VulDB では 5.5 という低めに評価されているようです。また、文中でも指摘されているように、GitHub では PoC エクスプロイトも提供されています。PDF に変換する HTML ファイルに、悪意のコードを組み込むだけで悪用できるようなので、ご注意ください。