已发布的安全版本
今天,Django 团队发布了多个版本——Django 1.3.5、Django 1.4.3 和 Django 1.5 beta 2——作为我们安全流程的一部分。
我们鼓励所有用户立即升级 Django。
请注意,此安全版本与之前的版本略有不同。此处解决的两个问题都已在之前的 Django 安全更新中得到处理。在一个案例中,我们收到了持续的问题报告,在另一个案例中,我们选择采取进一步措施加强 Django 的代码,以应对多个来源独立发现的潜在问题。
主机头注入
之前的几个 Django 安全版本都关注 HTTP Host 头注入问题,这会导致 Django 生成指向任意(可能恶意)域的 URL。
为了响应收到的更多反馈以及先前版本发布后持续出现问题的报告,我们正在采取额外措施以加强 Host 头验证。与其尝试在这里适应 HTTP 支持的所有功能,不如让 Django 的 Host 头验证尝试支持更小但更常见的子集。
- 主机名必须由字符 [A-Za-z0-9] 加连字符 ('-') 或点 ('.') 组成。
- 允许使用 IP 地址——IPv4 和 IPv6。
- 如果指定端口,则为数字。
任何偏离此规则的行为现在都将被拒绝,并引发 django.core.exceptions.SuspiciousOperation
异常。
重定向注入
同样是对之前问题的跟进:今年 7 月,我们对 Django 的 HTTP 重定向类进行了更改,对要重定向到的 URL 方案进行了额外验证(因为,在 Django 自身的提供的应用程序和许多第三方应用程序中,接受用户提供的重定向目标是一种常见的模式)。
从那时起,对代码进行了两次独立审计,发现了更多潜在问题。因此,与 Host 头问题类似,我们正在采取措施,以应对报告的问题(主要是在第三方应用程序中,但在一定程度上也在 Django 本身中)提供更严格的验证。这分为两个部分。
- 添加了一个新的实用程序函数
django.utils.http.is_safe_url
;此函数接受一个 URL 和一个主机名,并检查该 URL 是否为相对 URL,或者如果为绝对 URL,则与提供的主机名匹配。此函数旨在在接受用户提供的重定向目标时使用,以确保此类重定向不会导致任意第三方站点。 - Django 所有内置视图(主要在身份验证系统中)现在都使用
is_safe_url
来验证用户提供的重定向目标。
受影响的版本
导致此安全版本发布的问题存在于以下版本的 Django 中:
- Django 开发主分支(目前正式版本为 1.6 预发布版)。
- Django 1.5 预发布分支(1.5 alpha 和 beta 版本的来源)。
- Django 1.4。
- Django 1.3。
解决方案
已将补丁应用于 Django 的主开发分支和 1.5、1.4 和 1.3 发布分支,这些补丁解决了上述问题。补丁可以直接从以下 changeset 获取:
- 开发主分支:changeset 27560924ec1e567be4727ef8d7dfc4d3879c048c(主机头问题),以及 changeset a2f2a399566dd68ce7e312fff5a5ba857066797d(重定向问题)。
- 1.5 发布分支:changeset 77b06e41516d8136b56c040cba7e235b14750bfb(主机头问题),以及 changeset fce1fa0f7fb984d4e76eb81ffc3cb9826046c3b5(重定向问题)。
- 1.4 发布分支:changeset 319627c184e71ae267d6b7f000e293168c7b6e09(主机头问题),以及 changeset b2ae0a63aeec741f1e51bac9a95a27fd635f9652(重定向问题)。
- 1.3 发布分支:changeset 2da4ace0bc1bc1d79bf43b368cb857f6f0cd6b1b(主机头问题),以及 changeset 1515eb46daa0897ba5ad5f0a2db8969255f1b343(重定向问题)。
已发布以下新版本:
由于 Django 的开发分支目前处于预发布版状态,而 1.5 分支处于 beta 状态,强烈建议用户不要在生产环境中运行它们;但是,如果您目前正在这样做,我们强烈建议您立即升级到相应分支的最新 HEAD,其中包含上述补丁。
致谢
对 Host 头问题的后续处理来自之前问题的报告者 James Kettle。重定向代码的潜在问题是由 Trac 中的用户名为“Gunnar”的用户和提交者 Florian Apolloner 独立发现的。
关于安全报告的常规说明
与以往一样,我们要求通过私人电子邮件 security@djangoproject.com 报告潜在的安全问题,而不是通过 Django 的 Trac 实例或 django-developers 列表。请参阅 我们的安全策略 以了解更多信息。
返回顶部