立即停止使用MD-5!
TL;DR:不要使用MD-5来识别恶意软件样本。相信我,这是个坏主意。使用SHA-256或更强的哈希函数。
这篇文章献给所有仍在用MD-5识别恶意软件样本的恶意软件研究人员。
在深入细节之前,让我先解释一下我对这个话题的看法。每当你想要识别一个恶意软件时,只有在你同时发布恶意软件的SHA-256哈希值的情况下,发布其MD-5哈希值才是可以接受的。仅发布MD-5哈希值是不专业的。如果你想了解原因,请继续阅读。如果你已经知道这个问题,但想帮我传播信息,请链接到我的网站 www.stopusingmd5now.com。
通过撰写文章/帖子等并仅发布MD-5哈希值,你不仅向人们展示了你在哈希函数方面的无能,还教其他人使用MD-5。而且它像疾病一样传播……最后但同样重要的是,如果我在你的博客文章上找到一个样本,而你只使用MD-5,我无法确定我们拥有相同的样本。
以下是一些不好的例子列表(按谷歌搜索排名顺序):
- Kaspersky
- Bromium
- Fireeye
- Webroot
- Mcafee
- Fox-IT
- Cisco
- SANS
- ESET
- Symantec
- Watchguard
不幸的是,甚至最好的恶意软件分析书籍也推广使用MD-5——参见《实用恶意软件分析》第1章第10页。
(加密)哈希函数简介
很久以前(根据一些来源自1970年起),人们开始设计哈希函数,原因多种多样。它可以用于文件完整性验证、密码验证、伪随机生成等。但加密哈希函数最重要的特性之一是,它可以用一个小的、固定长度的位串“唯一”标识一个数据块。例如,恶意软件可以仅通过哈希本身来识别,因此每个拥有相同恶意软件样本的人都会有相同的哈希值;这样他们就可以通过哈希本身来引用恶意软件。
很容易得出结论,总会存在碰撞,即不同的数据块具有相同的哈希结果。域(数据块)是无限的,而值域(可能的哈希值)是有限的。问题在于找到两个具有相同哈希的不同数据块有多容易。数学家称这种特性为“抗碰撞性”。适当的加密哈希函数是抗碰撞的,意味着找到两个具有相同哈希的不同数据块是不切实际或不可能的。
1989年,Ronald Rivest(RSA算法缩写中的第一个字母)设计了MD-2哈希算法。自1997年起,就有出版物指出这种哈希算法远非完美。
1990年,Ronald Rivest设计了MD-4算法,该算法至少从1991年起就被认为是已破解的。但MD-4仍在使用,从Windows XP到Windows 8的密码协议(NTLM)中都在使用。不幸的是,除了使用MD-4之外,NTLM还有更多严重问题,但这可能是另一篇博客文章的主题。
1991年(你可能猜到是谁)设计了另一种称为MD-5的哈希算法,以取代MD-4(由于已知的弱点)。但同样,从1993年起,多次表明MD-5也被破解。根据维基百科,“2006年3月18日,Klima发布了一种算法[17],可以在单个笔记本电脑上一分钟内找到碰撞,使用他称为隧道的方法”。这意味着,使用8年前的单台笔记本电脑的计算能力,就可以创建两个具有相同MD-5哈希的不同文件。但生成碰撞的算法自那时起已经改进,并且“2013年由Xie Tao、Fanbao Liu和Dengguo Feng发起的攻击在2^18时间内打破了MD-5的抗碰撞性。这种攻击在普通计算机上运行时间不到一秒。”这里的关键点是,设计一个既快速又安全的加密哈希函数非常困难。我敢打赌,如果我开发一个哈希函数,Ron能在几分钟内破解它。
现在,亲爱的恶意软件研究人员,考虑以下场景。你作为恶意软件分析师,找到了一个新的二进制样本。你计算了恶意软件的MD-5哈希,并在谷歌上搜索该哈希值。你在其他恶意软件研究人员或沙盒/供应商的网站上看到这个哈希值。该网站得出结论,这个样本做这做那,是恶意的或不是。要么因为该网站也仅依赖MD-5,要么因为你只检查了MD-5且研究人员或沙盒有良好声誉,你继续前进并忘记了这个二进制文件。但实际上,你的二进制文件可能与其他人分析的完全不同。这种错误的后果可能从无到灾难性不等。
如果你不相信我,只需检查Peter Sellinger网站上的hello.exe和erase.exe。相同的MD-5,不同的二进制文件;一个无害,一个(假)恶意……而且你可以在家轻松做到这一点。不需要超级计算机,不需要NSA魔法。
顺便提一下,重要的是要提到,即使今天,如果只知道MD-5哈希值,找到数据块(通用)仍然可能很困难(“原像抗性”)。当我告诉他们使用MD-5作为密码哈希函数是个坏主意时,我听到有人争论这一点。MD-5作为密码哈希的主要问题不是MD-5本身的弱点,而是缺乏盐、缺乏迭代和缺乏内存硬度。但我仍然看不到任何理由,为什么你应该使用MD-5作为任何与安全相关的构建块。你会用一辆23年未维护的汽车送孩子上学吗?如果你的答案是肯定的,你既不应该有孩子,也不应该在IT安全领域工作。
结论
如果你是一名恶意软件研究人员,并且过去仅使用MD-5来识别恶意软件样本,我建议你写1000遍:“我承诺将来不会使用MD-5来识别恶意软件。”
我甚至为此问题专门建立了一个网站,www.stopusingmd5now.com。下次你看到仅通过MD-5哈希识别恶意软件的帖子/文章/任何内容时,请链接到这篇博客文章或网站,世界将变得更美好、更专业。
PS: 如果你是一名取证调查员,或开发用于取证的软件的软件开发人员,同样适用于你。 PS 2: 如果你觉得这篇文章太 provocative 和 harsh,这是有原因的……
更新: 我在HashClash的帮助下修改了两个恶意软件(Citadel, Atrax),现在它们具有相同的MD-5。非常感谢Marc Stevens的研究、发布他的代码以及在碰撞查找过程中提供的帮助。