Django 发布安全更新:3.0.1、2.2.9 和 1.11.27
根据我们的安全发布策略,Django 团队发布了Django 3.0.1、Django 2.2.9 和 Django 1.11.27。这些版本解决了下面详述的安全问题。我们鼓励所有 Django 用户尽快升级。
这些版本也发布在我们正常的错误修复/发布计划之外,并且没有通常的一周预通知期。当 Django 安全团队意识到此安全问题时,其机制已为公众所知,因此判断最好立即发布 Django 的新版本。
CVE-2019-19844:通过密码重置表单进行潜在帐户劫持
Django 的密码重置表单使用不区分大小写的查询来检索与请求密码重置的电子邮件地址匹配的帐户。因为这通常涉及显式或隐式的大小写转换,所以知道与用户帐户关联的电子邮件地址的攻击者可以创建一个与该帐户关联的地址不同的电子邮件地址,但是由于 Unicode 大小写转换的行为,在大小写转换后不再不同,或者在给定数据库大小写转换或排序行为的情况下将进行其他比较。在这种情况下,攻击者可以接收用户帐户的有效密码重置令牌。
为了解决这个问题,在 Django 中进行了两处更改
- 从数据库检索潜在匹配帐户列表后,Django 的密码重置功能现在还使用 Python 检查电子邮件地址的等效性,使用 Unicode 技术报告 36,第 2.11.2(B)(2) 节 中推荐的标识符比较过程。
- 生成密码重置电子邮件时,Django 现在会发送到从数据库检索到的电子邮件地址,而不是密码重置请求表单中提交的电子邮件地址。
Simon Charette 将此问题提请 Django 安全团队注意,他在阅读影响 GitHub 的类似问题的公开披露后意识到这个问题。
受影响的支持版本
- Django 主分支
- Django 3.0
- Django 2.2
- Django 1.11
解决方案
已将解决此问题的补丁应用于 Django 的主分支和 3.0、2.2 和 1.11 发布分支。补丁可从以下变更集中获取
已发布以下版本
- Django 3.0.1 (下载 Django 3.0.1 | 3.0.1 校验和)
- Django 2.2.9 (下载 Django 2.2.9 | 2.2.9 校验和)
- Django 1.11.27 (下载 Django 1.11.27 | 1.11.27 校验和)
这些版本使用的 PGP 密钥 ID 为 Mariusz Felisiak:2EF56372BA48CD1B。
关于安全报告的常规说明
与以往一样,我们请求您通过私人电子邮件向security@djangoproject.com报告潜在的安全问题,而不是通过 Django 的 Trac 实例或 django-developers 列表报告。请参阅我们的安全策略以获取更多信息。
如上所述,由于此问题的根本原因已为公众所知,因此这些版本发布时没有通常的预通知流程。