阅读更多

7顶
0踩

编程语言
最近一个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数据的时候,你的后台程序可以很容易地以访问表单字段名来访问表单值,就像下面这段程序一样:
$usrname = $_POST['username'];
$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函数:
static int hash(int h)
{
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}

所谓“非随机的” 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的请求长度。
  • 最好还有防火墙检测异常的请求。

来自: 酷壳
7
0
评论 共 5 条 请登录后发表评论
5 楼 whiletrue 2012-01-10 12:59
jindw 写道
xifo 写道
很想知道这个Hash算法应该怎么个改法。


static int r1 = Math.radom(); 

static int hash(int h)  {  
    h ^= (h >>> r1) ^ (h >>> 12);  
    return h ^ (h >>> 7) ^ (h >>> 4);  
 }  


这样可行不?

用随机数好像还不错啊,不过会不会还很容易算出相同的hash码呢
4 楼 jindw 2012-01-09 13:36
xifo 写道
很想知道这个Hash算法应该怎么个改法。


static int r1 = Math.radom(); 

static int hash(int h)  {  
    h ^= (h >>> r1) ^ (h >>> 12);  
    return h ^ (h >>> 7) ^ (h >>> 4);  
 }  


这样可行不?
3 楼 loookto 2012-01-08 13:19
xifo 写道
很想知道这个Hash算法应该怎么个改法。

+1
2 楼 whiletrue 2012-01-07 12:21
只要语言的hashcode计算是开源的,很容易就能造出类似的数据出来.
1 楼 xifo 2012-01-07 08:53
很想知道这个Hash算法应该怎么个改法。

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 关于Hash Collision DoS漏洞:web实例

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

  • Hash Collision DoS

    Hash Collision DoS事件及影响  Hash Collision DoS能让受攻击的服务器变得巨慢无比。 这不是因为服务器的编码原因或是疏忽造成的,而是程序语言自身的问题,Hash Collision DoS利用了各语言中Hash算法...

  • Hash Collision DoS 攻击

    Hash Collision DoS事件及影响  Hash Collision DoS能让受攻击的服务器变得巨慢无比。 这不是因为服务器的编码原因或是疏忽造成的,而是程序语言自身的问题,Hash Collision DoS利用了各语言中Hash算法的...

  • 资源工具分享(第1期):后端架构师技术图谱

    容量评估 CDN 网络 连接池 性能调优 大数据 流式计算 Storm Flink Kafka Stream 应用场景 Hadoop HDFS MapReduce Yarn Spark 安全 web 安全 XSS CSRF SQL 注入 Hash Dos 脚本注入 漏洞扫描工具 验证码 DDoS 防范 ...

  • 后端架构师技术图谱

    Hash Dos 脚本注入 漏洞扫描工具 验证码 DDoS 防范 用户隐私信息保护 序列化漏洞 加密解密 对称加密 哈希算法 非对称加密 服务器安全 数据安全 ...

  • Find-Sec-Bugs 漏洞范例

    Find-Sec-Bugs 漏洞范例 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的...

  • 从初级开发者到资深架构师,看这

    Hash Dos 脚本注入 漏洞扫描工具 验证码 DDoS 防范 用户隐私信息保护 序列化漏洞 加密解密 对称加密 哈希算法 非对称加密 服务器安全 数据安全 数据备份 网络隔离 内外网分离 登录跳板机 授权、认证 RBAC OAuth2.0 ...

  • 《后端架构师技术图谱》

    Hash Dos 脚本注入 漏洞扫描工具 验证码 DDoS 防范 用户隐私信息保护 序列化漏洞 加密解密 对称加密 哈希算法 非对称加密 服务器安全 数据安全 数据备份 网络隔离 内外网分离 登录跳板机 授权、认证 RBAC OAuth2.0 ...

  • java技术点

    容量评估 CDN 网络 连接池 性能调优 大数据 流式计算 Storm Flink Kafka Stream 应用场景 Hadoop HDFS MapReduce Yarn Spark 安全 web 安全 XSS CSRF SQL 注入 Hash Dos 脚本注入 漏洞扫描工具 验证码 DDoS 防范 ...

  • abrt-devel-2.1.11-60.el7.centos.x64-86.rpm.tar.gz

    1、文件内容:abrt-devel-2.1.11-60.el7.centos.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/abrt-devel-2.1.11-60.el7.centos.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

  • 房地产公司绩效管理办法(精品).doc

    房地产公司绩效管理办法(精品)

  • 网卡驱动-r8169-linux-官方

    网卡驱动-r8169-linux-官方驱动,能翻墙的也可以去外网下,这里只是赚个积分,本人有时候也需要下载别人的资源,望理解,外网地址:https://www.realtek.com/Download/ToDownload?type=direct&downloadid=3378

  • 基于非线性干扰观测器的自适应滑模反演控制策略在机械臂模型中的应用:神经网络MATLAB仿真研究,(文献+程序)基于非线性干扰观测器的自适应滑模反演控制 机械臂模型 神经网络 matlab仿真 滑膜 带

    基于非线性干扰观测器的自适应滑模反演控制策略在机械臂模型中的应用:神经网络MATLAB仿真研究,(文献+程序)基于非线性干扰观测器的自适应滑模反演控制 机械臂模型 神经网络 matlab仿真 滑膜 带原班文献 ,关键词:非线性干扰观测器; 自适应滑模反演控制; 机械臂模型; 神经网络; MATLAB仿真; 滑膜控制; 原班文献,基于非线性干扰观测器的机械臂自适应滑模反演控制:matlab神经网络仿真及原班文献解读

  • "电力电子方向入门学习:单相PWM整流无桥图腾柱pfc技术Simulink仿真实践,电压调控及优化性能探索",单相PWM整流无桥图腾柱pfc,simulink仿真 输入电压220v有效值 输出电压50

    "电力电子方向入门学习:单相PWM整流无桥图腾柱pfc技术Simulink仿真实践,电压调控及优化性能探索",单相PWM整流无桥图腾柱pfc,simulink仿真 输入电压220v有效值 输出电压500v纹波在1%以内 功率因数为1 电流THD<5% 开关频率20k 可作为电力电子方向入门学习~~ ,关键词:单相PWM整流;无桥图腾柱PFC;Simulink仿真;输入电压220V;输出电压500V;纹波;功率因数1;电流THD<5%;开关频率20k;电力电子方向入门学习。,"单相PWM整流桥技术:无桥图腾柱PFC的Simulink仿真入门学习"

  • 员工晋升申请表.docx

    员工晋升申请表

  • 基于java+ssm+vue+mysql的民宿预订管理系统源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

  • FPGA实现CameraLink相机Base模式解码与HDMI高清视频输出方案,FPGA采集CameraLink相机Base模式 本文详细描述了FPGA采集CameraLink相机Base模式解码输出

    FPGA实现CameraLink相机Base模式解码与HDMI高清视频输出方案,FPGA采集CameraLink相机Base模式 本文详细描述了FPGA采集CameraLink相机Base模式解码输出的实现设计方案,思路是这样的,CameraLink相机输入到FPGA板子,FPGA使用内部逻辑资源实现LVDS视频解码,解析出像素时钟、行同步信号、场同步信号、数据有效信号、以及像素数据,然后将视频转为Xilinx的AXI4-Sream的视频流,经VDMA送入DDR3缓存,然后读取出视频再经过AXI4-Sream to Video Out通过HDMI接口输出视频,这是Xilinx图像处理常用的套路,可谓相当精巧的方案 ,核心关键词:FPGA; CameraLink相机; Base模式; LVDS视频解码; 像素时钟; 同步信号; 像素数据; Xilinx AXI4-Sream; VDMA; DDR3缓存; HDMI接口视频输出。,"FPGA实现CameraLink相机Base模式视频解码与输出设计"

  • 各岗位职责及操作.docx

    各岗位职责及操作

  • 视频人脸识别修复领域的通用框架SVFR及其对盲人脸修复、色彩化与修复任务的影响研究

    内容概要:本文介绍了稳定视频人脸修复(Stable Video Face Restoration, SVFR)方法,这是一个为解决一般化视频人脸修复(Generalized Video Face Restoration, GVFR)而设计的统一框架。作者针对现有技术未能有效处理时间一致性和运动伪影的问题提出SVFR方法,并通过实验展示其相较于单任务模型,在盲脸修复、颜色化和修补方面的性能显著提升。GVFR整合了三种子任务(BFR, colorization, 和 inpainting),并通过联合框架提高了训练效果,利用了预训练稳定视频扩散模型(SVD)。文中还引入了统一面部修复框架来确保跨子任务的一致特征表征,并提出了一种新的面部先验损失函数,通过面部特征点辅助修复过程并提高稳定性。 适用人群:适用于从事计算机视觉特别是视频识别和图像处理的研究者和技术工程师。 使用场景及目标:①用于高质量的人脸恢复,特别是在老旧电影或低质量监控录像等场合;②增强人脸识别准确性,确保长时间视频中身份一致性;③应用于需要真实感强的画面处理环境如在线会议直播。 其他说明:这项工作中提出的SVFR不仅解决了当前的技术难题,还为未来相关领域的研究和发展提供了重要参考价值,尤其体现在它所建立的新范例上,即如何通过多任务监督从有限数据集中获得更好的表现。

  • 2025年义务教育新课程标准生物(2022年版)必考试题含答案.docx

    2025年义务教育新课程标准生物(2022年版)必考试题含答案.docx

Global site tag (gtag.js) - Google Analytics