已发布的安全版本
今天,Django 团队发布了多个版本——Django 1.4.7、Django 1.5.3 和 Django 1.6 beta 3——作为我们安全流程的一部分。这些版本现已在PyPI 和我们的下载页面上提供。
这些版本修复了 Django 的一个内置模板标签中的目录遍历漏洞。虽然此问题需要一些相当具体的因素才能被利用,但我们鼓励所有 Django 用户立即升级。
更多详情,请继续阅读。
问题:使用ssi模板标签的目录遍历
Django 的模板语言包含两种在另一个模板内包含和渲染一个模板的方法。
- 该{% include %}标签采用模板名称,并使用 Django 的模板加载机制(该机制仅限于在TEMPLATE_DIRS设置中指定的目录,与 Django 中任何其他正常的模板加载一样)。
- 该{% ssi %}标签,它采用文件路径并包含该文件的内容(可以选择将其作为模板进行解析和渲染)。
由于ssi标签不受TEMPLATE_DIRS的限制,因此它构成了安全风险;因此需要ALLOWED_INCLUDE_ROOTS设置,并指定从中ssi可以读取文件的系统位置。
Django 核心团队已收到并确认了一份报告,该报告显示ALLOWED_INCLUDE_ROOTS设置的处理方式容易受到目录遍历攻击,方法是指定一个文件路径,该路径以ALLOWED_INCLUDE_ROOTS中的目录的绝对路径开头,然后使用相对路径来突破限制。例如,如果/var/includes位于ALLOWED_INCLUDE_ROOTS中,则将接受以下内容:
{% ssi '/var/includes/../../etc/passwd' %}
这将包含/etc/passwd的内容到模板的输出中。
请注意,执行此攻击确实需要一些特定条件。
- 要攻击的站点必须有一个或多个使用ssi标签的模板,并且必须允许某种形式的未经消毒的用户输入用作ssi标签的参数,或者
- 攻击者必须能够更改站点上的模板。
为了解决这个问题,ssi标签现在将使用 Python 的os.path.abspath来确定文件的绝对路径,以及它是否实际位于ALLOWED_INCLUDE_ROOTS.
感谢 Rainer Koirikivi 向我们报告了这个问题。
受影响的版本
- Django 主开发分支
- Django 1.6(当前处于测试版状态)
- Django 1.5
- Django 1.4
对于所有受影响的 Django 版本,请使用 CVE-2013-4315 来指代此问题。
解决方案
补丁已应用于 Django 的主开发分支以及 1.6、1.5 和 1.4 发布分支,这些补丁解决了上述问题。这些补丁可以直接从以下更改集中获取:
已发布以下新版本:
- Django 1.6 beta 3(下载 Django 1.6b3 | 1.6b3 校验和)
- Django 1.5.3(下载 Django 1.5.3 | 1.5.3 校验和)
- Django 1.4.7(下载 Django 1.4.7 | 1.4.7 校验和)
关于安全报告的一般说明
与以往一样,我们要求通过私人电子邮件将潜在的安全问题报告给security@djangoproject.com,而不是通过 Django 的 Trac 实例或 django-developers 列表。请参阅我们的安全策略以获取更多信息。