`
yinwufeng
  • 浏览: 277187 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hash碰撞/ Hash Collision

    博客分类:
  • java
 
阅读更多

最近一个Hash Collision DoS(Hash碰撞的拒绝式服务攻击)漏洞影响颇大,有恶意的人会通过这个安全弱点会让你的服务器运行巨慢无比,本文试图对这一漏洞的原理及可采取措施做一解析,供大家参考。 

一言蔽之,该安全弱点利用了各语言的Hash算法的“非随机性”可以制造出N多的value不一样,但是key一样数据,然后让你的Hash表成为一张单向链表,而导致你的整个网站或是程序的运行性能以级数下降(可以很轻松地让你的CPU升到100%)。 

目前,这个问题出现于Java、JRuby、PHP、Python、Rubinius、Ruby这些语言中,主要有: 

  • Java,所有版本
  • JRuby <= 1.6.5(目前fix在 1.6.5.1)
  • PHP <= 5.3.8,<= 5.4.0RC3(目前fix在5.3.9、5.4.0RC4)
  • Python,所有版本
  • Rubinius,所有版本
  • Ruby <= 1.8.7-p356(目前fix在 1.8.7-p357、1.9.x)
  • Apache Geronimo,所有版本
  • Apache Tomcat <= 5.5.34,<= 6.0.34,<= 7.0.22(目前fix在 5.5.35、6.0.35、7.0.23)
  • Oracle Glassfish <= 3.1.1(目前fix在mainline)
  • Jetty,所有版本
  • Plone,所有版本
  • Rack <= 1.3.5, <= 1.2.4, <= 1.1.2 (目前fix 在 1.4.0、1.3.6、1.2.5、1.1.3)
  • V8 JavaScript Engine,所有版本
  • ASP.NET,没有打MS11-100补丁之前
注意,Perl没有这个问题,因为Perl在N年前就fix了这个问题了。关于这个列表的更新,请参看oCERT的2011-003报告。这个问题早在2003 年就在论文《通过算法复杂性进行拒绝式服务攻击》中被报告了,但是好像没有引起注意,尤其是Java。 

弱点攻击解释 

你可能会觉得这个问题没有什么大不了的,因为黑客看不到hash算法,如果你这么认为,那么你就错了,这说明对Web编程的了解还不足够底层。 

无论你用JSP、PHP、Python、Ruby来写后台网页的时候,在处理HTTP POST数据的时候,你的后台程序可以很容易地以访问表单字段名来访问表单值,就像下面这段程序一样: 
Javascript代码 
  1. $usrname = $_POST['username'];  
  2. $passwd = $_POST['password'];  

这是怎么实现的呢?这后面的东西就是Hash Map啊,所以,我可以给你后台提交一个有10K字段的表单,这些字段名都被我精心地设计过,他们全是Hash Collision ,于是你的Web Server或语言处理这个表单的时候,就会建造这个hash map,于是在每插入一个表单字段的时候,都会先遍历一遍你所有已插入的字段,于是你的服务器的CPU一下就100%了,你会觉得这10K没什么,那么我就发很多个的请求,你的服务器一下就不行了。 

举个例子,你可能更容易理解: 

如果你有n个值—— v1, v2, v3, … vn,把他们放到hash表中应该是足够散列的,这样性能才高: 
引用
    0 -> v2 
    1 -> v4 
    2 -> v1 
    … 
    … 
    n -> v(x)

但是,这个攻击可以让我造出N个值——  dos1, dos2, …., dosn,他们的hash key都是一样的(也就是Hash Collision),导致你的hash表成了下面这个样子: 
引用
    0 – > dos1 -> dos2 -> dos3 -> …. ->dosn 
    1 -> null 
    2 -> null 
    … 
    … 
    n -> null

于是,单向链接就这样出现了。这样一来,O(1)的搜索算法复杂度就成了O(n),而插入N个数据的算法复杂度就成了O(n^2),你想想这是什么样的性能。 

(关于Hash表的实现,如果你忘了,那就把大学时的《数据结构》一书拿出来看看) 

Hash Collision DoS 详解 

StackOverflow.com是个好网站,合格的程序员都应该知道这个网站。上去一查,就看到了这个贴子“Application vulnerability due to Non Random Hash Functions”。这里把这个贴子里的东西摘一些过来。 

首先,这些语言使用的Hash算法都是“非随机的”,如下所示,这个是Java和Oracle使用的Hash函数: 
Java代码 
  1. static int hash(int h)  
  2. {  
  3. h ^= (h >>> 20) ^ (h >>> 12);  
  4. return h ^ (h >>> 7) ^ (h >>> 4);  
  5. }  

所谓“非随机的” Hash算法,就可以猜。比如: 

1)在Java里,Aa和BB这两个字符串的hash code(或hash key)是一样的,也就是Collision 。 

2)于是,我们就可以通过这两个种子生成更多的拥有同一个hash key的字符串。如:”AaAa”, “AaBB”, “BBAa”, “BBBB”。这是第一次迭代。其实就是一个排列组合,写个程序就搞定了。 

3)然后,我们可以用这4个长度的字符串,构造8个长度的字符串,如下所示: 
引用

"AaAaAaAa", "AaAaBBBB", "AaAaAaBB", "AaAaBBAa", 
"BBBBAaAa", "BBBBBBBB", "BBBBAaBB", "BBBBBBAa", 
"AaBBAaAa", "AaBBBBBB", "AaBBAaBB", "AaBBBBAa", 
"BBAaAaAa", "BBAaBBBB", "BBAaAaBB", "BBAaBBAa",

4)同理,我们就可以生成16个长度的,以及256个长度的字符串,总之,很容易生成N多的这样的值。 

在攻击时,我只需要把这些数据做成一个HTTP POST 表单,然后写一个无限循环的程序,不停地提交这个表单。你用你的浏览器就可以了。当然,如果做得更精妙一点的话,把你的这个表单做成一个跨站脚本,然后找一些网站的跨站漏洞,放上去,于是能过SNS的力量就可以找到N多个用户来帮你从不同的IP来攻击某服务器。 

防御措施 

要防守这样的攻击,可以尝试下面几招: 

  • 打补丁,把hash算法改了。
  • 限制POST的参数个数,限制POST的请求长度。
  • 最好还有防火墙检测异常的请求。
分享到:
评论

相关推荐

    Java Hash Collision DoS Attack

    Java实现的Hash Collision DoS Attack

    关于Hash Collision DoS漏洞:web实例

    NULL 博文链接:https://goodscript.iteye.com/blog/1338973

    警惕Hash Collision Dos.pdf

    警惕Hash Collision Dos.pdf

    hashcollision

    莫尔斯电码哈希碰撞检测器这是什么? 这个小工具将相当于字母表中每个字母的二进制莫尔斯电码转换为一个数字。 这个数字可以用作表的索引。你为什么需要这个? 如果您正在尝试莫尔斯电码挑战,此工具会计算将二进制...

    linux 实验四 文件系统

    / #include #define COLLISIONFACTOR 0.5 ...int hash(int keyoffset,int keylen,void *buf,int recnum); int checkHashFileFull(int fd); int readHashFileHeader(int fd,struct HashFileHeader *hfh );

    论文研究-Advanced Framework for Iterative Hash Functions---C-hash.pdf

    改进的哈希迭代结构——C-hash,李志敏,杨波,本文通过学习对Merkle-Damgard迭代结构以及它的一些改进版本的攻击分析,包括Joux提出的多碰撞攻击,Kelsey和Schneier提出的长消息第二原像�

    php_hash_collision_finder:多线程 PHP 十六进制字符串等价碰撞查找器

    PHP哈希冲突查找器这是一个用 C++ 编写的工具,它演示了哈希冲突(目前只有 md5)模 PHP 等价(== 比较运算符)。 即搜索字符串$s,如: strlen($s) == $n && md5($prefix . $s . $suffix) == '0' 这个特性可以在...

    The Joys of Hashing: Hash Table Programming with C

    Build working implementations of hash tables, written in the C programming language. This book starts with simple first attempts devoid of collision resolution strategies, and moves through ...

    百度地图毕业设计源码-BlockChain:记录学习区块链技术的过程

    碰撞不可避免(collision free:想要人为制造 hash 碰撞是不可行的) Collision resistance:抗碰撞性——内容无法篡改 用于作信息摘要(message digest):没有办法篡改内容而又不被检测出来 没有办法用纯数学、纯理论...

    framework_laya.zip

    Collision 2D碰撞检测 Ray2D 2D射线 Mathf Math库的扩展 包含一些Math库中没有的数学方法 Matrix 4x4浮点矩阵,可以存储平移、比例和旋转信息 Matrix2D 2D矩阵类及常用方法 Rectangle 矩形类 Vector2 二维向量类 ...

    pwwMap升级

    Title: The core of the big data...In summary, pwwhash are perfect hash algorithms with zero collision probability. You can refer to following artical to find the key index and compress algorithm theory: ...

    利用哈希表进行存储 针对一组数据进行初始化哈希表,可以进行显示哈希表,查找元素,插入元素,删除元素,退出程序操作

    ③冲突处理方法(Collision resolution) ④除留余数法(Modulo hashing) ⑤线性探测再散列法(Linear probing) 概述: 哈希表(Hash table)是一种基于哈希函数(Hash function)实现的数据结构,用于实现关联...

    乐鑫esp32使用MD5算法例程

    乐鑫esp32使用MD5算法例程,MD5算法是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节...2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

    md5.js 前端MD5信息摘要算法

    md5.js下载 MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数...2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途

    dir-item.rar_There There

    insert a name into a directory, doing overflow properly if there is a hash collision.

    前端加密插件md5.js

    前端加密插件md5.js MD5.js是对前端的明文数据进行MD5加密方式。是一个前端加密插件。...2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

    md5加密算法 C语言(经过测试验证完整版)

    md5加密算法 C语言(经过测试验证完整版) 经过调试验证,与工具结果一致 MD5信息摘要算法(英语...2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。

    javascript----md5加密算法

    MD5信息摘要算法(英语:MD5 ...2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。 写的一篇文章里所需要的代码,网上是有的,所以就不用积分了。

    New multivariate hash function quadratic polynomials multiplying linear polynomials

    In this study the authors propose a new multivariate hash function with HAsh Iterative FrAmework framework which we call the hash function quadratic polynomials multiplying linear polynomials (QML)....

    浅谈哈希表存储效率一般不超过50%的原因

    Hash Table 常用于频繁进行 key/value 模式的查找中。(查找模式,如匹配查找) 哈希表最大的优点在于查找速度快,但存储时可能发生collision(冲突)。 哈希表大多使用open addressing来解决collision,此时search的...

Global site tag (gtag.js) - Google Analytics