Security fix · CVE-2026-112390
Pillow is a Python imaging library.
Published Oct 19, 2026 · catalog updated Oct 26, 2026 · Pillow is a Python
Last checked Oct 31, 2026. A connected source was read within the last 7 days.
Check if you run it
No confirmed exploitation is on record for CVE-2026-112390. EPSS is 0.59%. Act only if a listed version of Pillow is a Python is installed.
Gaps on this record
- The stored product name is a package slug. The name on this page is taken from the title (Pillow is a Python).
- No vendor fix or required action is stored. Compare the linked advisory before you change production.
- Severity
- High8.2
- Known exploitation
- Not in CISA/VulnCheck KEV
- EPSS
- 0.59%
- Remediation
- Version ranges on file
- Affected products
- PyPI pillow · pip Pillow · pypi pillow
A crafted 5.6 KB image file makes Pillow loop forever at 100% CPU when an application asks how many frames the image has. This only affects installations that have the optional package. Any application that opens an untrusted image and then reads can have one worker tied up indefinitely. That includes the common "is this image animated?" check and re-saving with to TIFF, PDF or WebP. The call never returns, raises no exception, and does not grow memory, so only an external watchdog stops it. The file is a Microsoft Image Composer (MIC) container, which Pillow recognises by its magic bytes with no extension needed. Inside it is a TIFF stream with three chained image directories. subclasses and overrides and so that a "frame" means one stream in the container. It still inherits ( ), which walks the embedded TIFF's directory chain with until is set. Two things stop that walk from making progress: - ( ) returns the constant stream index. - calls , which resets to . As a result, the loop re-parses the second directory forever whenever the embedded stream has three or more directories. , , , , and iteration do not hang on this file. The regression was introduced in 0b33a87b0d15 (April 2020, first released in 7.2.0), which removed 's own property. The attached reproducer builds the file in code and checks two controls, which return 3 and 1 frames as expected; the malicious file is still running when it is killed after 20 seconds. ## Details (registered for whenever is installed) subclasses and redefines a "frame" as one OLE stream, overriding and accordingly. It does not override the property, so the inherited TIFF implementation runs, and that implementation relies on advancing as IFDs are loaded. returns the OLE stream index, which never changes inside , so the loop re-parses the same IFD forever. A 5632-byte OLE2 compound file whose stream is a 351-byte TIFF with three chained 1×1 IFDs is enough. on it succeeds (format , detected by the OLE magic, no extension needed);
Are you affected?
Enter the version you run. The result uses only the ranges stored on this record.
The check returns affected, not affected, or incomplete. It does not guess a version that is missing from the record.
- PyPI pillow7.2.0 → 13.0.0
- pip Pillow>= 7.2.0, < 13.0.0
- pypi pillowversion unspecified
How to fix CVE-2026-112390
Upgrade
CVE-2026-112390 lists a fix boundary at 13.0.0. Compare the installed build with that boundary before you change production.
Version check
Affected < 13.0.0
Advisory
Open the cve_org record and follow its fix.
Official advisories
What to do
Three questions, each answered from this record only. Confirm the vendor advisory before you patch.
Should you patch?
No confirmed exploitation is on record for CVE-2026-112390. EPSS is 0.59%. Act only if a listed version of Pillow is a Python is installed.
Which versions are affected?
Compare what you have installed with Pillow >= 7.2.0, < 13.0.0. Compare the installed version with the linked vendor advisory before you change production.
What should an analyst verify?
CWE-835: Infinite Loop. EPSS 0.59%. There is no CISA KEV listing. No Exploit-DB or Metasploit reference is linked. Use the source links for the original advisory.
Technology hubs
Code
The project this record applies to. Exploit listings stay in References.
Timeline
Detection, updates, and resolution for this record.
Oct 19, 2026 · NIST NVD
Detected
Pillow is a Python imaging library. From 7.2.0 until 13.0.0, Pillow can enter an infinite loop while determining the frame count of a MIC image. MicImageFile inherits TIFF frame traversal, but MicImageFile.tell reports the OLE stream index and its seek() resets TIFF frame state, so an embedded TIFF with at least three IFDs never advances. When an application with olefile installed reads n_frames o
Oct 20, 2026 · NIST NVD
Updated
Pillow is a Python imaging library. From 7.2.0 until 13.0.0, Pillow can enter an infinite loop while determining the frame count of a MIC image. MicImageFile inherits TIFF frame traversal, but MicImageFile.tell reports the OLE stream index and its seek() resets TIFF frame state, so an embedded TIFF with at least three IFDs never advances. When an application with olefile installed reads n_frames o
Oct 20, 2026 · NIST NVD
Updated
Pillow is a Python imaging library. From 7.2.0 until 13.0.0, Pillow can enter an infinite loop while determining the frame count of a MIC image. MicImageFile inherits TIFF frame traversal, but MicImageFile.tell reports the OLE stream index and its seek() resets TIFF frame state, so an embedded TIFF with at least three IFDs never advances. When an application with olefile installed reads n_frames o
Oct 21, 2026 · GitHub Advisory Database
Updated
A crafted 5.6 KB image file makes Pillow loop forever at 100% CPU when an application asks how many frames the image has. This only affects installations that have the optional package. Any application that opens an untrusted image and then reads can have one worker tied up indefinitely. That includes the common "is this image animated?" check and re-saving with to TIFF, PDF or WebP. The call neve
Oct 26, 2026 · PyPA Advisory Database
Fix available
pillow fixed in 13.0.0
Oct 26, 2026 · PyPA Advisory Database
Fix available
pillow fixed in 13.0.0
Oct 26, 2026 · PyPA Advisory Database
Updated
A crafted 5.6 KB image file makes Pillow loop forever at 100% CPU when an application asks how many frames the image has. This only affects installations that have the optional package. Any application that opens an untrusted image and then reads can have one worker tied up indefinitely. That includes the common "is this image animated?" check and re-saving with to TIFF, PDF or WebP. The call neve
Sources
- CVE.orgVulnerability recordCVE-2026-112390
Official CVE identifier
cve.org - FIRST EPSSExploitation probabilityCVE-2026-112390
30-day exploitation probability 0.59%
first.org - GitHub Advisory DatabasePackage advisoryGHSA-22hg-r758-rrw9
Pillow: Infinite loop in MIC n_frames when the embedded TIFF
github.com - GitLab Advisory DatabasePackage advisoryCVE-2026-112390
============================================================================ Infinite loop in MIC n_frames when the embedded TIFF has 3+ IFDs Location: src/PIL/MicImagePlugin.py:86 in MicImageFile.tell() Commit: a707c6b21c313880d0771e54965d142dd42358b6 ============================================================================ A crafted 5.6 KB image file makes Pillow loop forever at 100% CPU when
advisories.gitlab.com - NIST NVDVulnerability recordCVE-2026-112390
Pillow is a Python imaging library. From 7.2.0 until 13.0.0, Pillow can enter an infinite loop while determining the frame count of a MIC image. MicImageFile inherits TIFF frame traversal, but MicImageFile.tell reports the OLE stream index and its seek() resets TIFF frame state,
nvd.nist.gov - PyPA Advisory DatabasePackage advisoryGHSA-22hg-r758-rrw9
Pillow: Infinite loop in MIC n_frames when the embedded TIFF
osv.dev
References
Freshness
Last verified in this catalog Oct 31, 2026. Significant claims (KEV, EPSS, CVSS, affected ranges) come from the source rows above — open the original publisher for the authoritative advisory.
- FIRST EPSSOct 31, 2026
- PyPA Advisory DatabaseOct 26, 2026
- GitLab Advisory DatabaseOct 23, 2026
- GitHub Advisory DatabaseOct 22, 2026
- CVE.orgOct 21, 2026
- NIST NVDOct 21, 2026