由MurmurHash2 算法碰撞引起的Redis DDos攻击漏洞

- AV AC AU C I A
发布: 2025-04-13
修订: 2025-04-13

### 概要信息: 1. 在Martin Bosslet 2012年的[*这篇文章*](http://emboss.github.io/blog/2012/12/14/breaking-murmur-hash-flooding-dos-reloaded/)中,作者提到MurmurHash2算法被发现可以稳定构造碰撞函数,该哈希函数及其变形被CRuby, JRuby, Rubinius, Redis等开源组件使用。 2. 本文是基于Martin Bosslet的发现继续挖掘的结果,在此对Martin Bosslet表示感谢。 3. 原文中作者的碰撞函数是基于Ruby完成的,这里将发布该碰撞函数的Python版本。 4. 在Martin Bosslet的文章中对碰撞函数的构造原理未做足够透彻的解释,我将在稍后一段时间将分析构造原理的部分补充。 ### 详细信息: 1. Redis使用MurmurHash2算法作为数据结构Hashtable的哈希算法。 2. 当Hashtable出现碰撞后,Redis选择将发生碰撞的项用链表相连,最新的项插在链表首。 3. Redis将Key和对应的Value以键值对的形式储存在一个Hashtable中。 4. Redis并未将用户传入的Key进行任何编码就直接使用。 5. 在2012年MurmurHash2算法被发现可以稳定构造碰撞函数。 6. 当将大量使用在Murmurhash2算法下产生相互碰撞的字符串作为Key的键值对插入Redis后,在访问这些键值对时Hashtable的行为将退化为链表。 ### 验证: 测试平台: i3-3210,8G Ram, Redis3.2.6,位于虚拟机中(2 cores CPU, 2G Ram) Redis3.2.6中使用的Murmurhash2函数: ``` unsigned int mmhash_32(const void *key, int len) { /* 'm' and 'r' are mixing constants generated offline. They're not really 'magic', they just happen to work well. */ const uint32_t m = 0x5bd1e995; const int r = 24; /*...

0%
暂无可用Exp或PoC
当前有0条受影响产品信息