@@ -76,7 +76,7 @@ One person may fill multiple roles.
7676
7777## 5. Severity Classification
7878
79- Use the [ CVSS v3.1 ] ( https://www.first.org/cvss/v3.1 /specification-document ) base score as
79+ Use the [ CVSS 4.0 ] ( https://www.first.org/cvss/v4.0 /specification-document ) base score as
8080a guide, mapped to the following levels:
8181
8282| Severity | CVSS | Definition | Target Response SLA |
@@ -98,11 +98,10 @@ Vulnerabilities and incidents may be reported or discovered through:
9898
99991 . ** GitHub private security advisory** — preferred channel; see [ SECURITY.md] ( SECURITY.md )
1001002 . ** Tidelift security contact** — < https://tidelift.com/security >
101- 3 . ** Direct maintainer contact** — DM on Mastodon or email
102- 4 . ** External researcher / coordinated disclosure** — e.g. Google Project Zero, vendor PSIRT
103- 5 . ** Automated scanning** — Dependabot, GitHub code-scanning (CodeQL), CI fuzzing
104- 6 . ** Distro security teams** — Debian, Red Hat, Ubuntu, Alpine may report upstream
105- 7 . ** User bug report** — public issue (reassess if it has security implications before it stays public)
101+ 3 . ** External researcher / coordinated disclosure** — e.g. Google Project Zero, vendor PSIRT
102+ 4 . ** Automated scanning** — Dependabot, GitHub code-scanning (CodeQL), CI fuzzing
103+ 5 . ** Distro security teams** — Debian, Red Hat, Ubuntu, Alpine may report upstream
104+ 6 . ** User bug report** — public issue (reassess if it has security implications and convert to a private advisory if needed)
106105
107106---
108107
@@ -142,9 +141,9 @@ For Medium and Low severity, or when no distro pre-notification is needed:
1421411 . Merge the fix to ` main ` , then cherry-pick to all affected release branches
143142 (see [ RELEASING.md — Point release] ( ../RELEASING.md ) ).
1441432 . Amend commit messages to include the CVE identifier.
145- 3 . Tag and push; the GitHub Actions "Wheels" workflow will build and upload to PyPI.
144+ 3 . Follow the [ Point release] ( ../RELEASING.md#point-release ) process in RELEASING.md to
145+ tag, push, and confirm wheels are live on PyPI.
1461464 . Publish the GitHub Security Advisory (this simultaneously publishes the CVE).
147- 5 . Announce on [ Mastodon] ( https://fosstodon.org/@pillow ) .
148147
149148### 7.4 Embargoed Release
150149
@@ -158,25 +157,24 @@ For Critical and High severity where distro pre-notification improves user safet
158157 or directly to individual distro security teams.
1591584 . On the embargo date:
160159 - Amend commit messages with the CVE identifier.
161- - Tag and push all affected release branches (see [ RELEASING.md — Embargoed release] ( ../RELEASING.md ) ).
162- - Confirm the "Wheels" workflow has passed and wheels are live on PyPI.
160+ - Follow the [ Embargoed release] ( ../RELEASING.md#embargoed-release ) process in
161+ RELEASING.md to tag, push, and confirm wheels are live on PyPI.
163162 - Publish the GitHub Security Advisory.
164- - Announce on [ Mastodon] ( https://fosstodon.org/@pillow ) .
165163
166164### 7.5 Supply-Chain / Infrastructure Compromise
167165
1681661 . ** Immediately** revoke any potentially compromised credentials:
169- - PyPI API tokens (regenerate and update in GitHub secrets)
167+ - PyPI API tokens
170168 - GitHub personal access tokens and OAuth apps
171169 - Codecov or other CI service tokens
1721702 . Audit recent commits and releases for tampering:
173171 - Verify release tags against known-good SHAs
174172 - Re-inspect any wheel published since the potential compromise window
175- 3 . If a PyPI release is suspected to be tampered: yank it immediately via
176- [ https://pypi.org/manage/project/pillow/ ] ( https://pypi.org/manage/project/pillow/ ) ;
177- file a report with the [ PyPI security team ] ( mailto:security@ pypi.org) .
178- 4 . Notify GitHub Security if repository access or Actions secrets are involved .
179- 5 . Issue a public advisory describing the scope and any user action required.
173+ 3 . If a PyPI release is suspected to be tampered: yank it immediately via the
174+ [ PyPI release management page ] ( https://pypi.org/manage/project/Pillow/releases/ )
175+ (login required); see [ https://pypi.org/ security/ ] ( https:// pypi.org/security/ ) for
176+ reporting to the PyPI security team .
177+ 4 . Issue a public advisory describing the scope and any user action required.
180178
181179### 7.6 Recovery
182180
@@ -222,7 +220,7 @@ After the fix is released and the advisory is public:
222220Understanding what Pillow depends on (upstream) and what depends on Pillow (downstream)
223221is essential for scoping impact and coordinating notifications during an incident.
224222
225- ### 10 .1 Upstream Dependencies
223+ ### 9 .1 Upstream Dependencies
226224
227225#### Bundled C libraries (shipped in official wheels)
228226
@@ -233,20 +231,20 @@ require a Pillow point release even if Pillow's own code is unchanged.
233231| ---| ---| ---|
234232| [ libjpeg-turbo] ( https://libjpeg-turbo.org/ ) | JPEG encode/decode | [ GitHub] ( https://github.com/libjpeg-turbo/libjpeg-turbo/security ) |
235233| [ libpng] ( http://www.libpng.org/pub/png/libpng.html ) | PNG encode/decode | [ SourceForge] ( https://sourceforge.net/p/libpng/bugs/ ) |
236- | [ libtiff] ( https://libtiff.gitlab.io/libtiff/ ) | TIFF encode/decode | [ GitLab] ( https://gitlab.com/libtiff/libtiff/-/issues ) |
234+ | [ libtiff] ( https://libtiff.gitlab.io/libtiff/ ) | TIFF encode/decode | [ GitLab] ( https://gitlab.com/libtiff/libtiff/-/work_items ) |
237235| [ libwebp] ( https://chromium.googlesource.com/webm/libwebp ) | WebP encode/decode | [ Chromium tracker] ( https://bugs.chromium.org/p/webm/ ) |
238236| [ libavif] ( https://github.com/AOMediaCodec/libavif ) | AVIF encode/decode | [ GitHub] ( https://github.com/AOMediaCodec/libavif/security ) |
239237| [ aom] ( https://aomedia.googlesource.com/aom/ ) | AV1 codec (AVIF) | [ Chromium tracker] ( https://bugs.chromium.org/p/aomedia/ ) |
240238| [ dav1d] ( https://code.videolan.org/videolan/dav1d ) | AV1 decode (AVIF) | [ VideoLAN Security] ( https://www.videolan.org/security/ ) |
241239| [ openjpeg] ( https://www.openjpeg.org/ ) | JPEG 2000 encode/decode | [ GitHub] ( https://github.com/uclouvain/openjpeg/security ) |
242- | [ freetype2] ( https://freetype.org/ ) | Font rendering | [ GitLab] ( https://gitlab.freedesktop.org/freetype/freetype/-/issues ) |
240+ | [ freetype2] ( https://freetype.org/ ) | Font rendering | [ GitLab] ( https://gitlab.freedesktop.org/freetype/freetype/-/work_items ) |
243241| [ lcms2] ( https://www.littlecms.com/ ) | ICC color management | [ GitHub] ( https://github.com/mm2/Little-CMS ) |
244242| [ harfbuzz] ( https://harfbuzz.github.io/ ) | Text shaping (via raqm) | [ GitHub] ( https://github.com/harfbuzz/harfbuzz/security ) |
245243| [ raqm] ( https://github.com/HOST-Oman/libraqm ) | Complex text layout | [ GitHub] ( https://github.com/HOST-Oman/libraqm ) |
246244| [ fribidi] ( https://github.com/fribidi/fribidi ) | Unicode bidi (via raqm) | [ GitHub] ( https://github.com/fribidi/fribidi ) |
247245| [ zlib] ( https://zlib.net/ ) | Deflate compression | [ zlib.net] ( https://zlib.net/ ) |
248246| [ liblzma / xz-utils] ( https://tukaani.org/xz/ ) | XZ/LZMA compression | [ GitHub] ( https://github.com/tukaani-project/xz ) |
249- | [ bzip2] ( https://gitlab.com/bzip2/bzip2 ) | BZ2 compression | [ GitLab] ( https://gitlab.com/bzip2/bzip2/-/issues ) |
247+ | [ bzip2] ( https://gitlab.com/bzip2/bzip2 ) | BZ2 compression | [ GitLab] ( https://gitlab.com/bzip2/bzip2/-/work_items ) |
250248| [ zstd] ( https://github.com/facebook/zstd ) | Zstandard compression | [ GitHub] ( https://github.com/facebook/zstd/security ) |
251249| [ brotli] ( https://github.com/google/brotli ) | Brotli compression | [ GitHub] ( https://github.com/google/brotli ) |
252250| [ libyuv] ( https://chromium.googlesource.com/libyuv/libyuv/ ) | YUV conversion | [ Chromium tracker] ( https://bugs.chromium.org/p/libyuv/ ) |
@@ -260,7 +258,21 @@ require a Pillow point release even if Pillow's own code is unchanged.
260258| ` olefile ` | Optional (` fpx ` , ` mic ` extras) | OLE2 container parsing (FPX, MIC formats) |
261259| ` defusedxml ` | Optional (` xmp ` extra) | Safe XML parsing for XMP metadata |
262260
263- ### 10.2 Downstream Dependencies
261+ See [ ` pyproject.toml ` ] ( ../pyproject.toml ) for the complete and authoritative list of
262+ optional dependencies.
263+
264+ ### 9.2 Responding to an Upstream Vulnerability
265+
266+ When a CVE is published for a bundled C library:
267+
268+ 1 . Assess whether the vulnerable code path is reachable through Pillow's API.
269+ 2 . If reachable, treat as a Pillow vulnerability and follow [ Section 5: Severity Classification] ( #5-severity-classification ) .
270+ 3 . Update the bundled library version in the wheel build scripts and rebuild wheels.
271+ 4 . Reference the upstream CVE in Pillow's release notes and GitHub Security Advisory.
272+ 5 . If not reachable, document the rationale in a public issue so downstream distributors
273+ can make informed decisions about patching their system packages.
274+
275+ ### 9.3 Downstream Dependencies
264276
265277A vulnerability in Pillow can have wide impact. Notify or consider the blast radius of
266278these downstream consumers when assessing severity and planning communications.
@@ -299,18 +311,7 @@ warrant proactive notification.
299311Third-party plugins extend Pillow and are distributed separately on PyPI. Their
300312maintainers should be notified for Critical/High issues that affect the plugin API
301313or the formats they decode. See the
302- [ full plugin list] ( https://pillow.readthedocs.io/en/stable/handbook/third-party-plugins.html ) .
303-
304- ### 10.3 Responding to an Upstream Vulnerability
305-
306- When a CVE is published for a bundled C library:
307-
308- 1 . Assess whether the vulnerable code path is reachable through Pillow's API.
309- 2 . If reachable, treat as a Pillow vulnerability and follow Section 5.
310- 3 . Update the bundled library version in the wheel build scripts and rebuild wheels.
311- 4 . Reference the upstream CVE in Pillow's release notes and GitHub Security Advisory.
312- 5 . If not reachable, document the rationale in a public issue so downstream distributors
313- can make informed decisions about patching their system packages.
314+ [ full plugin list] ( https://pillow.readthedocs.io/en/stable/handbook/third-party-plugins.html#plugin-list ) .
314315
315316---
316317
@@ -328,7 +329,7 @@ This document is a living record. It should be kept current so it is useful when
328329- [ Tidelift Security Contact] ( https://tidelift.com/security )
329330- [ GitHub: Privately reporting a security vulnerability] ( https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing/privately-reporting-a-security-vulnerability )
330331- [ GitHub as a CVE Numbering Authority (CNA)] ( https://docs.github.com/en/code-security/security-advisories/working-with-repository-security-advisories/about-repository-security-advisories )
331- - [ FIRST CVSS v3.1 Calculator] ( https://www.first.org/cvss/calculator/3.1 )
332+ - [ FIRST CVSS 4.0 Calculator] ( https://www.first.org/cvss/calculator/4.0 )
332333- [ linux-distros mailing list] ( https://oss-security.openwall.org/wiki/mailing-lists/distros )
333334- [ OpenSSF CVD Guide] ( https://github.com/ossf/oss-vulnerability-guide ) * (basis for this plan)*
334335
0 commit comments