今天我们给大家推荐的文章来自华东师范大学密码学院公众号,欢迎大家关注
勒索软件这几年真是大出风头,受害者对它简直是恨之入骨,而黑产团伙借助它赚得盆满钵满。许多被勒索的企业客户都想了解,到底有没有什么方法能够不给犯罪分子交付赎金就恢复数据?这种情况当然存在,前提是需要非常全面而细致的密码学安全分析,对密码学知识进行灵活运用,今天我们就来介绍一个案例,看看密码学专家如何通过分析Akria勒索软件的密码代码实现,最终完成了对其加密数据的恢复:
首先要介绍一下Akria勒索软件,这是一个勒索软件家族的总称,其中有多个不同的变种,其中一个变种在2023年被杀毒软件公司Avast的研究人员破解(仅提供了解密程序,并没有介绍太多细节):
https://decoded.avast.io/threatresearch/decrypted-akira-ransomware/[图片]
而今天要介绍的这个Akria勒索软件变种的hash值是bcae978c17bcddc0bf6419ae978e3471197801c36f73cff2fc88cecbe3d88d1a
,是一个前面提到的Avast解密程序无法处理的版本。但是研究人员分析了它的加密算法中的关键——密钥生成算法,有如下两个发现:
-
密钥生成和勒索软件开始加密文件的时间相关(精确到纳秒);
-
勒索软件提供了一个日志(shell.log),这个日志文件指示了勒索软件运行的时间(但是只精确到毫秒,因为只能从文件系统的日志记录里面查到,而文件系统日志中这个时间记录的精度不够)
根据这些发现,大家可能会以为,既然日志文件里面有一个指示密钥生成时间的信息(虽然没那么精确),我们是不是只需要穷搜索一下这个不那么精确的时刻附近的所有值,就可以发现解密密钥了呢?
不幸的是,这个方法行不通,原因是这款勒索软件实际上使用了4个时间戳(均是精确到纳秒),虽然都是在日志文件指示的那个时刻附近,这就要需要组合搜索而不是逐个去搜索单个时刻,而且由于密钥生成还涉及到1500次SHA-256迭代,因此简单的穷搜索算法的开销是我们难以承受的,还需要去寻找更多信息来减少搜索的工作量。此外,文件系统的日志记录的是文件读写结束后执行关闭操作(例如fclose
)那个时刻的信息,而非文件被修改的初始时刻,这也给穷搜索增加了难度。
为了获得更多线索,研究人员逆向分析了Akria勒索软件变种,对其中的密钥生成算法进行了精确的还原(在逆向中还发现这款勒索软件使用的是nettle
这个密码库):
首先注意到这里使用了一个叫做Yarrow
的算法,它是知名密码学家John Kelsey、Bruce Schneier和Niels Ferguson在上世纪设计的一个伪随机数发生器(PRNG)算法,后来被Bruce Schneier和Niels Ferguson设计的Fortuna
算法取代。在上面展示的generate_random
函数中,唯一影响生成随机数的因素就是代码执行那个时刻的时间戳。而在加密文件的时候,勒索软件会连续调用4次generate_random
函数,生成4个不同的随机值(如下图所示,注意原文图中写错了,最后一行应该是kcipher2_iv
):
这四个随机值被用来加密文件,而且对应了两个不同的流密码算法(chacha8和kcipher2);而在被勒索软件使用之后,这四个随机值经过RSA-4096公钥加密,然后附加到了被加密的数据文件之后。由于没有对应的私钥,我们当然没法去解密得到这四个随机值,因此只能继续探索如何来进行更有效的穷搜索。
研究人员进一步分析了Akria勒索软件变种的加密策略,发现在实际运行中,勒索软件首先会对文件进行分块,然后对于每个块(block),只加密其中一定比例的数据(这个比例参数在不同变种中可以调整,比如15%)。而且每个块的前0xFFFF(65535)字节是用kcipher2加密的,后面的数据才会用chacha8来加密。
在这里,由于加密算法都是流密码算法,而且很多被加密文件的文件头信息都是已知的(比如magic number),我们可以先不去管chacha8的加密,只去穷搜索kcipher2的密钥和iv,但是这里比较关键的一点是如何估计出两次generate_random
函数的执行间隔,因为要穷搜索的是两个随机值组成的一对(key、iv),只有合理估计出这个间隔,我们才能减少组合搜索的值。
研究人员根据被勒索的系统环境的特点,构建类似的硬件环境去重新执行勒索软件的密钥生成逻辑,然后大致估计出了两次generate_random
函数的执行间隔(下图中t3和t4之间的间隔):
接下来,研究人员要估计的是密钥生成的时间范围(也就是上图中t3可能的范围),对于那些很小的文件,文件开始被加密的时刻不会和加密结束文件写回的时刻差太远,因此估计t3比较容易;而对于很大的文件,我们只能从它的时间戳里面知道这个文件被加密结束的时刻,要推测出它开始被加密的时刻应该怎么办呢?
研究人员在这里用了一个非常巧妙的推测:尽管我们不知道一个文件具体是什么时刻开始被加密的,但是由于这款勒索软件使用了多线程加密,而且被攻击的系统中的文件非常多,必然有一个加密队列(如下图所示),那么一个文件开始加密的时刻,会非常接近于另一个文件加密完成的时间戳!尽管我们不知道那另一个文件是哪个文件,但这无非就是收集所有的文件,把它们的时间戳形成一个集合,然后就在每个时间戳的附近进行搜索即可!
在精确估算了这些信息(并且根据文件系统的日志提示)后,只需要测试45,000,000,000,000,000这么多对组合,就应该可以找到密钥!看起来似乎复杂度很高,实际上在人工智能对算力的驱动下,现代CPU和GPU的运算能力已经突飞猛进,在一张RTX 3090卡上,每秒就能够执行15亿次kcipher2运算,而现在还有非常多可以在线随时租用的GPU资源池(特别是那种很多玩家共享自己的GPU出来形成的资源池),注意到针对Akria勒索软件加密的测试并不需要共享显存,只需要增加运算资源并行去搜索就足够了。在本文的案例中,按照一块RTX 4090显卡租用一小时需要0.69美元计算,研究人员大约花费了1200美元(大约是1740个GPU小时,包括调试和执行真实的密钥搜索的时间开销)就完成了解密,这比支付勒索软件赎金的价格要便宜得多!
在今天的这篇技术分享中,我们看到了密码学不仅是理论分析,也包含了许多工程实践。充分掌握密码学的方方面面,不仅可以保护我们的数据安全,也能够帮助大家在生活中对抗恶意软件。欢迎大家关注我们的公众号,也欢迎对密码学感兴趣的老师和同学加入我们!
更多技术细节请参考原文:https://tinyhack.com/2025/03/13/decrypting-encrypted-files-from-akira-ransomware-linux-esxi-variant-2024-using-a-bunch-of-gpus/
原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2025-03-20 如何利用密码学知识破解Akria勒索软件
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论