You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .github/INCIDENT_RESPONSE.md
+57-18Lines changed: 57 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -61,7 +61,21 @@ This plan covers:
61
61
62
62
---
63
63
64
-
## 3. Roles
64
+
## 3. Definitions
65
+
66
+
| Term | Meaning |
67
+
|---|---|
68
+
|**Incident**| Any event that compromises or threatens the confidentiality, integrity, or availability of Pillow's code, release artifacts, or infrastructure. |
69
+
|**Vulnerability**| A security flaw in Pillow or a bundled library that can be exploited by a crafted image or API call. |
70
+
|**Incident Lead**| The maintainer who owns coordination of the response from triage to closure. |
71
+
|**Embargo**| A period during which fix details are kept private to allow coordinated patching before public disclosure. |
72
+
|**Yank**| A PyPI action that keeps a release downloadable by pinned users but removes it from default `pip install` resolution. |
73
+
|**CVE**| Common Vulnerabilities and Exposures — a public identifier assigned to a specific vulnerability. |
74
+
|**CNA**| CVE Numbering Authority — GitHub is a CNA and can assign CVEs directly through the advisory workflow. |
75
+
76
+
---
77
+
78
+
## 4. Roles
65
79
66
80
| Role | Responsibility |
67
81
|---|---|
@@ -76,7 +90,7 @@ explicitly at the start of each incident to avoid gaps.
76
90
77
91
---
78
92
79
-
## 4. Severity Classification
93
+
## 5. Severity Classification
80
94
81
95
Use the [CVSS v3.1](https://www.first.org/cvss/v3.1/specification-document) base score as
82
96
a guide, mapped to the following levels:
@@ -90,9 +104,11 @@ a guide, mapped to the following levels:
90
104
91
105
Supply-chain and CI/CD incidents are always treated as **Critical** regardless of CVSS.
92
106
107
+
> **Note:** These are good-faith targets for a small volunteer maintainer team, not contractual SLAs. Public safety and transparency will always be prioritised, even when timing varies.
108
+
93
109
---
94
110
95
-
## 5. Detection Sources
111
+
## 6. Detection Sources
96
112
97
113
Vulnerabilities and incidents may be reported or discovered through:
98
114
@@ -106,9 +122,9 @@ Vulnerabilities and incidents may be reported or discovered through:
106
122
107
123
---
108
124
109
-
## 6. Response Process
125
+
## 7. Response Process
110
126
111
-
### 6.1 Triage (all severities)
127
+
### 7.1 Triage (all severities)
112
128
113
129
1.**Acknowledge receipt** to the reporter within **72 hours** using the template in
114
130
[Appendix A](#appendix-a-communication-templates). Ask the reporter:
@@ -130,7 +146,7 @@ Vulnerabilities and incidents may be reported or discovered through:
130
146
- A legal concern arises (e.g. GDPR-reportable data exposure) → contact the project's legal/fiscal sponsor
131
147
- The Incident Lead is unreachable for > 24 hours on a Critical issue → any other maintainer may assume the role
132
148
133
-
### 6.2 Fix Development
149
+
### 7.2 Fix Development
134
150
135
151
1. Develop the fix in a **private fork** or directly in the private security advisory
136
152
workspace on GitHub. Do **not** push to a public branch before the embargo lifts.
@@ -141,7 +157,7 @@ Vulnerabilities and incidents may be reported or discovered through:
141
157
```
142
158
4. Review the patch with at least one other maintainer.
143
159
144
-
### 6.3 Standard (Non-Embargoed) Release
160
+
### 7.3 Standard (Non-Embargoed) Release
145
161
146
162
For Medium and Low severity, or when no distro pre-notification is needed:
147
163
@@ -152,7 +168,7 @@ For Medium and Low severity, or when no distro pre-notification is needed:
152
168
4. Publish the GitHub Security Advisory (this simultaneously publishes the CVE).
153
169
5. Announce on [Mastodon](https://fosstodon.org/@pillow).
154
170
155
-
### 6.4 Embargoed Release
171
+
### 7.4 Embargoed Release
156
172
157
173
For Critical and High severity where distro pre-notification improves user safety:
158
174
@@ -169,7 +185,7 @@ For Critical and High severity where distro pre-notification improves user safet
169
185
- Publish the GitHub Security Advisory.
170
186
- Announce on [Mastodon](https://fosstodon.org/@pillow).
171
187
172
-
### 6.5 Rollback Procedures
188
+
### 7.5 Rollback Procedures
173
189
174
190
If a security patch introduces a critical regression after release:
175
191
@@ -182,10 +198,10 @@ If a security patch introduces a critical regression after release:
182
198
that the release has been yanked.
183
199
3. If the previous (vulnerable) version was also yanked, **un-yank it temporarily** so users
184
200
have a functional fallback while the corrected release is prepared.
185
-
4. Prepare a corrected point release (incrementing the patch version), repeating §6.2–§6.3.
201
+
4. Prepare a corrected point release (incrementing the patch version), repeating §7.2–§7.3.
186
202
5. Document the regression in the post-incident review (§9).
187
203
188
-
### 6.6 Supply-Chain / Infrastructure Compromise
204
+
### 7.6 Supply-Chain / Infrastructure Compromise
189
205
190
206
1.**Immediately** revoke any potentially compromised credentials:
191
207
- PyPI API tokens (regenerate and update in GitHub secrets)
@@ -200,9 +216,19 @@ If a security patch introduces a critical regression after release:
200
216
4. Notify GitHub Security if repository access or Actions secrets are involved.
201
217
5. Issue a public advisory describing the scope and any user action required.
202
218
219
+
### 7.7 Recovery
220
+
221
+
After the fix is released and the advisory is public:
222
+
223
+
1. Verify that the patched wheels are live on PyPI and passing CI across all supported platforms.
224
+
2. Confirm any yanked releases are handled correctly (re-yank if un-yanked as a fallback during rollback).
225
+
3. Resume normal development operations on `main`.
226
+
4. Monitor the GitHub issue tracker and Mastodon for user reports of residual problems for at least **72 hours** post-release.
227
+
5. Close the private GitHub Security Advisory once recovery is confirmed.
228
+
203
229
---
204
230
205
-
## 7. Communication
231
+
## 8. Communication
206
232
207
233
### Internal (during embargo)
208
234
- Use the **private GitHub Security Advisory** thread for all coordination.
@@ -228,7 +254,7 @@ If a security patch introduces a critical regression after release:
228
254
229
255
---
230
256
231
-
## 8. Post-Incident Review
257
+
## 9. Post-Incident Review
232
258
233
259
Within **2 weeks** of a Critical or High severity fix being released:
234
260
@@ -252,12 +278,12 @@ Within **2 weeks** of a Critical or High severity fix being released:
252
278
253
279
---
254
280
255
-
## 9. Dependency Map
281
+
## 10. Dependency Map
256
282
257
283
Understanding what Pillow depends on (upstream) and what depends on Pillow (downstream)
258
284
is essential for scoping impact and coordinating notifications during an incident.
259
285
260
-
### 9.1 Upstream Dependencies
286
+
### 10.1 Upstream Dependencies
261
287
262
288
#### Bundled C libraries (shipped in official wheels)
263
289
@@ -294,7 +320,7 @@ require a Pillow point release even if Pillow's own code is unchanged.
0 commit comments