過去数週間(2025年11月)、PDFファイルを処理する人気のPythonプロジェクトであるpdfminer.six(特にAIパイプラインで使用)において、興味深い脆弱性(CVE-2025-64512)が公開されました。この脆弱性は、pickle.loads()を介して信頼できないデータをデシリアライズすることでリモートコード実行を可能にし、PDFファイルを攻撃ベクトルとして利用します。ここまでは順調です:人気のあるPythonパッケージにおける重要な脆弱性です。私の注目を集めたのは、その悪用可能性でした👀。
Linux系システムでは、ファイルシステム上のファイルのみが解決可能です。攻撃者は、悪意のあるPDFを処理のために提供し、悪意のあるpickleファイルを、攻撃者がすでに知っている場所にターゲットシステム上に存在させる必要があります(PDF内でそのパスを設定する必要があるため)。多くの場合、攻撃者がPDFとpickleファイルの両方を一緒に提供したとしても、事前にpickleファイルの完全なパスを知る方法がないため、悪用は困難です。[...] 全体として、LinuxまたはLinux系システムではリスクは一般的に低くなります。
つまり、Linux系システムでこの脆弱性を悪用するには、攻撃者は以下のことを行う必要があるようです:
悪意のあるpickleファイルのファイルパスを知らなくても脆弱性をトリガーする有効なPDFファイルを作成できるでしょうか?
"有効"とは、pdfminer.sixがファイルを拒否せず、処理を開始することを意味します(なぜなら_ PDFファイルとはPDFリーダーが開くものだからです_)。答えははいです。ポリグロットペイロード(のようなもの)を作成します。アイデアは、有効なpickle.gzファイルでありかつ有効なPDFファイルでもあるファイルを作成し、pdf2txt.pyがPDFファイルとして処理を開始した後、同じファイルを指してGZIP形式のpickleコードを読み込ませることです。
多くの場合 - しかし常にではない 🥲 - ファイルが%PDF-を どこか に持っていれば、それはPDFファイルです(通常は最初の1024バイト以内)(1 - )。の場合、有効なPDFファイルはオブジェクトを持っていればよいです()。GZIPファイルには特定の初期バイトがあります()、コメント(FCOMMENT, )をサポートしています。
pdfminer.six/Rootそこで、ポリグロットファイルの設計は次のとおりです:悪意のあるpickleペイロードを含む有効なGZIPを作成し、そのGZIPのFCOMMENTフラグに有効なPDFファイルを埋め込みます。そして、このファイルをpdf2txt.pyで有効なPDFとして使用して脆弱性をトリガーし、同じファイルを使って悪意のあるpickleを実行します。
(2025.12.12) 編集:
唯一の制約はファイル名で、.pickle.gzで終わる必要があることです(これはpdfminer.sixのコードcmapdb.py#L235に組み込まれています)。
私たちが持っている2つの制約は次のとおりです:
pdfminer.sixのコードcmapdb.py#L235に組み込まれています);このCVEがこれほど過小評価されていることに私は少し驚いています。このプロジェクトの人気(GitHubで6k⭐️、しかしGitHubの統計によると34kのプロジェクトで使用)と、使用事例(コマンドラインツール、AIワークフロー、パイプライン、つまり、うまく動作しているなら更新したくないあらゆる種類のインフラ)を考慮すると。
例えば、12月1日より前にインストールされたMicrosoftのツールmarkitdown 0.1.3(microsoft/markitdown、GitHubで84k⭐️、2kのプロジェクトで使用)は、pdfminer.sixを介した任意のコード実行に対して脆弱です。Microsoftチームは12月1日にパッチ0.1.4をリリースしましたが、セキュリティアラートはなかったため、他のエンジニアリングチームが更新を優先しているとは思えません。
他のプロジェクトもCVE-2025-64512の影響を受ける可能性があり、悪用は非常に簡単です。
脆弱なプロジェクトの(不完全な)リスト:
docker build -t cve-2025-64512-poc .
docker run --rm -it cve-2025-64512-poc
pdf2txt.py payload.pickle.gz
docker build -t cve-2025-64512-poc .
docker run --rm -it cve-2025-64512-poc
markitdown markitdown-payload.pickle.gz -x pdf -o output.md
