欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

NotPetya 勒索病毒Salsa20算法实现的缺陷分析

来源:本站整理 作者:佚名 时间:2017-07-29 TAG: 我要投稿

2017年6月份,NotPetya勒索病毒试图通过The Shadow Brokers泄露出的“永恒之蓝”等漏洞再次攻击全球网络系统。目前,关于NotPetya的算法解密工作目前并没有明确的解密进展。
360CERT团队在对NotPetya病毒所自定义实现的Salsa20算法分析过程中,发现存在两处变化。其中一处明显降低了标准Salsa20算法的加密强度,在一定条件下可以对加密数据进行解密。
0x01 Salsa20的简单介绍
Salsa20的原理是产生一种伪随机的字节流。 这种字节流在很长(约2的70次方)范围内和真正的随机字节流无法区分。 这样做到了和一次一密密码本(OTP,One Time Pad)加密等价的效果。
伪随机数流的产生其实就是将64字节(512比特)的输入送入核心函数,然后得到512比特的输出的过程。 每次输入的字节包含密钥、初始向量和计数器。 这样,要产生长度是N字节的伪随机数流,只需要调用核心函数若干次,直到获取了足够长度(不少于N)的输出即可。
64字节的输入如下:
 

本文所讨论的差异就是上面64字节产生的不同,核心函数都是相同的。
0x02 差异一:常量不同
原算法的常量:
 

样本的常量:
 

【结论】对算法的强度没有影响
0x03 差异二:小端化函数不同
原算法s20_littleendian函数:
 

样本s20_littleendian函数:
 

【差异】样本中原本是想模拟原算法的操作,但因为要在MBR中运行,采用了WORD为单位的运算,shl ax 10h时就会把ax清零。这样导致的后果就是64字节的输入的高位WORD会被填充为0,相当于将原函数改为:
 

【效果】原先的64字节输入:
0xdeadbeef 0xdeadbeef……0xdeadbeef(一共16个0xdeadbeef)
经过s20_littleendian函数后:
0x0000beef 0x0000beef ……0x0000beef(一共16个0x0000beef)
【影响】进入核心函数后:
 

虽然输入的随机序列有一半为零,但是经过1轮异或移位的操作,随机序列已经不含零了。并且该算法要进行10轮这样的操作,所以得到的序列随机化程度还是很高。
进入核心函数前:
 

经过一轮异或移位操作后:
 

【结论】 64字节的输入经过小端化函数后会导致高位2个字节清零。这样的话,爆破该输入的规模就从2的256次方降为了2的128次方,约为10的38次方,所以直接爆破出密钥的可能性几乎没有。
0x04“修改版”Salsa20算法的缺陷攻击
NotPetya勒索病毒的修改版Salsa20算法造成的差异会导致每隔64K块出现重复的核心函数输入项,这将极大影响这种加密算法的安全性。对此,算法攻击者只要已知连续4MB明文,就能解密全部密文。另外若已知若干离散明文块,则可解密部分密文,也可能解密全部密文(已知部分分布合适的情况)。
相关证明如下:
 

0x05 与Petya中修改Salsa进行对比
Petya中修改的Salsa分析链接:
http://www.freebuf.com/vuls/101714.html
(1)秘钥空间不同
Petya中为了方便用户输入,字符必须从数字和大小写字母中选取,定义了54种有效字符:
 

来作为8位的原始秘钥,同时用低位为b与字符“z”对应ASCII(122)之和,高位为b*2来扩展成16字节的秘钥。其实只有8个秘钥需要破解,所以秘钥空间为:54^8。
NotPetya中,一共是32个字节,但是由于清零了一半,所以一共是16个字节需要破解,秘钥空间为2^128。
(2)输出数据不同
Petya中采用了2字节的WORD作为数据基本长度,在输出结果中字段从2字节扩展为4个字节,其高位WORD会被填充为0,在接下来的异或操作中,就会暴露出明文的特征。

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载