Pillowの脆弱性、olefile入りの環境で細工したFlashPix画像を開くとコード実行のおそれ(CVE-2026-112398、修正は13.0.0)

公開 2026-11-01公表 2026-10-18更新 2026-11-01資料確認 2026-11-01Pythonの脆弱性 233件のまとめ
対象製品Pillow
識別番号CVE-2026-112398
影響範囲12.3.0以前(olefileを入れ、受け取ったファイルをImage.open()で開く場合)
修正情報13.0.0

PythonのPillowに、細工したFlashPix(FPX)形式の画像をImage.open()で開くと、ヒープ領域の範囲外にデータを書き込まれ、条件がそろえば任意のコードを実行されるおそれのある脆弱性(CVE-2026-112398、GHSA-5x8w-8jj5-q52h)が、2026年10月18日にPillowから公表されました(GitHub Advisory Databaseへの収録は10月24日、日本時間)。影響するかは、任意依存のolefileが入っているかで大きく変わります。

2026-11-01更新:一次情報(Pillow公式のGHSA、GitHub Advisory Database、NVD、KEV、EPSS、PyPI、リリースノート)と照合し、速報から解説に書き直して公開しました。olefileの要否とFPXの判定、PoCがASLR無効の前提であること、13.0.0でPython 3.10が切れることを追記しました。

この記事の要点
  • olefileを入れた環境で、外部から受け取ったファイルをImage.open()で開く処理が対象です。olefileが無ければFPXの読み込み機能は登録されず、この経路には届きません。
  • 形式はファイルの先頭の印(OLE2)で判定され、拡張子は見ません。拡張子やContent-Typeの確認では防げません。
  • 修正版は13.0.0で、12系に修正版はありません。13.0.0はPython 3.11以上が必要です。

01Pillowの脆弱性で起きることと仕組み

Pillowは、FPXファイルに含まれるJPEGのタイルを展開するとき、書き込み先のバッファを1画素あたり2バイト分で確保します。ところが、FPXが指すJPEGの色の形式をPillowが判別できないと、libjpegは1画素あたり4バイト(4成分)で書き出します。この結果、確保した2バイト分のバッファに4バイト分が書き込まれ、ヒープの範囲外への書き込みが起きます。書き込む長さ(画像の幅)と中身(画素のデータ)は、ファイルを作る側が決められます。[1]

深刻度は、CVEの採番機関であるGitHubの評価でCVSS 4.0の9.2(緊急)です。NVDも同じ値を二次評価として載せています。弱点の分類はCWE-122(ヒープベースのバッファオーバーフロー)とCWE-787(範囲外への書き込み)です。[1][3]

olefileがあると、細工したFPXを開いたときに2バイト分の領域へ4バイト分が書き込まれる

受け取ったファイル、Pillowの中で展開する部品、起きることの順に並べる。

細工したFPXファイル先頭の印(OLE2)でFPXと判定される。拡張子を.pngにしても同じ
受け取ったファイルをImage.open()で開く

Pillow 12.3.0以前とolefile

olefile任意依存。入っているとFPXの読み込み機能が登録される
JPEGのタイルの展開書き込み先のバッファを1画素2バイトで確保する
libjpeg色の形式を判別できないJPEGを1画素4バイトで書き出す
確保した2バイト分に4バイト分を書き込む
ヒープの範囲外への書き込み書き込む長さと中身は、ファイルを作る側が決められる
起きること(画像処理のプロセスの権限で)
クラッシュ・サービス停止より起こりやすい結果
任意のコード実行メモリ配置の前提がそろった場合

出典 Pillow「GHSA-5x8w-8jj5-q52h」(2026-10-18)

02影響を受ける条件

次の条件がすべてそろう環境が対象です。

  • Pillowが12.3.0以前である(修正版は13.0.0)。[1]
  • 任意依存のolefileが入っている。PillowはFPXを読むのにolefileを使い、olefileが無い環境ではFPXの読み込み機能自体が登録されません。[1][7]
  • 外部から受け取ったファイルをImage.open()で開く(アップロード画像のサムネイル作成、アバターや文書の変換など)。形式はファイルの先頭の印(OLE2)で判定され、拡張子は見ません。[1]

対象の場合、受け取ったファイルを自動で開く処理で、利用者の操作なしに、画像処理を行うプロセスの権限でメモリを壊されます。条件がそろえば任意のコマンドの実行に至りますが、より起こりやすいのはクラッシュやサービス停止です。[1]

03悪用の状況

2026年11月1日時点で、米国のCISAが公開している「悪用が確認された脆弱性の一覧(KEV)」には載っていません。

今後30日以内に悪用される確率の推定値(EPSS)は0.7%です(2026-11-01時点)。見込みは高くない部類ですが、推定値で、悪用されないことを保証するものではありません。

アドバイザリには、細工したFPXファイルを作るプログラム(PoC)と再現の手順が公開されています。ただし、報告者がコマンドの実行まで示したのは、ASLR(メモリ配置の乱数化)を無効にし、インタープリターが固定アドレスで動く検証用のDocker環境です。実環境で任意のコード実行まで持ち込むには、これらの前提をそろえる必要があり、CVSS 4.0で攻撃の難しさが「高」とされているのはこのためです。[1]

修正版の公開の翌日に公表され、11月1日時点でKEVには載っていない

修正版の公開、Pillowの公表、データベースへの登録、悪用の状況の確認を並べる(日本時間)。

提供元(Pillow) データベース・公的機関

2026年10月17日

PyPIで13.0.0を公開Python 3.11以上が必要

2026年10月18日

Pillowがアドバイザリを公表細工したFPXを作るPoCと再現の手順も載せた。コマンドの実行まで示したのはASLRを無効にした検証用の環境
9.2CVSS 4.0(GitHubの評価)

2026年10月20日

NVDにCVE-2026-112398を登録二次評価として同じ9.2を載せている

2026年10月24日

GitHub Advisory Databaseに収録

2026年11月1日

KEVに載っていない
0.7%EPSS(30日以内の悪用の推定)

出典 Pillow「GHSA-5x8w-8jj5-q52h」(2026-10-18)、PyPI「Pillow 13.0.0」(2026-10-17)、米CISA「Known Exploited Vulnerabilities Catalog」(2026-11-01確認)

04対象のバージョンと推奨する版

修正版は13.0.0です。Pillowは12.3.0以前が影響を受け、12系に修正版はありません。13.0.0(13系)へのメジャーバージョンの更新が必要です。配布元(PyPI)で公開済みの版で、確認日は2026年11月1日です。更新の前に、提供元のリリースノートで変更点を確かめてください。[6][7]

系列推奨する版今回の脆弱性が直る版最新版
13系13.0.013.0.013.0.0

13.0.0はPython 3.10に対応しません。Python 3.10は2026年10月に提供が終わったためで、3.10で動かしている場合は、先にPython 3.11以上へ上げる必要があります。[6][7]

13.0.0は、今回のFPXの問題と同時に、JPEG・TIFF・PDFなどの読み書きで見つかった約40件(緊急2件・高13件を含む)をまとめて直した版です。すぐに上げられない事情があるときは、次の節のolefileを外す対処も検討します。[7]

12系に修正版はなく、13.0.0へ上げるまではolefileを外すとこの経路を断てる

13.0.0への更新と、すぐに上げられないときにolefileを外す対処を並べる。

olefileを外すすぐに上げられないとき
13.0.0に上げる修正版(最新も13.0.0)
今回の経路
FPXの読み込み機能が登録されず、届かない
直っている
同時に直る件
なし。FPXの経路だけを断つ
JPEG・TIFF・PDFなどの約40件(緊急2件・高13件を含む)
先に確かめること
FPXやMICを使っていない
Python 3.11以上で動かしている(3.10には対応しない)
だから Python 3.10や13系の互換性の確認で上げられない間は、FPXを使っていなければolefileを外し、13.0.0へ上げる。

出典 Pillow「GHSA-5x8w-8jj5-q52h」(2026-10-18)、同「13.0.0 release notes」(2026-11-01確認)

05Pillowがどこから入っているか確かめて上げる手順

  1. 使っている版と、どのパッケージが連れてきているか(Required-byの行)を確認します。依存はrequirements.txt・poetry.lock・uv.lockにも記録されています。

    ターミナル
    python -m pip show pillow
  2. 任意依存のolefileが入っているかを確認します。「見つからない(Package(s) not found)」なら、FPXの経路には届きません。

    ターミナル
    python -m pip show olefile
  3. olefileが入っている場合、Pillowが実際にFPXを開ける状態かを確認します。Trueなら、受け取ったファイルをImage.open()に渡す箇所が対象になりえます。

    ターミナル
    python -c "from PIL import Image; Image.init(); print('FPX' in Image.OPEN)"
  4. 13.0.0はPython 3.11以上が必要です。実行中のPythonの版を確認します。

    ターミナル
    python -V
  5. 13.0.0以上へ更新します。間接依存で入っている場合は制約ファイルで下限を指定し、uvやPoetryでは各ツールの行でlockを更新します。

    ターミナル
    python -m pip install --upgrade "pillow>=13.0.0"
    # 間接依存のとき
    echo "pillow>=13.0.0" >> constraints.txt && python -m pip install -r requirements.txt -c constraints.txt
    uv lock --upgrade-package pillow
    poetry update pillow
  6. 読み込まれる版を確かめます。本番の成果物(コンテナイメージなど)でも更新後の版か確認し、受け取ったファイルをそのまま開いている箇所も探します。

    ターミナル
    python -c "import PIL; print(PIL.__version__)"
    grep -rn "Image.open" --include="*.py" .

06すぐに更新できないときの対処

GitHub Advisoryに回避策の節はありません。次は、公表された成立条件から導ける緩和策です。[1]

  • olefileを外せるか確認する。olefileが無ければFPXの読み込み機能は登録されず、この経路には届きません。FPXやMIC形式を扱っていなければ、依存から外すことを検討します。[1][7]
  • Image.open()のformats引数で、受け付ける形式を実際に使うものだけに絞る(一般的な緩和策)。[1]

07拡張子では防げない理由と、経路の断ち方

Pillowは、ファイルの拡張子ではなく先頭の数バイト(OLE2の印)でFPXと判定します。そのため、.jpgや.pngに見せかけたファイルでも、olefileが入っていればFPXとして展開されます。アップロードの受け口で拡張子やContent-Typeだけを確認していても、この経路は塞げません。[1]

すぐに13.0.0へ上げられない事情(Python 3.10を使っている、13系の互換性の確認が終わっていない、など)があるときは、olefileを外してFPXの読み込み自体を無効にする対処が、影響の範囲を狭めたうえで経路を断てます。FPXやMICを使っていないことを確かめてから外します。[1][7]

脆弱性の公表・更新一覧で、Pythonの関連情報を調べることもできます。

緊急の場合AI攻撃リスク即点検サービス公開情報と、契約後すぐに用意できるアクセスの記録から先に調べ、被害や狙われやすい構成がないかを早く確かめます。

よくある質問

olefileを入れていなければ、本当に対象外ですか?

はい。PillowはFPXを読むのにolefileを使い、olefileが無いとFPXの読み込み機能自体が登録されません。python -m pip show olefileで「見つからない」と出て、かつFPXを使っていなければ、この経路には届きません。ただし、FPX/MICを使う別のライブラリがolefileを連れてくることがあるので、依存をたどって確認します。[1][7]

拡張子で画像を絞っていれば防げますか?

防げません。Pillowはファイルの先頭の印(OLE2)でFPXと判定し、拡張子は見ません。.pngに見せかけたファイルでも、olefileが入っていればFPXとして展開されます。[1]

開くだけで必ずコードを実行されますか?

いいえ。報告者がコマンドの実行まで示したのは、ASLR(メモリ配置の乱数化)を無効にし、アドレスが固定の検証用環境です。実環境では、メモリ配置の前提がそろって初めて任意のコード実行に至ります。クラッシュやサービス停止は、より起こりやすい結果です。[1]

12系の修正版はありますか?

ありません。修正は13.0.0だけで、12系には提供されていません。13.0.0はPython 3.11以上が必要です。[6][7]

出典・参考資料

  1. Pillow公式:GHSA-5x8w-8jj5-q52h2026-10-18公表・2026-10-20更新(日本時間) / 仕組み、対象(olefile必須・12.3.0以前)、修正版13.0.0、影響、PoCとASLR無効の前提、CWE、回避策の記載なし、CVSS 4.0 9.2
  2. GitHub Advisory Database:GHSA-5x8w-8jj5-q52h2026-10-24収録(日本時間) / 収録日、CVSS 4.0 9.2、影響範囲 <=12.3.0、修正版13.0.0
  3. NVD:CVE-2026-1123982026-10-20登録(日本時間) / 二次評価 CVSS 4.0 9.2(AC:H)、登録日
  4. 米CISA:Known Exploited Vulnerabilities Catalog(JSON版 2026.10.30)2026-11-01確認 / KEVに未掲載であること
  5. FIRST:EPSS(CVE-2026-112398)2026-10-31 / 今後30日に悪用される見込みの推定 0.7%
  6. PyPI:Pillow 13.0.02026-10-17(UTC、日本時間10月17日) / 修正版13.0.0が公開済み、requires_python >=3.11、最新版も13.0.0
  7. Pillow公式:リリースノート 13.0.02026-11-01確認 / Python 3.10の対応終了、同時に直した約40件の一覧、FPXの修正
  8. 修正のコミット:github.com/python-pillow/Pillow/commit/242a059aedc1935097d9aa1dc3f099750467ba75GitHub Advisoryの参考リンク / 修正の内容・経緯
  9. リリースノート:github.com/python-pillow/Pillow/releases/tag/13.0.0GitHub Advisoryの参考リンク / 修正の内容・経緯

あわせて読みたい記事

Python公表 2026-10-22

Brotliの脆弱性の確認方法、PythonとNode.jsで対象かを確かめて直す(CVE-2026-111497、コード実行のおそれ)

圧縮形式Brotliの展開処理の脆弱性CVE-2026-111497(HTTP2Shell)は、米CISAが悪用を確認しています。Pythonのbrotli・brotlicffi、Node.jsの同梱版などで、自分の版と構成が対象かを確かめる方法と修正版を、言語ごとに説明します。

Python公表 2026-05-22

Starletteの脆弱性BadHost、Hostヘッダーでパスによる認証の確認を回避されるおそれ。FastAPIを上げても古い版が残る場合の確かめ方

Starletteの脆弱性CVE-2026-48710(BadHost)は、細工したHostヘッダーでrequest.url.pathを偽り、パスで判定するアクセスの確認を回避されるおそれがあります。9月2日にKEVに追加されました。FastAPI・vLLM・LiteLLMの下で古いStarletteが残る例と、間接依存の確かめ方を説明します。

Python公表 2026-10-23

TwistedのHTTP/2の脆弱性、1接続でCPUを使い切らせるおそれと、HTTP/2が有効かの確かめ方・26.10.0への更新(GHSA-vpp8-g58w-m8mp)

Python向けTwistedのHTTP/2サーバーに、認証なしの1接続でCPUを使い切らせる脆弱性があり、10月30日に正式版26.10.0で直りました。HTTP/2が動く条件(h2とTLS)の確かめ方、修正の効き方、CVE番号の扱い、Python 3.9の環境での注意を説明します。