Press "Enter" to skip to content

通过构造Hash冲突实现各种语言的拒绝服务攻击

上周的时候Dmitry突然在5.4发布在即的时候, 引入了一个新的配置项:

Added max_input_vars directive to prevent attacks based on hash collisions

这个预防的攻击, 就是”通过调用Hash冲突实现各种语言的拒绝服务攻击漏洞”(multiple implementations denial-of-service via hash algorithm collision).

攻击的原理很简单, 目前很多语言, 使用hash来存储k-v数据, 包括常用的来自用户的POST数据, 攻击者可以通过构造请求头, 并伴随POST大量的特殊的”k”值(根据每个语言的Hash算法不同而定制), 使得语言底层保存POST数据的Hash表因为”冲突”(碰撞)而退化成链表.

这样一来, 如果数据量足够大, 那么就可以使得语言在计算, 查找, 插入的时候, 造成大量的CPU占用, 从而实现拒绝服务攻击.

PHP5.4是通过增加一个限制来尽量避免被此类攻击影响:

  - max_input_vars - specifies how many GET/POST/COOKIE input variables may be
    accepted. default value 1000.

目前已知的受影响的语言以及版本有::

Java, 所有版本

JRuby <= 1.6.5

PHP <= 5.3.8, <= 5.4.0RC3

Python, 所有版本

Rubinius, 所有版本

Ruby <= 1.8.7-p356

Apache Geronimo, 所有版本

Apache Tomcat <= 5.5.34, <= 6.0.34, <= 7.0.22

Oracle Glassfish <= 3.1.1

Jetty, 所有版本

Plone, 所有版本

Rack, 所有版本

V8 JavaScript Engine, 所有版本

不受此影响的语言或者修复版本的语言有::

PHP >= 5.3.9, >= 5.4.0RC4

JRuby >= 1.6.5.1

Ruby >= 1.8.7-p357, 1.9.x

Apache Tomcat >= 5.5.35, >= 6.0.35, >= 7.0.23

Oracle Glassfish, N/A (Oracle reports that the issue is fixed in the main codeline and scheduled for a future CPU)

CVE: CVE-2011-4885 (PHP), CVE-2011-4461 (Jetty), CVE-2011-4838 (JRuby), CVE-2011-4462 (Plone), CVE-2011-4815 (Ruby)

原文: http://www.ocert.org/advisories/ocert-2011-003.html

42 Comments

  1. Mammie
    Mammie 2014-10-09

    I have been exploring for a little for any high-quality
    articles or weblog posts in this sort of house . Exploring in Yahoo I ultimately stumbled
    upon this web site. Studying this information So i’m satisfied to convey that I have a very excellent uncanny feeling I came upon just what I needed.
    I most indubitably will make sure to do not overlook this web site and give it a glance regularly.

  2. Connor
    Connor 2014-10-08

    This article will help the internet visitors for setting
    up new webpage or even a weblog from start to end.

  3. […] 前日有信息显示当前包括PHP、Java、Ruby在内的很多语言版本存在漏洞,PHP官方开发组成员Laruence(新浪微博)表示攻击者可以通过构造Hash冲突实现拒绝服务攻击,并提供了实例。这个攻击方法危害很高,攻击成本也很小,一个台式机可以轻松搞垮数十台、上百台服务器。 […]

  4. […] 还记得我之前说的PHP Hash Collisions Ddos漏洞吧? 最初的时候, 开发组给出的修复方案, 采用的是如果超过max_input_vars, 就报错(E_ERROR), 继而导致PHP出错结束. 而后来, 为了更加轻量级的解决这个问题, 我们又改善了一下, 变成了如果超过max_input_vars, 就发出警告, 并且不再往目的数组添加, 但是流程继续. 然后我们发布了5.3.9. […]

  5. […] 最近安全领域出了很多新闻,从CSDN密码外泄开始,接踵而至。其中通过构造HASH冲突来拒绝服务涉及了大部分WEB开发语言(具体可以看 Laruence的文章),所以有必要将PHP更新到最新版本(目前是5.3.10)。不过这个过程并不怎么顺利,记录一下。 […]

  6. […] 前几天看到公司php群谈到这篇博文通过构造Hash冲突实现各种语言的拒绝服务攻击,说的是在PHP中,使用hash来存储k-v数据, 包括常用的来自用户的POST数据, 攻击者可以通过构造请求头, 并伴随POST大量的特殊的”k”值(根据每个语言的Hash算法不同而定制), 使得语言底层保存POST数据的Hash表因为”冲突”(碰撞)而退化成链表. 这样一来, 如果数据量足够大, 那么就可以使得语言在计算, 查找, 插入的时候, 造成大量的CPU占用, 从而实现拒绝服务攻击. 举个例子:如下代码中: 123456789101112131415161718192021222324252627<?php $size = pow(2, 16); // 16 is just an example, could also be 15 or 17 $startTime = microtime(true); $array = array(); for ($key = 0, $maxKey = ($size – 1) * $size; $key <= $maxKey; $key += $size) {         $array[$key] = 0; } $endTime = microtime(true); echo 'Inserting ', $size, ' evil elements took ', $endTime – $startTime, ' seconds', "n"; $startTime = microtime(true); $array = array(); for ($key = 0, $maxKey = $size – 1; $key <= $maxKey; ++$key) {         $array[$key] = 0; } $endTime = microtime(true); echo 'Inserting ', $size, ' good elements took ', $endTime – $startTime, ' seconds', "n"; //http://www.laruence.com/2011/12/30/2435.html ?> […]

  7. […] 前几天,各个主流语言都爆出来了大Bug:“通过调用Hash冲突实现各种语言的拒绝服务攻击漏洞”(multiple implementations denial-of-service via hash algorithm collisio)。《通过构造Hash冲突实现各种语言的拒绝服务攻击》这篇文章提到PHP里引入了新的配置项,来限制GET/POST/COOKIE输入变量来减少攻击的影响。 […]

  8. fare
    fare 2012-01-06

    彻底的修改方法,就是改一下hash函数,在编译安装的时候,自动生成一个随机的p,hash的时候带上这个p,就很难构造退化的链表了。

  9. Joey Yin
    Joey Yin 2012-01-05

    JAVA下hash冲突生成代码请参考:http://www.unclejoey.com/?p=554

  10. hoho
    hoho 2012-01-04

    alert(‘test’)

  11. tanglei
    tanglei 2012-01-03

    这个,java怎么中招啊?
    求解释。
    java中的数组不会支持很大,受内存限制吧。
    不过在hashmap中,有类似的影响。不过相差不大。

  12. yc2266
    yc2266 2012-01-02

    这个问题 百度可以共享一下 hi 空间里面的博文链接key 计算方式:

    http://hi.baidu.com/baidu/blog/item/b95bb39997ebc2166f068cec.html

    b95bb39997ebc2166f068cec 这个key的计算方式能保证在多少范围内不产生碰撞!(具体多少我也不知道)保证这个算法在一定范围的稳定性!

  13. upsuper
    upsuper 2012-01-02

    Python 似乎受影响不大,首先 Python 本身不解析大量外部数据,所以不存在类似 PHP 那样针对语言层面的攻击,过滤过多参数只需要相关框架增加选项即可。其次 Python 的 Hash 算法似乎并不容易用来大规模构造冲撞数据,构造难度跟纯枚举差不多,所以短期内被攻击的可能性不大。

  14. […] 通过构造Hash冲突实现各种语言的拒绝服务攻击 PHP数组的Hash冲突实例 深入理解PHP之数组(遍历顺序) Supercolliding a PHP array 哈希表(HashTable) PHP的哈希表实现   If you enjoyed this article, please consider sharing it! […]

  15. […] 高危安全:Hash冲突导致PHP/JAVA/PYTHON等DDOS攻击 作者: xiuwz 日期: 2011 年 12 月 30 日 发表评论 (0) 查看评论 (No Ratings Yet)  Loading … 分享到: 更多 国外目前报出“multiple implementations denial-of-service via hash algorithm collision”,该hash冲突漏洞对目前所有的WEB动态开发语言都有危害,导致一个用户可以轻松通过构造数据而造成任何网站拒绝服务,从而引发DDOS相关攻击。中文版介绍请参考http://www.laruence.com/2011/12/29/2412.html。 […]

  16. jw
    jw 2011-12-30

    hi,niaoge
    为啥不在每个bucket中加个指针指向链表结尾来解决问题,而是采用限制输入长度的方案
    thx

  17. mahone
    mahone 2011-12-30

    max_input_vars – specifies how many GET/POST/COOKIE input variables may be
    accepted. default value 1000.

    这个1000,是get,post,cookie这种加起来一共1000?还是get1000,post1000,cookie1000?

  18. kim
    kim 2011-12-30

    这不是基本上全部中招?

  19. 神仙
    神仙 2011-12-30

    如果是用的rbtree之类就不会有这麻烦了吧

  20. aries
    aries 2011-12-29

    这个,现在有可行的方法来构造大量hash值相同的不同原文?

Leave a Reply

Your email address will not be published. Required fields are marked *