发布的安全版本
今天,Django 团队发布了多个版本——Django 1.4.6、Django 1.5.2 和 Django 1.6 beta 2——作为我们安全流程的一部分。这些版本现已在PyPI 和我们的下载页面上提供。
这些版本解决了两个跨站脚本 (XSS) 漏洞:一个是在 Django 管理界面使用的部件中,另一个是在用于验证重定向的实用程序函数中,通常在登录或注销后使用。
虽然这些问题带来的风险有限,可能不会影响所有 Django 用户,但我们鼓励所有用户评估自身风险并在可能的情况下进行升级。
有关更多详细信息,请继续阅读。
问题:管理界面中的跨站脚本 (XSS)
Django 管理应用程序,django.contrib.admin,为受信任用户提供 CRUD(创建、检索、更新和删除)操作的功能,包括自动和自定义数据操作界面的工具。
在显示 a 的值时URLField——用于存储 URL 的模型字段类型——此界面将此类字段的值视为安全,因此未能正确处理潜在的危险值。已向 Django 项目提供了一个概念验证应用程序,展示了如何利用此漏洞在管理界面中执行 XSS。
在正常的 Django 部署中,这只会影响管理界面,因为错误的处理仅发生在django.contrib.admin中的表单部件代码中。但是,如果这些应用程序使用管理界面提供的表单部件,则其他应用程序也可能受到影响。
为了解决此问题,相关的部件——django.contrib.admin.widgets.AdminURLFieldWidget——已得到修正,使其以与任何其他潜在用户提供的值相同的方式处理其值;换句话说,它将被视为不安全,并受 Django 的(默认启用)输出转义的影响。
感谢 Łukasz Langa 向我们报告此问题。
问题:可能通过is_safe_url
执行 XSS登录视图django.contrib.auth.views,它接受这样的参数来确定在成功登录后将用户发送到哪里。
一个实用程序函数——django.utils.http.is_safe_url()——用于验证此 URL 是否位于当前主机上(通过完全限定或相对 URL),以避免潜在的恶意构造查询字符串导致的危险重定向。
该is_safe_url()函数在 HTTP 和 HTTPS URL 中按预期工作,但由于其解析 URL 的方式,它将允许重定向到其他方案,例如javascript。虽然 Django 项目不知道有任何通过此机制执行跨站脚本攻击的已知方法,但这种可能性足以引发安全响应。
为了解决此问题,is_safe_url()函数已修改为正确识别并拒绝指定除 HTTP 或 HTTPS 之外的方案的 URL。
感谢 Nick Bruun 向我们报告此问题。
受影响的版本
该URLFieldXSS 问题影响以下版本的 Django
- Django 1.5
- Django 1.6(当前处于 Beta 阶段)
- Django 主开发分支
该is_safe_url()问题影响以下版本的 Django
- Django 1.4
- Django 1.5
- Django 1.6(当前处于 Beta 阶段)
- Django 主开发分支
解决方案
已将补丁应用于 Django 的主开发分支以及 1.6、1.5 和 1.4 发布分支,这些补丁解决了上述问题。补丁可从以下更改集中直接获取
在开发主分支上
在 Django 1.6 发布分支上
在 Django 1.5 发布分支上
在 Django 1.4 发布分支上
已发布以下新版本
- Django 1.6 beta 2(下载 Django 1.6b2 | 1.6b2 校验和)
- Django 1.5.2(下载 Django 1.5.2 | 1.5.2 校验和)
- Django 1.4.6(下载 Django 1.4.6 | 1.4.6 校验和)
有关安全报告的常规说明
与往常一样,我们要求您通过私人电子邮件将其发送到security@djangoproject.com报告潜在的安全问题,而不是通过 Django 的 Trac 实例或 django-developers 列表。请参阅我们的安全策略以获取更多信息。