已发布的安全版本

作者:James Bennett 发布于 2014年4月21日

今天,Django 团队发布了多个版本——Django 1.4.11、Django 1.5.6、Django 1.6.3 和 Django 1.7 beta 2——作为我们安全流程的一部分。这些版本现已在PyPI和我们的下载页面上提供。

这些版本解决了意外代码执行问题、可能泄露 CSRF 令牌的缓存问题以及 MySQL 类型转换问题。虽然这些问题带来的风险有限,并且可能不会影响所有 Django 用户,但我们鼓励所有用户评估自身风险并尽快升级。

更多详细信息,请继续阅读。

问题:使用reverse()

导致的意外代码执行

Django 的 URL 处理基于正则表达式模式(表示 URL)与可调用视图的映射,Django 本身的处理过程包括将请求的 URL 与这些模式进行匹配,以确定要调用的适当视图。Django 还提供了一个便利函数——django.core.urlresolvers.reverse()reverse()——它以相反的方向执行此过程。reverse()该函数获取有关视图的信息并返回一个将调用该视图的 URL。reverse()鼓励应用程序开发人员使用它,因为

的输出始终基于当前的 URL 模式,这意味着开发人员在更改 URL 时无需更改其他代码。reverse()的一个参数签名是传递一个指向所需视图的点分隔 Python 路径。

在这种情况下,Django 将导入该点分隔路径指示的模块,作为生成结果 URL 的一部分。如果此类模块具有导入时副作用,则这些副作用将发生。

  1. 因此,在以下条件下,攻击者可能会导致意外代码执行
  2. 存在一个或多个基于用户输入构建 URL 的视图(通常是查询字符串中指示在操作成功完成时重定向到何处的“next”参数)。

攻击者知道服务器的 Python 导入路径上存在一个或多个模块,这些模块在导入时会执行具有副作用的代码。reverse()为了解决这个问题,

现在将只接受和导入基于项目 URL 模式配置中列出的包含视图的模块的点分隔路径,以确保只有开发人员打算以这种方式导入的模块才能或将被导入。

此问题已分配 CVE 标识符 CVE-2014-0472。

感谢 Benjamin Bach 报告此问题。

问题:匿名页面的缓存可能会泄露 CSRF 令牌

Django 包括缓存框架和防止跨站点请求伪造 (CSRF) 攻击的系统。

CSRF 保护系统基于发送到客户端 cookie 中的随机 nonce,客户端必须在将来的请求中发送该 nonce,并且在表单中,必须将隐藏值与表单一起提交回。

缓存框架包括一个选项,可以缓存对匿名(即未经身份验证)客户端的响应。

  1. 当第一个对给定页面的匿名请求来自没有 CSRF cookie 的客户端时,缓存框架也将缓存 CSRF cookie 并将相同的 nonce 提供给没有 CSRF cookie 的其他匿名客户端。这可能允许攻击者获取有效的 CSRF cookie 值并执行绕过 cookie 检查的攻击。
  2. 为了解决这个问题,缓存框架将不再缓存此类响应。
  3. 此启发式方法将为如果传入请求未提交任何 cookie,并且如果响应发送了一个或多个 cookie,并且

如果

Vary: Cookie

标头在响应中设置,则不会缓存响应。

此问题已分配 CVE 标识符 CVE-2014-0473。

感谢提交者 Paul McMillan 报告此问题。

问题:MySQL 类型转换

  • 众所周知,MySQL 数据库在某些查询中会执行“类型转换”;例如,当查询包含字符串值的表时,但使用基于整数值进行筛选的查询时,MySQL 将首先静默地将字符串强制转换为整数,并根据此返回结果。
  • 如果在不首先将值转换为适当类型的情况下执行查询,则可能会产生意外的结果,这类似于查询本身被操纵时发生的情况。
  • Django 的模型字段类了解其自己的类型,大多数此类类在查询之前会显式地将查询参数转换为正确的数据库级别类型。但是,三个模型字段类未正确转换其参数

FilePathField

GenericIPAddressFieldIPAddressField这三个字段已更新为在查询之前将其参数转换为正确的类型。此外,自定义模型字段的开发人员现在会通过文档收到警告,以确保其自定义字段类将执行适当的类型转换,并且raw()

extra()

查询方法(允许开发人员提供原始 SQL 或 SQL 片段)的用户将被建议在执行查询之前确保他们执行适当的手动类型转换。

  • 此问题已分配 CVE 标识符 CVE-2014-0474。
  • 感谢 Ruby on Rails 团队,特别是 Michael Koziarski,提供了有关此问题的信息。
  • 受影响的版本
  • Django 主开发分支
  • Django 1.7(目前处于测试版状态)
有关安全报告的一般说明