已发布的安全版本
今天,Django 团队发布了多个版本——Django 1.4.14、Django 1.5.9、Django 1.6.6 和 Django 1.7 发布候选版本 3——作为 我们的安全流程 的一部分。这些版本现在可在 PyPI 和 我们的下载页面 上获得。
这些版本解决了以下问题:reverse()生成外部 URL;涉及文件上传的拒绝服务;远程用户中间件中的潜在会话劫持问题;以及管理界面中的数据泄露。我们鼓励所有 Django 用户尽快升级。
问题:reverse() 可以生成指向其他主机的 URL (CVE-2014-0480)
Django 包含辅助函数django.core.urlresolvers.reverse,通常用于根据对视图函数或 URL 模式名称的引用生成 URL。但是,当遇到以两个正斜杠字符开头的输入时 (//), reverse()可能会生成指向其他主机的方案相对 URL,允许了解如何不安全使用reverse()(例如,在最终用户可以控制重定向目标的情况下,以常见的示例为例)的攻击者生成指向其选择站点的链接,从而导致网络钓鱼和其他攻击。
为了解决此问题,URL 反向现在确保没有 URL 以两个斜杠开头 (//),将第二个斜杠替换为其 URL 编码的对应项 (%2F)。这种方法确保语义保持不变,同时使 URL 相对于域而不是方案。
感谢 Florian Apolloner 报告此问题。
问题:文件上传拒绝服务 (CVE-2014-0481)
在默认配置中,当 Django 的文件上传处理系统遇到一个文件,该文件与现有文件具有相同的磁盘路径和名称时,它会尝试通过在(存储在磁盘上的)文件名末尾附加下划线和整数来生成一个新的唯一文件名,并递增整数(即,_1, _2等),直到它生成了一个与任何现有文件都不冲突的名称。
了解这一点的攻击者可以通过上传许多共享文件名的微小文件来利用文件名的顺序行为;Django 在处理它们时,会生成越来越多的os.stat()调用,因为它试图生成一个唯一的文件名。因此,即使是相对较少数量的此类上传也会显着降低性能。
为了解决此问题,Django 的文件上传系统将不再使用顺序整数名称来避免磁盘上文件名的冲突;相反,将附加一个简短的随机字母数字字符串,从而无法可靠地生成许多重复冲突的文件名。
感谢 David Wilson 报告此问题。
问题:RemoteUserMiddleware 会话劫持 (CVE-2014-0482)
Django 提供了一个中间件——django.contrib.auth.middleware.RemoteUserMiddleware——和一个身份验证后端,django.contrib.auth.backends.RemoteUserBackend,它们使用REMOTE_USER标头进行身份验证。
在某些情况下,如果对REMOTE_USER标头进行了更改,但没有相应的注销/登录操作,则使用此中间件和后端可能会导致一个用户接收另一个用户的会话。
为了解决此问题,中间件现在将确保对REMOTE_USER的更改,如果没有显式注销,将在接受新的REMOTE_USER.
之前强制执行注销和后续登录。
感谢 David Greisen 报告此问题。
问题:通过管理界面中的查询字符串操作导致数据泄露 (CVE-2014-0483)Django 的管理界面,django.contrib.admin
,提供了一个功能,可以在弹出窗口中显示相关对象以供选择。此机制依赖于将值放置在 URL 和查询字符串中,以指定要显示的相关模型以及实现关系的字段。此机制确实在整个模型类的级别执行权限检查。
但是,此机制没有验证指定的字段是否实际上表示模型之间的关系。因此,具有管理界面访问权限并且充分了解模型结构和相应 URL 的用户可以构建弹出视图,这些视图将显示非关系字段的值,包括应用程序开发人员不打算以这种方式公开的字段。
为了解决此问题,管理界面现在除了正常的权限检查外,还将验证指定的字段是否确实表示与已在管理界面中注册的模型的关系,如果任一条件不为真,则将引发异常。
感谢 Collin Anderson 报告此问题。
- 受影响的版本
- Django 主开发分支(当前处于预 Alpha 状态)
- Django 1.7(当前处于发布候选状态)
- Django 1.6
- Django 1.5
Django 1.4
解决方案
已将补丁应用于 Django 的主开发分支以及 1.4、1.5、1.6 和 1.7 发布分支,这些补丁解决了上述问题。可以从以下更改集中直接获取补丁
主分支管理补丁
1.7 管理补丁
1.6 管理补丁
1.5 管理补丁
1.4 管理补丁
- 已发布以下新版本
- Django 1.7 发布候选版本 3 (下载 Django 1.7c3 | 1.7c3 校验和)
- Django 1.6.6 (下载 Django 1.6.6 | 1.6.6 校验和)
- Django 1.5.9 (下载 Django 1.5.9 | 1.5.9 校验和)
Django 1.4.14 (下载 Django 1.4.14 | 1.4.14 校验和)
关于安全报告的常规说明与往常一样,我们要求通过私人电子邮件将潜在的安全问题报告给security@djangoproject.com