调查HashDoS问题

近一个月前,我就如何在不与供应商互动的情况下临时解决 28C3上出现的HashDoS问题或其他代码缺陷发表了一些想法。

现在是时候更深入地研究复杂性攻击并查看来源了。 我完全假设java.util.HashMapjava.util.Hashtable是受此攻击影响的最常用的Java数据结构,因此本文仅将代码集中在这些类型的后面。

哈希函数和索引数据结构的简要介绍

哈希索引数据结构因其简单的用法和优点而非常受欢迎:

  • 无需打扰索引表即可找到所需数据的正确位置
  • 通过使用关键字而不是索引号访问数据
  • 添加或删除操作的时间几乎恒定

为了获得这些好处,哈希索引数据结构遵循有关如何对数据进行索引的聪明思想。 索引是通过散列与背后数据关联的关键字来计算的。 考虑以下示例,这是一个类似于代码的简单示例:

myHashIndexedDataStructure [hash(keyword)] =特定数据

听起来很完美,但是它有一个主要缺点:在大多数情况下,使用的哈希函数不是加密函数。

根据Wikipedia的说法,函数自行调用哈希函数的唯一强制特征是

“将可变长度的大型数据集(称为键)映射到固定长度的较小数据集”

与称自己为密码哈希函数(再次是来自Wikipedia的定义)相反,它必须满足更多,甚至更强大的要求:

  • 计算任何给定消息的哈希值很容易(但不一定很快)
  • 生成具有给定哈希值的消息是不可行的
  • 在不更改哈希值的情况下修改消息是不可行的
  • 找到两个具有相同哈希值的不同消息是不可行的


长话短说,让我们总结一下我们学到的知识以及用这些知识得出的结论:

  1. 哈希索引数据结构利用哈希函数
  2. 哈希函数不一定是抗冲突的,只要它们不是加密的
  3. 缺乏抗冲突性意味着可以轻松计算具有相同哈希值的多个值

如果关键字冲突,则哈希索引数据结构需要某种计划b)–一种后备算法–关于如何处理具有相同关键字哈希值的多个数据集。

实际上,有几种可行的方法:

  • 探测(转移到固定或可计算的间隔)
  • 多重哈希
  • 条目链接(冲突条目的构建列表)
  • 覆盖现有条目

以下哪种策略需要Java? 首先,我们将检查java.util的代码。 Hashtable (仅显示有趣的部分,为清晰起见,其余代码被省略了:

public synchronized V put(K key, V value) { ... // Makes sure the key is not already in the hashtable. Entry tab[] = table; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) %tab.length; for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) { if((e.hash == hash) && e.key.equals(key)) { V old = e.value; e.value = value; return old; } } ... // Creates the new entry. Entry<K,V> e = tab[index]; tab[index] = new Entry<>(hash, key, value, e); count++; return null; 
}

可以看出,此类使用键对象( 关键字 )的hashCode ()函数来计算哈希值。 它遵循ANDing(&运算符),为了将其正确表示为Integer,MODULO(%运算符),将表大小(建立循环环结构:(table.length + 1)mod table.length?1,除以余数)始终解决标签 []中的条目。
此后,将考虑所有条目 (-ies)并检查哈希值是否相同以及对象本身是否相同。 if -clause防止存储同一对象的多个实例–旧的实例仅由新的实例替换。

如果在key.hashCode ()标识的当前位置上找不到相同的对象(关于哈希值和equals ()方法),则将创建一个新的Entry,将其放置在当前位置并在该位置处理旧的Entry对象。
到目前为止,看起来java.util.Hashtable在每个tab []之后都使用某种列表作为数据结构。

查看私有内部类java.util.Hashtable.Entry <K,V>的代码时,可以确认此假设。

private static class Entry<K,V> implements Map.Entry<K,V> { int hash; K key; V value; Entry<K,V> next;

下一个Entry对象仅指向下一个Entry 。 这代表一个定制的链表。
java.util.HashMap的代码更加复杂,并且表现部分不同(允许使用null值,!不同步!),但是基于相同的思想。 在这里调查代码不会发现任何新内容,除了Entry重新被重新实现的事实…)。

两种实现都依赖于哈希索引数组的每个条目后面的链接列表。

进攻思路

现在我们知道了java.util.Hashtablejava.util.HashMap背后的实现细节,我们可以回到称为HashDoS的攻击。 该攻击实现了Crosby,SA,Wallach,DS的想法: 通过算法复杂性攻击拒绝服务。 在:第十二届USENIX安全研讨会的会议记录–第12卷,USENIX协会(2003)
总结一下:散列索引的数据结构可能会因引发不利的状态而大大减慢速度。 理想的哈希索引数据结构如下所示:

... table[hash(keyA)] = dataA table[hash(keyB)] = dataB table[hash(keyC)] = dataC table[hash(keyD)] = dataD ...

在这种情况下,使用具有不同哈希值的关键字更改,删除或添加数据的时间几乎是恒定的。 通过使用关键字的哈希值作为索引,可以轻松找到位置,并且无需迭代列表即可立即显示数据。
让我们看一下哈希索引数据结构的另一种不利状态:

...     hash(keyA) == hash(keyB) == hash(keyC) == hash(keyD)= k table[k] = dataA -> dataB -> dataC -> dataD ...

像这样的结构,CRUD操作的恒定时间已经结束了……

  1. 计算关键字的哈希值
  2. 遍历链表
  3. 比较每个条目的关键字(如果它与应用程序正在寻找的关键字匹配)

这会大大减慢处理线程的速度。 一个非常快的数据结构已变成一个链表,并带有额外的开销(计算哈希值)。 散列索引数据结构的所有好处都将被抹去。 好像还不够糟糕,大多数哈希索引数据结构都启用了称为重新哈希的功能。 当数据结构超过定义的负载(例如,在Java中为75%)时,出于优化原因,将重新整理表。 大多数情况下,绝对希望使用此功能,但在这种特殊情况下,它甚至会减慢整个过程。

利用问题

要利用此行为,必须计算出一大堆冲突关键字。 例如,如果我们假设关键字的类型为java.lang.String ,我们可以看一下其hashCode ()函数:

public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; }

这似乎是DJ Bernstein设计的功能DJBX33A的自定义版本,可以很容易地发现冲突。
该函数具有一个有趣的属性,将在以下示例中进行演示:

"0w".hashCode() = 1607 "1X".hashCode() = 1607 "29".hashCode() = 1607 "0w1X".hashCode() = 1545934 "0w29".hashCode() = 1545934 "1X0w".hashCode() = 1545934 "1X29".hashCode() = 1545934 "290w".hashCode() = 1545934 "291X".hashCode() = 1545934 ...

我们看到碰撞值的串联再次导致碰撞值。 我们可以继续做下去,并获得大量碰撞关键字。 这使查找冲突比单纯的暴力破解更加容易。

我们针对本地Web服务对此进行了测试,并且可以通过使用冲突关键字作为标记属性来显着降低正在运行的Web应用程序服务器的速度。
我不确定是否真的可能使计算机崩溃,或者是否存在某种非显而易见的机制来防止服务器自行杀死(我们尚未在服务器端研究处理代码),但是可以肯定地阻止服务器在可接受的时间内正常运行。 对Web服务的请求很容易被延迟。

也许我会在不久的将来付出一些努力来收集测量数据(#colliding keys –系统响应时间)。 如果我这样做,您将在此博客上找到数据…

带你去的拐角点

  • 永远不要只依赖hashCode() –容易出错
  • 避免像
    if(password.hashCode() == referencePassword.hashCode()) {
    } else {
  • 在决定/反对数据类型/结构时,花几秒钟的时间在实现细节上
  • 筛选传入的数据–裁剪其大小,拒绝超长参数等。
  • 小心,并始终注意编码最佳实践!

进一步有趣的观点

在此示例中,我们使用java.lang.String作为关键字对象。 有趣的是还可以使用什么,以及在JRE代码或大量使用的项目中,冲突的哈希值在何处用于数据结构或什至更糟糕的目的。
可以看看Object.hashCode ()是如何实现的(它是本机代码)–这将是一个不错的目标,因为所有其他对象都扩展了该基类。 如果扩展类没有覆盖hashCode ()函数,而是依赖于正确的,无冲突的输出,则这对于更复杂的攻击可能很有用。 考虑一下如果序列化依赖于相应的代码会发生什么……。

如果有人已经知道一些脆弱的地方,请告诉我们! 我们非常有兴趣,但是由于时间有限,无法达到我们想要的深度。

谢谢

我要再次感谢Juraj Somorovsky所做的丰富的联合研究工作! 此外,我们还要感谢oCERT团队的Andrea Barisani和红帽安全响应团队的 Vincent Danen ,他们与我们讨论了这个问题!

参考:从我们的JCG合作伙伴处 调查HashDoS问题   Java安全和相关主题博客中的Christopher Meyer。


翻译自: https://www.javacodegeeks.com/2012/02/investigating-hashdos-issue.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/373238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linq 和 EF Contains示例

List<int> unitIDListnew List<int>(); //此处添加int元素 var query DB.ElecConsumers.Where(c > unitIDList.Contains(c.ParentUnitID)); //EF方式 var query1 (from c in DB.ElecConsumers where unitIDList.Contains(c.ParentUnitID ) select c); //Linq方…

date 显示或设置系统时间和日期

显示或设置系统时间和日期 date [options] [format] date [options] [new date] date用来显示系统的时间和日期&#xff0c;超级用户可以使用date来更改系统时钟 选项 %H 小时&#xff0c;24小时制&#xff08;00~23&#xff09; %I 小时&#xff0c;12小时制&#xff…

Java 7:WatchService

在Java 7的所有新功能中&#xff0c;更有趣的是WatchService&#xff0c;它增加了监视目录更改的功能。 WatchService直接映射到本机文件事件通知机制&#xff08;如果有&#xff09;。 如果本机事件通知机制不可用&#xff0c;则默认实现将使用轮询。 结果&#xff0c;响应性&…

做一件事情的3个关键指标:兴趣、能力和回报

最近突然有了一点新的感悟&#xff0c;在原有的认识基础之上。关于找工作&#xff0c;大家说的最多的&#xff0c;根据自己的“兴趣”和“能力”。我觉得这是不够的&#xff0c;还应该加上一个“回报”。兴趣&#xff1a;对一件事有没有愿望去尝试&#xff0c;侧重“好奇心”。…

iOS应用内支付(IAP)详解

在iOS开发中如果涉及到虚拟物品的购买&#xff0c;就需要使用IAP服务&#xff0c;我们今天来看看如何实现。 在实现代码之前我们先做一些准备工作&#xff0c;一步步来看。 1、IAP流程 IAP流程分为两种&#xff0c;一种是直接使用Apple的服务器进行购买和验证&#xff0c;另一种…

vagrant box php,vagrant box php开发环境配置 -- nginx

centos7.3 直接用yum安装nginx的版本是1.10.2&#xff0c;当前的最新稳定版是1.10.3&#xff0c;暂时不更新&#xff0c;直接安装yum安装nginxsudo yum install -y nginx测试nginx -t启动sudo service nginx startps -ef|grep nginxcurl -i localhost在virtualbox设置网络的端口…

使用ASM 4处理Java类文件–第二部分:Tree API

什么是ASM树API&#xff1a; ASM树API是ASM的一部分&#xff0c;可让您创建/修改内存中的类。 该类被视为信息树。 像整个类一样&#xff0c;它是ClassNode的实例&#xff0c;其中包含FieldNode对象列表&#xff0c;MethodNode对象列表等。本文假设读者已经在这里阅读了第一部分…

php 去除 html 属性,用PHP 去掉所有html标签里的部分属性

用PHP 去掉所有html标签里的部分属性http://zhidao.baidu.com/question/418471924.html用PHP 去掉所有html标签里的部分属性 tppabsset_time_limit(0);function view_dir($dir){$dpopendir($dir); //打开目录句柄//echo "".$dir."";$path2;while ($file r…

在Windows上安装Elasticsearch 5.0

在windows上安装Elasticsearch Elasticsearch可以使用.zip软件包安装在Windows上。 elasticsearch-service.bat命令&#xff0c;它将设置Elasticsearch作为服务运行。 Elasticsearch的最新稳定版在Download Elasticsearch下载&#xff0c;其他的版本在Past Releases page下载。…

Java EE 6示例– Galleria

您是否一直想知道在哪里可以找到使用Java EE 6构建的良好端到端示例&#xff1f; 我有。 您在网上找到的大多数东西都是非常基础的&#xff0c;不能解决现实世界中的问题。 Java EE 6教程就是这样。 所有其他内容&#xff0c;例如Adam Bien所发表的大多数内容&#xff0c;都是范…

二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf

二维有限体积法计算热传导及源码//#include "stdafx.h"#include #include #include #include #include using namespace std;#define q 500#define k 1000void main (){ //input the value you want:double L,dx,dy,T,Ax,Ay,d;int m,n,i,j,kk,mm ;//char str1[20];ch…

ubuntu与win10互换硬盘

实例&#xff1a;将sdb上的ubuntu转移至sda&#xff0c;将sda上的win转移至sdb1. 备份资料2. 制作老毛桃PE盘3. 格式化sda4. dd if/dev/sdb of/dev/sda ,将sdb克隆到sda上5. 利用Linux live cd修复grub2&#xff08;BIOS不会认GPT分区&#xff09; sudo grub-install /dev/sda …

如何在Jetty中使用SPDY

SPDY是Google提出的一种新协议&#xff0c;是针对网络的新协议。 SPDY与HTTP兼容&#xff0c;但尝试通过压缩&#xff0c;多路复用和优先级降低网页负载。准确地说&#xff0c;快速的目标是&#xff1a;&#xff08; http://dev.chromium.org/spdy/spdy-whitepaper &#xff09…

虐杀外星人java,逆天游戏《毁灭全人类2》登PS4 外星人疯狂虐杀地球人

逆天游戏《毁灭全人类2》登PS4 外星人疯狂虐杀地球人2016-10-17 10:45:58来源&#xff1a;游戏下载编辑&#xff1a;小年青评论(0)广大的小伙伴都有看过许多外星人企图入侵毁灭地球的电影&#xff0c;已此为题材而开发的游戏也不在少数。近日泛欧洲游戏信息组织又为一款该种题材…

电脑快捷键大全

最常用的快捷键F5------刷新 DELETE-----删除 TAB----改变焦点CTRLC-----复制 CTRLX-----剪切 CTRLV----粘贴CTRLA-----全选 CTRLZ-----撤销 CTRLS-----保存 ALTF4-----关闭 CTRLY-----恢复 ALTTAB-----切换CTRLF5---强制刷新…

ORM仇恨者无法理解

我看过无数的文章和评论&#xff08;尤其是评论&#xff09;&#xff0c;它们告诉我们ORM&#xff08;对象关系映射&#xff09;的概念有多糟糕&#xff0c;糟糕和错误。 以下是通常的声明&#xff0c;以及我对它们的评论&#xff1a; “它们很慢” –映射有一些开销&#xff0…

Android之仿微信图片选择器

先上效果图。第一张图显示的是“相机”文件夹中的所有图片&#xff1b;通过点击多张图片可以到第二张图所示的效果&#xff08;被选择的图片会变暗&#xff0c;同时选择按钮变亮&#xff09;&#xff1b;点击最下面的那一栏可以到第三张图所示的效果&#xff08;显示手机中所有…

oracle 快照用途,Oracle快照原理及实现总结

oracle数据库的快照是一个表&#xff0c;它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。也就是说快照根本的原理就是将本地或远程数据库上的一个查询结果保存在一个表中。以下是建立的Snapshot&#xff0c;目的是从业务数据库上将数据Copy到处理数据库上&a…

loss function

什么是loss? loss: loss是我们用来对模型满意程度的指标。loss设计的原则是&#xff1a;模型越好loss越低&#xff0c;模型越差loss越高&#xff0c;但也有过拟合的情况。     loss function: 在分类问题中&#xff0c;输入样本经过含权重矩阵θ的模型后会得出关于各个类别…

复杂的(事件)世界

这篇博客文章试图总结CEP领域中的技术&#xff0c;并探讨它们的主要功能和不足。 有时似乎过度使用了CEP一词&#xff08;就像ESB一样&#xff09;&#xff0c;下面的文章反映了我们对它的理解和理解。 ESPER&#xff08; http://esper.codehaus.org/ &#xff09;是流行的开源…