Tetrak
GitHub ↗
Security

Imaging security watch

The published security flaws in the libraries that decode images and PDFs, what each one takes to trigger, and how to protect a pipeline that opens files it did not make. Kept current from sillybos's advisory record, rebuilt weekly.

Every program that reads scans hands each file to a decoder, and decoders have flaws. In October 2026 Pillow fixed more than thirty at once, several of them reachable by opening a single crafted file. Anyone who runs an OCR pipeline, a thumbnailer or an upload form has the same question each time one is announced: does this reach me, and what do I do?

This page is our answer, written down. It comes from the work behind sillybos, the library that decides whether a file may be opened before any decoder sees it: every advisory on the libraries we watch is fetched weekly, read by a person, and recorded with what triggers it, whether opening a file reaches it, whether a check before decoding would have refused the file, and how to protect yourself with or without that check. The record is public data in the sillybos repository; this page is built from it.

Three things it is not. It is not a vulnerability database: OSV.dev and the GitHub Advisory Database are, and every row links to them. It is not a claim that sillybos prevents everything: a row says refused by default only where a test in the sillybos suite builds the triggering file and proves it is refused, and many rows say plainly that nothing before the decoder can help. And it is not advice to skip upgrading. The first line of every “how to protect yourself” entry is the fixed version.

If you only want the general advice, read Protecting yourself.

What is watched

The libraries below are the ones sillybos's weekly job asks OSV.dev about. A library with a page has advisories in the record; the others are watched and have none recorded yet.

FreeType freetype on Debian
The font renderer, which poppler uses for the text in a PDF and Pillow uses to draw text.
libjpeg-turbo libjpeg-turbo on Debian
The JPEG decoder nearly everything uses, Pillow included.
libpng libpng1.6 on Debian
The reference C library for PNG, used by Pillow, browsers and most image software.
libtiff tiff on Debian
The C library that reads and writes TIFF, the format most archival scans are kept in. Pillow, poppler, ImageMagick and nearly everything else decode TIFF through it.
OpenJPEG openjpeg2 on Debian
The JPEG 2000 codec, bundled inside Pillow's wheels and used by poppler for JPEG 2000 streams inside PDFs.
Pillow pillow on PyPI
The Python image library. Most Python programs that open a JPEG, PNG or TIFF do it with Pillow, Tetrak OCR included; it wraps libjpeg-turbo, libpng, libtiff and the others below.
poppler poppler on Debian
The PDF renderer behind pdftoppm and pdfinfo, which Tetrak OCR and most Python PDF tools call to turn pages into images.
zlib zlib on Debian
The compression library inside PNG and Deflate-compressed TIFF, so a flaw in it reaches every program that opens either.

The advisories

22 recorded · 15 refused by sillybos's default policy · record generated 2026-11-01

Reaches you says how the triggering input gets to the flaw: by opening a file is the one that matters for a pipeline that takes files from outside. What sillybos does is the record's claim, and "refused by default" is only written where a test proves it. Each row links to a page with the trigger, the finding, the tests and the advice in full.

PublishedAdvisoryLibraryReaches youWhat sillybos does
A FlashPix file runs code when opened, if olefile is installed CVE-2026-112398Pillowby opening a fileRefused by default
A SPIDER stack file bypasses the pixel limit on seek CVE-2026-96637Pillowby opening a fileRefused by default
A PNG's EXIF chunk makes parsing take quadratic time CVE-2026-96643Pillowby opening a fileRefused by default
A multi-frame file that changes colour mode writes into a buffer sized for the first frame CVE-2026-96639Pillowby opening a fileRefused by default
A later frame of an MPO or DCX file is never checked against the pixel limit CVE-2026-96636Pillowby opening a fileRefused by default
Saving a TIFF to memory overruns a heap buffer CVE-2026-112393Pillowon a save pathNot reached by opening a file
Pillow's PDF parser recurses without limit when appending CVE-2026-112391Pillowon a save pathNot reached by opening a file
An EPS file's name is passed to Ghostscript as an option CVE-2026-112900Pillowby opening a fileRefused by default
An animated PNG allocates its full canvas before the pixel limit is checked CVE-2026-112399Pillowby opening a fileRefused by default
A MIC file makes counting its frames loop for ever CVE-2026-112390Pillowby opening a fileRefused by default
A 512-byte XBM file stalls Image.open() for minutes CVE-2026-112901Pillowby opening a fileRefused by default
A tiled TIFF makes the decoder read past its tile buffer CVE-2026-112395Pillowby opening a fileRefused with a setting
A malformed compressed TIFF leaks heap memory into its pixels CVE-2026-112404Pillowby opening a fileRefused with a setting
A lossless JPEG overruns the decode buffer when scaled CVE-2026-112403Pillowby opening a fileRefused by default
A PixarLog-compressed TIFF overflows a libtiff heap buffer CVE-2026-12912libtiffby opening a fileRefused by default
A palette PNG reaches a flaw in libpng's palette handling CVE-2026-33636libpngby opening a fileRefused with a setting
A YCbCr TIFF subsampled four to one overflows a libtiff buffer CVE-2026-4775libtiffby opening a fileRefused by default
An interlaced 16-bit PNG overflows a libpng buffer CVE-2026-22695libpngby opening a fileRefused by default
A palette PNG reaches a flaw in libpng's palette handling CVE-2025-66293libpngby opening a fileRefused with a setting
An interlaced 16-bit PNG overflows a libpng buffer CVE-2025-65018libpngby opening a fileRefused by default
A palette PNG reaches a flaw in libpng's palette handling CVE-2025-64720libpngby opening a fileRefused with a setting
A TIFF tag that points past the file makes libtiff allocate for nothing CVE-2023-6277libtiffby opening a fileRefused by default

Follow it

New advisories turn up in the RSS feed. The whole record is also published as JSON, with a link to each page here, for anyone who would rather read it by machine; the file it is built from is in the sillybos repository. The site is rebuilt every Monday after the weekly advisory run, and on every change to the record.