已发布的安全版本
今天,Django 团队发布了多个版本——Django 1.4.18、Django 1.6.10 和 Django 1.7.3——作为 我们的安全流程 的一部分。这些版本现在已在 PyPI 和 我们的下载页面 上提供。
这些版本解决了几个安全问题。我们鼓励所有 Django 用户尽快升级。
问题:通过下划线/短横线混淆进行 WSGI 头部欺骗
当 HTTP 头部放入 WSGI 环境中时,它们会通过转换为大写、将所有短横线转换为下划线以及在前面添加 HTTP_ 来进行规范化。例如,头部X-Auth-User将变为HTTP_X_AUTH_USER在 WSGI 环境中(因此也在 Django 的request.META字典中)。
不幸的是,这意味着 WSGI 环境无法区分包含短横线和包含下划线的头部X-Auth-User和X-Auth_User都将变为HTTP_X_AUTH_USER。这意味着如果头部以安全敏感的方式使用(例如,从前端代理传递身份验证信息),即使代理仔细删除了任何传入的X-Auth-User值,攻击者也可能能够提供一个X-Auth_User头部(带下划线)并绕过此保护。
为了防止此类攻击,Nginx 和 Apache 2.4+ 默认情况下会从传入请求中删除所有包含下划线的头部。Django 的内置开发服务器现在也执行相同的操作。Django 的开发服务器不建议用于生产环境,但与常用生产服务器的行为相匹配可减少部署期间行为更改的范围。
此问题已分配 CVE 标识符 CVE-2015-0219。
感谢 Jedediah Smith 报告此问题。
问题:缓解可能通过用户提供的重定向 URL 发生的 XSS 攻击
Django 在某些情况下依赖于用户输入(例如django.contrib.auth.views.login()和 i18n)将用户重定向到“成功”URL。这些重定向的安全检查(即django.util.http.is_safe_url()) 未对测试 URL 上的开头空格进行删除,因此将类似于\njavascript:...的 URL 视为安全。如果开发人员依赖于is_safe_url()提供安全的重定向目标并将此类 URL 放入链接中,他们可能会遭受 XSS 攻击。此错误不会影响当前的 Django,因为我们仅将此 URL 放入Location响应头部中,并且浏览器似乎忽略了那里的 JavaScript。
此问题已分配 CVE 标识符 CVE-2015-0220。
感谢 Mikko Ohtamaa 报告此问题。
问题:针对django.views.static.serve
的拒绝服务攻击在较旧版本的 Django 中,django.views.static.serve()
视图一次读取一行它提供的文件。因此,一个没有换行符的大文件将导致内存使用量等于该文件的大小。攻击者可以利用这一点并通过同时请求许多大文件来发起拒绝服务攻击。此视图现在以块的形式读取文件以防止过大的内存使用量。
但是,请注意,此视图始终带有警告,即它未针对生产环境进行加固,并且仅应作为开发辅助工具使用。如果您尚未这样做,现在可能是审计您的项目并在生产环境中使用真正的前端 Web 服务器提供文件的最佳时机。
此问题已分配 CVE 标识符 CVE-2015-0221。
感谢 Alex Gaynor 报告此问题。问题:使用
ModelMultipleChoiceField问题:使用和的数据库拒绝服务给定一个使用问题:使用show_hidden_initial=True
(非文档化的 API)的表单,用户可以通过为字段数据提交重复值来导致数量过多的 SQL 查询。中的验证逻辑
现在对提交的值进行重复数据删除以解决此问题。
此问题已分配 CVE 标识符 CVE-2015-0222。
- 感谢 Keryn Knight 报告此问题。受影响的版本Django 主开发分支(当前处于预 Alpha 状态)(除了
- serve()
- 拒绝服务问题)
- Django 1.7问题:使用Django 1.6
Django 1.4 [长期支持](除了
问题)
根据我们的 受支持版本策略,Django 1.5 不再接收安全更新。
解决方案
- 已将补丁应用于 Django 的主开发分支以及 1.4、1.6 和 1.7 发布分支,这些补丁解决了上述问题。补丁可从以下更改集中直接获取
- 在开发主分支上
- master 头部补丁
- master is_safe_url() 补丁
master serve() 补丁
1.7 serve() 补丁
1.6 serve() 补丁
1.4 is_safe_url() 补丁
- 1.4 serve() 补丁
- 已发布以下新版本
- Django 1.7.3 (下载 Django 1.7.3 | 1.7.3 校验和)
Django 1.6.10 (下载 Django 1.6.10 | 1.6.10 校验和)
Django 1.4.18 (下载 Django 1.4.18 | 1.4.18 校验和)
此版本使用的 PGP 密钥 ID 为 Tim Graham:1E8ABDC773EDE252。关于安全报告的常规说明与往常一样,我们要求通过私人电子邮件将潜在的安全问题报告给