Skip to content

Commit 8ddc5b4

Browse files
Updated release procedure with new CVE workflows.
Now that the DSF is a CVE Numbering Authority (CNA), we manage our own CVE assignments.
1 parent 2504348 commit 8ddc5b4

2 files changed

Lines changed: 57 additions & 12 deletions

File tree

docs/internals/howto-release-django.txt

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,19 @@ The short version of the steps involved is:
5353

5454
There are a lot of details, so please read on.
5555

56+
.. _checklist-generator:
57+
58+
.. admonition:: Use the checklists app
59+
60+
To generate a checklist compiling the tasks described below as relevant to
61+
the specific release(s) you are issuing, use the checklists app in the
62+
`project admin <https://www.djangoproject.com/admin/checklists/>`_. This
63+
populates a lot of boilerplate you will need for announcements, CVE
64+
publication, and hashes for commit messages. By using this app for preparing
65+
security issue metadata, your peer releasers can check your entries and
66+
consult them again in the future.
67+
(`Example <https://www.djangoproject.com/checklists/release/5.2.4/>`_)
68+
5669
Prerequisites
5770
=============
5871

@@ -150,9 +163,23 @@ any time leading up to the actual release.
150163
10 (or more) days before a security release
151164
-------------------------------------------
152165

153-
#. Request the `CVE IDs <https://cveform.mitre.org/>`_ for the security
154-
issue(s) being released. One CVE ID per issue, requested with
155-
``Vendor: djangoproject`` and ``Product: django``.
166+
#. Reserve one `CVE ID <https://www.cve.org/About/Overview/>`_ per security
167+
issue as follows. (Or, if you lack CNA credentials, email
168+
``cna@djangoproject.com`` with a request.)
169+
170+
* Enable virtual environment with :pypi:`cvelib` installed.
171+
172+
* Export user information:
173+
174+
.. code-block:: shell
175+
176+
$ export CVE_USER=<user-email>@djangoproject.com CVE_ORG=DSF
177+
178+
* Reserve:
179+
180+
.. code-block:: shell
181+
182+
$ cve --interactive reserve <quantity>
156183

157184
#. Generate the relevant (private) patch(es) using ``git format-patch``, one
158185
for the ``main`` branch and one for each stable branch being patched.
@@ -162,9 +189,9 @@ A week before a security release
162189

163190
#. Send out pre-notification exactly **one week** before the security release.
164191
The template for that email and a list of the recipients are in the private
165-
``django-security`` GitHub wiki. BCC the pre-notification recipients and be
192+
``django-security`` GitHub wiki. BCC the pre-notification recipients, and be
166193
sure to include the relevant CVE IDs. Attach all the relevant patches
167-
(targeting ``main`` and the stable branches) and sign the email text with
194+
(targeting ``main`` and the stable branches), and sign the email text with
168195
the key you'll use for the release, with a command like:
169196

170197
.. code-block:: shell
@@ -185,6 +212,17 @@ A week before a security release
185212
For details of severity levels, see:
186213
https://docs.djangoproject.com/en/dev/internals/security/#how-django-discloses-security-issues
187214

215+
#. Prepare issue metadata:
216+
* Severity
217+
* Short description
218+
* Reporter
219+
* Remediator
220+
* Reported at
221+
* Confirmed at (usually date CVE reserved)
222+
* CWE Problem Type
223+
* CAPEC Impact Type
224+
* CVSS (4.0) Score & Vector
225+
188226
A few days before any release
189227
-----------------------------
190228

@@ -644,12 +682,18 @@ Now you're ready to actually put the release out there. To do this:
644682
#. Post the release announcement to the |django-announce| mailing list and the
645683
Django Forum. This should include a link to the announcement blog post.
646684

685+
#. If this is a security release, publish the CVE metadata. (The
686+
:ref:`checklist app<checklist-generator>` generates JSON for this.):
687+
688+
.. code-block:: shell
689+
690+
$ cve publish <cve-number> --cve-json-file <path-to-file>
691+
647692
#. If this is a security release, send a separate email to
648-
``oss-security@lists.openwall.com``. Provide a descriptive subject, for
649-
example, "Django" plus the issue title from the release notes (including CVE
650-
ID). The message body should include the vulnerability details, for example,
651-
the announcement blog post text. Include a link to the announcement blog
652-
post.
693+
``oss-security@lists.openwall.com``. Provide "Django" plus the CVE IDs in
694+
the subject line. The message body should include the vulnerability details,
695+
for example, the announcement blog post text. Include a link to the
696+
announcement blog post.
653697

654698
Post-release
655699
============
@@ -708,8 +752,8 @@ You're almost done! All that's left to do now is:
708752

709753
.. code-block:: shell
710754

711-
git checkout stable/A.B.x
712-
git checkout -b update-translations-catalog-A.B.x
755+
$ git checkout stable/A.B.x
756+
$ git checkout -b update-translations-catalog-A.B.x
713757

714758
#. Ensure that the release's dedicated virtual environment is enabled and
715759
run the following:

docs/spelling_wordlist

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,7 @@ reindent
421421
releaser
422422
releasers
423423
reloader
424+
remediator
424425
renderer
425426
renderers
426427
repo

0 commit comments

Comments
 (0)