---
title: "Pillow の FlashPix（FPX）JPEG デコードでヒープ溢れ、細工したファイルを開くだけでコード実行され得る不具合（CVE-2026-112398）: 13.0.0 で修正"
url: https://n-t-p.io/worldsecurity/articles/pillow-fpx-jpeg-tile-heap-overflow-code-execution-2026-112398
lang: ja
kind: 速報
category: 脆弱性・CVE
author: World Security 編集部
published: 2026年11月7日
updated: 2026年11月7日
severity: 緊急
cve: CVE-2026-112398
---

# Pillow の FlashPix（FPX）JPEG デコードでヒープ溢れ、細工したファイルを開くだけでコード実行され得る不具合（CVE-2026-112398）: 13.0.0 で修正

> **TL;DR:** Pillow の 12.3.0 以下（13.0.0 より前）で、optional な olefile がある環境が FPX の JPEG タイルを読むときにヒープ領域へ書き込み超過が起き、細工したファイルを開くだけでコード実行され得る不具合（CVE-2026-112398、GitHub は Critical、GitHub 提供の CVSS v4.0 は 9.2、CWE-122・787）。修正版は 13.0.0。KEV 掲載なし、EPSS は 0.70%。

**要点**
- FPX の JPEG タイルで、出力バッファが raw モードの大きさで確保される一方、libjpeg が成分数ぶん（最大 4 バイト/画素）を書き、ヒープ溢れが起きる（GitHub: Critical、CVSS v4.0 9.2）
- olefile が入っていれば、拡張子ではなく先頭の識別子で FPX と判定されるため、アップロードされたファイルを自動で処理するサービスは操作なしに到達され得る
- 溢れる長さと中身は送り手が決められ、勧告はコマンド実行の検証を載せている。実行権限は画像処理プロセスのもの
- 修正版は 13.0.0（PyPI 10/16 UTC 公開）。修正コミット 242a059 は、行の幅と成分数がバッファに収まらない JPEG を拒否する
- NVD は Analyzed だが評価は GitHub 提供の v4.0 のみ。KEV 掲載なし、EPSS 0.70%（10/30）

Python の画像ライブラリ Pillow に、FlashPix（FPX）形式の JPEG タイルを読むときのヒープ領域の書き込み超過（CVE-2026-112398）が見つかり、13.0.0 で修正されました。GitHub Advisory は 10/23 公開で、深刻度は Critical、CWE-122・CWE-787 です。GitHub 提供の CVSS v4.0 は 9.2（AV:N/AC:H/PR:N/UI:N）で、v3.1 の数値は付いていません。CISA の KEV には載っていません。EPSS は 0.70%（10/30 時点）です。

## 何が起きるか

- FPX は OLE2 形式の複合文書です。Pillow は、オプションの依存 `olefile` が入っていれば、拡張子ではなくファイルの先頭の識別子（OLE2 のマジック）で FPX と判定し、`Image.open()` で読み込みます。
- FPX の JPEG タイルを読むとき、出力バッファはファイル内の色指定から決まる「raw モード」（例: LA は 1 画素 2 バイト）の大きさで確保されます。一方、libjpeg は JPEG ヘッダーの成分数に従って 1 画素ぶんの出力を書きます。勧告によると、LA などのモードでは色変換が無効になり、成分数が 4 の JPEG だと 1 行に 4×幅のバイトを、2×幅のバイトしかないバッファへ書き込みます。
- 細工したファイルでは、溢れる長さと中身を送り手が決められます。勧告は、隣の Python オブジェクトを書き換えて任意のコマンドを実行させる検証（標準の Pillow 12.2.0・x86_64 Ubuntu 24.04）を載せており、バッファ解放時に処理が乗っ取られると説明しています。再現の細部は本記事では扱いません。
- 画像のアップロードを受けてサムネイル化する、アバターや文書・画像の変換をするなど、外部から来たファイルを自動で `Image.open()` するサービスは、利用者の操作なしに到達され得ます。実行されるのは、その処理を行うプロセスの権限です。

## 修正の内容

- 修正コミット 242a059（10/06 UTC）は、JPEG のデコードを始める直前に、libjpeg が出す行の幅と成分数がバッファに収まるかを確かめ、収まらなければ「データ破損」として拒否します。確認は `JpegDecode.c` の 11 行の追加で、幅がタイルより広い JPEG を拒否するテストが加わっています。
- PyPI の記録では、Pillow 13.0.0 は 2026-10-16（UTC）に公開されています。勧告の公開（10/23）より前です。修正の公開から勧告までの経緯は未確認です。

## 影響を受ける版と条件

- NVD の記載は「13.0.0 より前」で、修正版は 13.0.0 です。GitHub Advisory の範囲は「12.3.0 以下」と書かれており、PyPI の最新の 12 系は 12.3.0 です（書き方は異なるが、実質同じ範囲と読めます。これは本記事の読み取りです）。
- 到達には `olefile` がインストールされていることが条件です。`olefile` が無い環境では FPX が自動判定されないため、この経路は成立しないと勧告の説明から読み取れます（実環境での確認はしていません）。
- 攻撃者は、細工した .fpx ファイルを対象に開かせられる必要があります。CVSS 上の攻撃条件は「高」（AC:H）です。

## 対応

1. Pillow を 13.0.0 以上に更新します。
2. すぐ更新できない場合は、環境から `olefile` を外せるか確認します（本記事の推定で、勧告が示す回避策ではありません）。
3. 外部のファイルを処理するサービスでは、`Image.open()` の前に許可する形式を絞ります（例: 受け付ける形式を JPEG・PNG などに限る）。この対策も本記事の推定です。
4. 画像処理のプロセスは、最小の権限・隔離した実行環境で動かし、外向きの通信を絞ります。
5. 画像処理を行うサーバーで、心当たりのないプロセス起動やクラッシュ（ヒープ破損の異常終了）がなかったかを確認します。

## 未確認の点

- NVD は 10/19 登録、状態は Analyzed ですが、掲載されている評価は GitHub 提供の CVSS v4.0 のみです。NVD 自身の v3.1 の評価は見つかりませんでした。
- 悪用の報告は見つかっていません（KEV 掲載なし）。EPSS は今後変わり得ます。
- 実際の環境での再現は確認していません。記載は勧告、修正コミット、公開情報に基づきます。


## 出典
- [GitHub Advisory GHSA-5x8w-8jj5-q52h（CVE-2026-112398）](https://github.com/advisories/GHSA-5x8w-8jj5-q52h) — GitHub
- [修正コミット 242a059](https://github.com/python-pillow/Pillow/commit/242a059aedc1935097d9aa1dc3f099750467ba75) — GitHub
- [Pillow 13.0.0 リリース](https://github.com/python-pillow/Pillow/releases/tag/13.0.0) — GitHub
- [PyPI pillow](https://pypi.org/project/pillow/) — PyPI
- [NVD CVE-2026-112398](https://nvd.nist.gov/vuln/detail/CVE-2026-112398) — NIST NVD
- [FIRST EPSS API](https://api.first.org/data/v1/epss?cve=CVE-2026-112398) — FIRST
- [CISA Known Exploited Vulnerabilities Catalog（JSON）](https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json) — CISA

---
出典: World Security（株式会社NTP） https://n-t-p.io/worldsecurity/articles/pillow-fpx-jpeg-tile-heap-overflow-code-execution-2026-112398