有一个小村庄,村民分为好人与坏人。村委会给认定的好人颁发带指纹的好人卡,拥有好人卡的村民畅行无阻,而没卡的坏人则处处受阻。在这个机制下,小村庄得以维持着暂时的平静安宁。
当我们用攻防对抗的视角来看,会发现小村庄的“好人卡机制”并非牢不可破——坏人有没有可能搞到一张好人卡,从而伪装身份为非作歹呢?
放在数字世界里,如果“好人”是正常程序,“坏人”是恶意程序,“好人卡”则是数字证书签名。当坏人想要洗白,关键问题就在于:如何伪造一张相同指纹的好人卡?
于是,本着寻找防护破绽、以攻促防的研究目的,我们展开了一次特殊的实验——让一个恶意程序文件与一个已有的正常文件(具有权威数字证书签名文件)具备相同的MD5值。
一次失败的尝试:离成功只差“亿”点点
我们知道,MD5值的复杂度为2的128次方。此前,我们成功尝试过短时间内让60个不同文件碰撞出相同的MD5(详情可见《这可能是史上最“费力”的奖品》),而这次的MD5碰撞则直接进阶到Hell模式——碰撞一个特定白文件的MD5值。
当MD5值从“随机”变成“指定”,理论上暴力碰撞需要几万亿年,这似乎变成了一个不可能完成的任务。面对天文数字的时间消耗,显然不能采用纯暴力碰撞的方法。在对公开论文的研究基础上,我们融入黑客思维,并对相关方法进行了改进,主要思路如下:分别对程序A(恶意文件)与指定程序B(白文件)添加不同的附加数据,再借助安全算力平台进行MD5碰撞破解。
经过几个小时的碰撞,成功让一黑一白两个文件的MD5值完全相同。然而我们发现,由于修改了白文件的数据,其微软数字签名也随之失效。这就好比千辛万苦搞到一张一模一样的好人卡,却是一张废卡,功亏一篑。
图:微软数字签名失效
黑客思维+安全算力=把不可能变成可能
回看我们的最终目标:碰撞一个带权威数字签名的PE白文件,MD5值相同,且碰撞后白文件的数字签名依然有效。
为了达到这个目标,我们汲取上次失败的教训,转变思路——在安全算力平台上进行MD5碰撞前,先解决PE文件在不破坏数字签名情况下,修改数据的难题。
图:整体思路
这里技术细节不累述,说说其中一个最大的难点:在开始算力碰撞之前,必须把白程序B添加的附加数据大小Z分毫不差地预测出来,否则其数字签名还是会失效。经过反复尝试,我们精准预置了这个Z大小——608字节。
由此,添加608字节的尾部数据后,在安全算力平台的强力支撑下,仅耗时175分钟(白文件大小35k),就成功碰撞出一个与具备双数字签名文件相同MD5的黑文件,且黑、白文件各自功能正常运行,白文件数字签名也保持有效。值得一提的是,在实验中我们仅仅用了部分安全算力,在投入完全安全算力的情况下,这个耗时能缩短至秒级。
图:MD5值相同,且数字签名有效
这个具有与双数字签名白文件相同MD5值的黑文件,可以说被成功“洗白”了。我们做了个小测试——当我们在测试PC端依次下载白文件以及木马病毒文件时,PC端上的某杀毒软件却没有发出任何安全告警。
这是因为,杀毒软件在首次发现一个PE文件时,会将文件提交到云端检测并记录MD5值,若为白文件,则后续遇到同样MD5值的程序,则快速认定为白文件而不再进行安全检测。
从攻击到防御的思考
总结来说,在将黑客思维和安全算力算法结合后,原本以为的不可能变成了可能,最终实现了碰撞双数字签名的白文件。这也印证了数字世界的攻击是无缝不钻的,尽管是万分之一毫米的裂缝,也能被攻击者深挖成万劫不复的深渊。
根据调研,市面上不少杀毒软件都具有这个缺陷,这无疑给了攻击者可乘之机。因此,建议杀毒软件采取措施加强防范这种威胁,例如同时记录和比对MD5和SHA1双哈希,尽可能封堵坏人尝试作恶的空子。由于该实践具有广泛的现实危害性,这里不公布详细的技术细节,不过对此感兴趣的同学可联系我们交流探讨。
来源:freebuf.com 2021-04-12 17:37:54 by: 我在鹅厂做安全
请登录后发表评论
注册