Skip to content

Commit 6e1ccab

Browse files
aclark4lifeCopilot
andcommitted
Address review feedback on INCIDENT_RESPONSE.md
- Update CVSS v3.1 to CVSS 4.0 throughout - Remove 'Direct maintainer contact' from detection sources - Fix 'before it stays public' wording for user bug reports - Simplify sections 7.3 and 7.4 to reference RELEASING.md instead of duplicating release process steps - Update RELEASING.md Point release section with security-specific steps (amend CVE in commits, publish GitHub Security Advisory) - Fix PyPI API tokens entry (remove GitHub secrets reference) - Fix 404 PyPI manage URL (use correct case and /releases/ path) - Replace security@pypi.org mailto with https://pypi.org/security/ - Remove unconfirmed 'Notify GitHub Security' bullet - Fix section numbering: 10.x → 9.x under Section 9. Dependency Map - Reorder: move 9.3 Responding to Upstream Vulnerability before 9.3 Downstream Dependencies (now 9.2 and 9.3 respectively) - Add anchor link for Section 5 reference in 9.2 - Add #plugin-list anchor to third-party plugins handbook link - Fix GitLab issue tracker URLs to use /-/work_items for libtiff, freetype2, and bzip2 - Add pyproject.toml reference for complete optional dependencies list Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 0cbdd2e commit 6e1ccab

File tree

2 files changed

+38
-35
lines changed

2 files changed

+38
-35
lines changed

.github/INCIDENT_RESPONSE.md

Lines changed: 36 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -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
8080
a 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

9999
1. **GitHub private security advisory** — preferred channel; see [SECURITY.md](SECURITY.md)
100100
2. **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:
142141
1. Merge the fix to `main`, then cherry-pick to all affected release branches
143142
(see [RELEASING.md — Point release](../RELEASING.md)).
144143
2. 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.
146146
4. 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.
159158
4. 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

168166
1. **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
172170
2. 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:
222220
Understanding what Pillow depends on (upstream) and what depends on Pillow (downstream)
223221
is 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

265277
A vulnerability in Pillow can have wide impact. Notify or consider the blast radius of
266278
these downstream consumers when assessing severity and planning communications.
@@ -299,18 +311,7 @@ warrant proactive notification.
299311
Third-party plugins extend Pillow and are distributed separately on PyPI. Their
300312
maintainers should be notified for Critical/High issues that affect the plugin API
301313
or 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

RELEASING.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ Released as needed for security, installation or critical bug fixes.
1919
git checkout -t remotes/origin/5.2.x
2020
```
2121
* [ ] Cherry pick individual commits from `main` branch to release branch e.g. `5.2.x`, then `git push`.
22+
* [ ] If this is a security fix: amend commits to include the CVE identifier in the commit message.
2223
* [ ] Check [GitHub Actions](https://github.com/python-pillow/Pillow/actions) to confirm passing tests in release branch e.g. `5.2.x`.
2324
* [ ] In compliance with [PEP 440](https://peps.python.org/pep-0440/), update version identifier in `src/PIL/_version.py`
2425
* [ ] Run pre-release check via `make release-test`.
@@ -38,6 +39,7 @@ Released as needed for security, installation or critical bug fixes.
3839
```bash
3940
git push
4041
```
42+
* [ ] If this is a security fix: publish the [GitHub Security Advisory](https://github.com/python-pillow/Pillow/security/advisories).
4143

4244
## Embargoed release
4345

0 commit comments

Comments
 (0)