|
| 1 | +PEP: 811 |
| 2 | +Title: Defining Python Security Response Team membership and responsibilities |
| 3 | +Author: Seth Michael Larson < [email protected]> |
| 4 | +Sponsor: Gregory P. Smith < [email protected]> |
| 5 | +Discussions-To: Pending |
| 6 | +Status: Draft |
| 7 | +Type: Process |
| 8 | +Topic: Governance |
| 9 | +Created: 22-Oct-2025 |
| 10 | +Post-History: |
| 11 | + `06-Oct-2025 <https://discuss.python.org/t/104199>`__, |
| 12 | + |
| 13 | +Abstract |
| 14 | +======== |
| 15 | + |
| 16 | +This PEP proposes formalizing the membership and responsibilities policies of |
| 17 | +the Python Security Response Team (PSRT). The PSRT is a "highly trusted cabal of |
| 18 | +Python developers" which handles security vulnerability disclosures to the |
| 19 | +`` [email protected]`` mailing list. |
| 20 | + |
| 21 | +The PSRT receives access to known vulnerabilities affecting CPython and pip before |
| 22 | +they're disclosed to the public. This information is sensitive and if leaked |
| 23 | +could harm Python users through zero-day attacks, where an attacker has access |
| 24 | +to exploitable vulnerabilities before defenders are notified of fixes and given |
| 25 | +a chance to upgrade. |
| 26 | + |
| 27 | +However, the PSRT often needs help from core developers in particular subject |
| 28 | +areas to remediate vulnerabilities. This PEP proposes defined membership and |
| 29 | +obligations for the PSRT, including a new "Coordinator" role, and proposes |
| 30 | +adopting `GitHub Security Advisories <https://docs.github.com/en/code-security/security-advisories>`_ |
| 31 | +(GHSAs) as the canonical reporting, tracking, and collaboration method between |
| 32 | +the PSRT, reporters, and core developers for vulnerabilities. |
| 33 | + |
| 34 | +Motivation |
| 35 | +========== |
| 36 | + |
| 37 | +Limit access to pre-disclosure vulnerability reports |
| 38 | +---------------------------------------------------- |
| 39 | + |
| 40 | +Vulnerability report information prior to disclosure is sensitive, |
| 41 | +Python users can be substantially harmed if vulnerabilities are exploited. |
| 42 | +For this reason it's critical to limit access to information to only people |
| 43 | +involved in the remediation of the vulnerability at hand. |
| 44 | + |
| 45 | +The historical approach to collaboration on patch development was to manually |
| 46 | +add GitHub users to a private ``python/psrt`` repository |
| 47 | +which is a mirror of the ``python/cpython`` repository. |
| 48 | +This approach didn't allow filtering particular collaborators for specific |
| 49 | +vulnerabilities, meaning all collaborators had access to all reports and patches. |
| 50 | + |
| 51 | +This manual process discouraged bringing on core developers outside |
| 52 | +the PSRT to collaborate, which can make patch development more difficult. |
| 53 | +This limitation also meant vulnerability reporters weren't able to collaborate on patches, |
| 54 | +either. |
| 55 | + |
| 56 | +Onboarding new contributors to the PSRT |
| 57 | +--------------------------------------- |
| 58 | + |
| 59 | +Unlike most open-source contributions, the work of the PSRT doesn't happen |
| 60 | +in the open. Instead, most work occurs privately by a trusted group to limit |
| 61 | +access to undisclosed |
| 62 | +vulnerability reports. Given the sensitive nature of this work, it appears opaque from the outside, and |
| 63 | +it's difficult to get started as a newcomer and to understand the |
| 64 | +expectations of the group. |
| 65 | + |
| 66 | +In practice this has meant that relatively few new members join the PSRT, |
| 67 | +which over time could negatively impact the group's ability to triage reports |
| 68 | +and develop remediations with the core team. |
| 69 | + |
| 70 | +Lack of defined ownership for vulnerability reports |
| 71 | +--------------------------------------------------- |
| 72 | + |
| 73 | +Currently PSRT reports don't have a clear "owner" of who is ensuring the |
| 74 | +incident or report continues moving towards a resolved state. This is especially |
| 75 | +an issue in the context of a mailing list, where it's difficult to know whether |
| 76 | +an issue is being responded to by someone else already or whether your |
| 77 | +determination on a report is the same as others within the PSRT. |
| 78 | + |
| 79 | +Ideally, similar to issues, pull requests, and PEPs, one defined person |
| 80 | +would be responsible for moving the mitigation task forward to completion. |
| 81 | +This allows that person to |
| 82 | +contribute and make decisions on the task without fear of "stepping on toes". |
| 83 | + |
| 84 | +Aligning with vulnerability disclosure timelines |
| 85 | +------------------------------------------------ |
| 86 | + |
| 87 | +Vulnerability reporting best practices `recommend a 90 day |
| 88 | +timeline`_ between the initial disclosure and when a report is made public |
| 89 | +to balance the needs of users, the project, and the reporter. |
| 90 | +Many vulnerability reporting organizations already use this timeline |
| 91 | +and will disclose vulnerabilities publicly even if the project doesn't |
| 92 | +create their own mitigation. |
| 93 | + |
| 94 | +To avoid reports getting stuck, forgotten, or published publicly without a |
| 95 | +remediation this PEP recommends aligning to the 90 days between initial |
| 96 | +disclosure and publishing an advisory. |
| 97 | + |
| 98 | +.. _recommend a 90 day timeline: https://github.com/ossf/oss-vulnerability-guide/blob/main/maintainer-guide.md |
| 99 | + |
| 100 | +Rationale |
| 101 | +========= |
| 102 | + |
| 103 | +Steering Council and activity determine membership |
| 104 | +-------------------------------------------------- |
| 105 | + |
| 106 | +The PSRT has no mechanism for deciding who to admit to or remove from the PSRT. |
| 107 | +Combined with the security-sensitive nature of the work it can be difficult to |
| 108 | +decide who should be admitted, but there must be a system responsible for |
| 109 | +evaluating PSRT membership. |
| 110 | + |
| 111 | +This PEP proposes limiting PSRT membership only to active coordinators |
| 112 | +of security vulnerabilities that are core developers or triagers, |
| 113 | +members involved in oversight (Steering Council), |
| 114 | +and members who need information about security releases (Release Managers). |
| 115 | + |
| 116 | +Activity is recommended as the metric for membership to avoid adding additional |
| 117 | +risk without any additional benefit to projects by having reports being |
| 118 | +triaged and coordinated. |
| 119 | + |
| 120 | +Using GitHub Security Advisories (GHSA) |
| 121 | +--------------------------------------- |
| 122 | + |
| 123 | +This PEP proposes adopting GitHub Security Advisories as the |
| 124 | +system to accept vulnerability reports due to its tight integration |
| 125 | +with services already in use by relevant projects. |
| 126 | + |
| 127 | +CPython and pip already use GitHub for source control, issues, pull requests, |
| 128 | +continuous integration (CI), and as a part of the release process. |
| 129 | +GHSA supports the following features which are desirable for a |
| 130 | +vulnerability reporting and management platform: |
| 131 | + |
| 132 | +* Managing GitHub teams and accounts as "collaborators" per-report |
| 133 | + rather than per-project or globally. |
| 134 | +* Managing non-PSRT collaborators per-report using GitHub accounts. |
| 135 | +* "Pull request"-like user interface for developing remediations. |
| 136 | +* Tracking reporter, coordinator, credits, submission time, CVE ID, and severity |
| 137 | + for each report within the UI. |
| 138 | +* Programmatic API for integrating with other services (like CVE) and bots. |
| 139 | + |
| 140 | +However, features that are missing from GHSA are: |
| 141 | + |
| 142 | +* Ability to privately run vulnerability remediation branches on CI. |
| 143 | +* Multiple API endpoints are missing for the GHSA, such as retrieving and |
| 144 | + creating comments on a GHSA report. |
| 145 | + |
| 146 | +These missing features have been reported to GitHub and none are blocking |
| 147 | +the adoption of GHSA. Some work will need to be done to work around the |
| 148 | +lack of a complete API for the GHSA feature. |
| 149 | + |
| 150 | +Specification |
| 151 | +============= |
| 152 | + |
| 153 | +PSRT Membership Policy |
| 154 | +---------------------- |
| 155 | + |
| 156 | +The Python Steering Council may add or remove members and admins of the PSRT. |
| 157 | +New PSRT members must be core team members, triagers, or PSF staff, |
| 158 | +and must be `proposed to and accepted`_ by the Steering Council. |
| 159 | + |
| 160 | +Once the Steering Council votes on a membership change to the PSRT then |
| 161 | +PSRT admins will enact the change. |
| 162 | +A list of PSRT members will be published publicly and kept up-to-date by PSRT |
| 163 | +admins. |
| 164 | + |
| 165 | +Once per year the Steering Council will receive a report of inactive members of |
| 166 | +the PSRT with the recommendation to remove the inactive users from the PSRT. |
| 167 | +"Inactive" is defined here as a member who hasn't coordinated or commented on a |
| 168 | +vulnerability report in the past year since the last report was generated. |
| 169 | + |
| 170 | +Members of the PSRT who are a Release Manager or Steering Council |
| 171 | +member may remain in the PSRT regardless of inactivity in vulnerability reports. |
| 172 | + |
| 173 | +This PEP proposes removing all members from the PSRT who haven't been active |
| 174 | +in the past year and without an exemption for minimum activity (Steering Council, |
| 175 | +Release Managers) prior to publication of this PEP. At the time of writing, this |
| 176 | +would reduce the PSRT membership size to ~15 members from ~30. |
| 177 | + |
| 178 | +This PEP also proposes not removing members of the PSRT who are active but |
| 179 | +not yet core team members or triagers, allowing them to be "legacied" in |
| 180 | +to the new PSRT Membership Policy. |
| 181 | + |
| 182 | +.. _proposed to and accepted: https://github.com/python/steering-council/ |
| 183 | + |
| 184 | +PSRT Admins |
| 185 | +~~~~~~~~~~~ |
| 186 | + |
| 187 | +At least two PSRT members shall serve as admins, determined by the Steering |
| 188 | +Council. This PEP proposes maintaining the existing set of PSRT admins: |
| 189 | + |
| 190 | + |
| 191 | + |
| 192 | + |
| 193 | +* Barry Warsaw < [email protected]> |
| 194 | + |
| 195 | +Admins have the additional responsibilities of managing membership and |
| 196 | +triaging reports to the PSRT mailing list (`` [email protected]``). |
| 197 | + |
| 198 | +Responsibilities of PSRT members |
| 199 | +-------------------------------- |
| 200 | + |
| 201 | +The responsibilities of PSRT members will be documented publicly in the |
| 202 | +`Python Developer's Guide`_, so prospective members know what to expect before |
| 203 | +applying to join the PSRT. These responsibilities include: |
| 204 | + |
| 205 | +* Being knowledgeable about typical software vulnerability report handling |
| 206 | + processes, such as CVE IDs, patches, coordinated disclosure, embargoes, etc. |
| 207 | +* Not sharing or acting on embargoed information about the reported vulnerability. |
| 208 | + Examples of disallowed behavior include sharing information with colleagues |
| 209 | + or publicly deploying unpublished mitigations or patches ahead of the advisory |
| 210 | + publication date. |
| 211 | +* Acting as a "Coordinator" of vulnerability reports that are submitted |
| 212 | + to projects. A coordinator's responsibility is to move a report through the PSRT |
| 213 | + process to a "finished" state, either rejected or as a published advisory and |
| 214 | + mitigation, within the industry standard timeline of 90 days. |
| 215 | +* As a Coordinator, involving relevant core team members or triagers where |
| 216 | + necessary to make a determination whether a report is a vulnerability and |
| 217 | + developing a patch. Coordinators are **encouraged** to involve members of |
| 218 | + the core team to make the best decision for each report rather than working |
| 219 | + in isolation. |
| 220 | +* As a Coordinator, calculating the severity using CVSS and authoring advisories |
| 221 | + to be shared on ` [email protected]`_. These advisories are used |
| 222 | + for CVE records by the PSF CVE Numbering Authority. |
| 223 | +* Coordinators that can no longer move a report forwards for any reason must |
| 224 | + delegate their Coordinator role to someone else in the PSRT. |
| 225 | +* PSRT members that are admins will have additional responsibilities. |
| 226 | + |
| 227 | +.. _ [email protected]: https://mail.python.org/archives/list/[email protected]/ |
| 228 | +.. _Python Developer's Guide: https://devguide.python.org/developer-workflow/psrt/ |
| 229 | + |
| 230 | +Responsibilities of PSRT Admins |
| 231 | +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 232 | + |
| 233 | +PSRT members who are designated as admins by the Steering Council have the |
| 234 | +following additional responsibilities: |
| 235 | + |
| 236 | +* Managing the GitHub team, mailing list, Discord channel, and other |
| 237 | + PSRT venues to ensure they are synchronized with the canonical list of |
| 238 | + PSRT members determined by the Steering Council. |
| 239 | +* On a yearly basis, providing the Steering Council with a report including |
| 240 | + a list of inactive PSRT members. |
| 241 | + |
| 242 | +GitHub Security Advisories and GitHub Team |
| 243 | +------------------------------------------ |
| 244 | + |
| 245 | +This PEP proposes standardizing on the GitHub team ``python/psrt`` as the |
| 246 | +canonical list of PSRT members and aligning the mailing list and Discord to match |
| 247 | +instead of maintaining each separately. Process documentation will be created to |
| 248 | +ensure changes to membership are consistent across these three channels as |
| 249 | +members are added and removed. |
| 250 | + |
| 251 | +This PEP proposes adopting GitHub Security Advisories as the system where |
| 252 | +vulnerability reports per project are handled. GHSA will be enabled for |
| 253 | +relevant repositories and linked to directly from the top-level PSRT |
| 254 | +page on python.org and project security policies. |
| 255 | + |
| 256 | +Along with responsibilities the PSRT process for handling vulnerability |
| 257 | +reports using GHSA, such as how to assign a Coordinator and calculating |
| 258 | +severity, will be added to the `Python Developer's Guide`_. |
| 259 | + |
| 260 | +Adopting GHSAs will coincide with disabling the ``python/psrt`` private |
| 261 | +repository (which shares a slug with the GitHub team) and syncing machinery, |
| 262 | +as this will no longer be needed for patch development. |
| 263 | + |
| 264 | +Continue using [email protected] mailing list |
| 265 | +----------------------------------------------- |
| 266 | + |
| 267 | +The `` [email protected]`` mailing list covers more than CPython and pip, |
| 268 | +like security reports for the ``python.org`` or related websites |
| 269 | +and as a general hotline for Python ecosystem-related security issues. |
| 270 | +Maintaining the mailing list can also be used as a "fall-back" in case |
| 271 | +the vulnerability reporting platform changes in the future. |
| 272 | + |
| 273 | +For this reason, the mailing list and PSRT GPG key will continue to function |
| 274 | +and be monitored, but reporters will be directed to individual project GitHub |
| 275 | +Security Advisory forms for submitting vulnerability reports. |
| 276 | + |
| 277 | +Rejected Ideas |
| 278 | +============== |
| 279 | + |
| 280 | +Should inactive members be more aggressively pruned? |
| 281 | +---------------------------------------------------- |
| 282 | + |
| 283 | +The PSRT only triages a double-digit number of reports every year, meaning there |
| 284 | +aren't an abundance of opportunities to "prove" activity on the scale of months. |
| 285 | +For this reason along with aligning with existing yearly schedules for the |
| 286 | +Steering Council, a yearly pruning was recommended. |
| 287 | + |
| 288 | +Copyright |
| 289 | +========= |
| 290 | + |
| 291 | +This document is placed in the public domain or under the |
| 292 | +CC0-1.0-Universal license, whichever is more permissive. |
0 commit comments