最常见的勒索软件程序是在执行过程中删除原始文件,还是在最后大量删除?

信息安全 恶意软件 病毒 勒索软件
2021-09-04 16:26:47

我说的是最常见的品种,如 Cryptolocker、Cryptowall、Torrentlocker、KeRanger、RSA4096 等。(不一定需要回答所有这些问题,可能需要一两个。)如果最普遍的不同,答案可以分为每个程序或类别的部分。

他们是否 A:创建文件的加密副本,然后删除该文件的原始文件,然后继续下一个,等等?

还是他们 B:在一次批量操作中创建所有文件的加密副本,然后在最后执行一次大型删除操作?

当他们删除时,他们是否也会覆盖驱动器上的相关扇区?(这需要时间。)不过,这将彻底防止任何给定文件被 Recuva 和 Photorec 等软件恢复。

由于勒索软件希望在完全完成工作之前一直处于隐藏状态,因此它希望保持隐秘并尽可能少地发出其存在的迹象。

从勒索软件作者的角度来看,A 的缺点是如果用户在操作期间试图访问他们的文件,他们会注意到他们的文件已经消失(或损坏,如果加密文件只是替换文件夹层次结构中的原始文件) .) 这可能意味着勒索软件被发现或不被允许完成其要求赎金的工作。

另一方面,B 给犯罪分子带来的不利条件是原始文件直到最后都可以访问。这意味着如果用户在运行过程中通过其他方式发现了勒索软件,他们可以轻松恢复数据。

重复这个问题,最普遍的勒索软件类型是如何试图“解决”这个“问题”的?

也许这对他们来说根本不是什么大问题,因为大多数受到影响的人可能没有足够的警觉来捕捉勒索软件的中期操作(如 B 中),或者如果他们注意到他们的文件不见了(如在一个)?

2个回答

除了 Angel 的回应,正如您提到的流行的勒索软件变体中所见,加密是逐个文件完成的,其中一个文件被加密,然后文件的纯文本版本被删除,然后勒索软件移动到下一个文件。它可能会启动并行线程来加密多个文件,但结果与我们的目的相同。让我们看看 eda2、Cryptowall 和 CTB-Locker 是如何做到的。

eda2(开源勒索软件)
让我们从开源勒索软件eda2开始,作者从 github 上删除了代码,它的作用是这样的:

    //Encrypts a file with AES algorithm
    public void EncryptFile(string file, string password)
    {
        byte[] bytesToBeEncrypted = File.ReadAllBytes(file);
        byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

        // Hash the password with SHA256
        passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

        byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);

        File.WriteAllBytes(file, bytesEncrypted);
        System.IO.File.Move(file, file + ".locked"); //new file extension
    }

它开始检查驱动器和目录,递归地将每个与其条件匹配的文件(文件扩展名在其预定义列表中)传递给 EncryptFile 方法,并且该文件被其加密版本覆盖。


Cryptowall 4
Cryptowall 4 由Cisco Talos分析,此图显示了其加密过程: 此勒索软件运行多个单独的线程,其中一个是执行加密部分的“DoFilesEncryption”线程。
               加密墙

遍历文件夹并找到文件后:

此时真正的文件内容加密发生,原始文件以 512 KB 块的块读取。每个块都使用生成的密钥加密,使用 AES-CBC 256 算法,并直接写入新文件(连同前四个字节中的块大小)。

删除是这样的:

// Move the new encrypted file name in the old original position, replacing the old one

bRetVal = MoveFileEx(newEncFileName, lpOrgFileName,
MOVEFILE_WRITE_THROUGH | MOVEFILE_REPLACE_EXISTING);
if (!bRetVal)
// Delete the old file in the standard manner:
    DeleteFile(lpOrgFileName);
else {
    // Rename the original replaced file in the new random file name
    bRetVal = MoveFileEx(lpOrgFileName, newEncFileName, MOVEFILE_REPLACE_EXISTING);
}

CTB-Locker
正如这里分析的那样,有点像 Cryptowall,有一个线程负责加密文件,这个例程在其中发生:

  • 使用 MoveFileEx API 调用将文件移动到临时文件(%TEMP%\<name>.tmp 其中 <name> 由 corehash 确定)
  • 临时文件被读入内存
  • 生成非对称密钥对和对称密钥
  • 文件缓冲区使用 zlib 库中的 DEFLATE 数据压缩算法进行压缩(静态链接到可执行文件)
  • 压缩后,文件缓冲区使用 AES-256-ECB 加密
  • 包含与此文件关联的公钥和加密信息向量的标头被添加到加密数据之前
  • 标头前缀的加密缓冲区被写入临时文件
  • 使用 MoveFileEx API 调用移动临时文件以覆盖原始文件,并在原始文件中附加一个新的扩展名(派生自 corehash)

进一步的思考和总结
如上所述,文件在旅途中被加密,通常被其加密版本覆盖。现在让我们分析一下这个设计。在我看来,逐个加密和替换文件是一个更好的选择。

  • 一个一个加密文件很容易实现
  • 如果勒索软件在运行过程中被阻止,一些重要文件仍有可能被加密并且受害者愿意付费
  • 批量加密然后批量删除文件需要额外的磁盘空间和复杂的文件删除

保持沉默和隐藏是勒索软件的担忧之一,另一个担忧是它们必须快速。它们还必须简单,以便可执行文件尽可能小。
它们针对未受保护的系统,这些恶意软件使用的漏洞利用工具包针对 Flash 等应用程序中的漏洞,它们还从没有数据备份的受害者那里获利,因此通常它们不必处理强化和超级安全的系统. 他们只是针对未受保护的未备份用户。他们不必是防弹的才能盈利,他们只需要足够好,所以有时他们没有最好的实施。

现在,为了解决加密大文件时的性能问题,我看到勒索软件使用的一种技术是仅加密文件的前 n 字节。这通常足以破坏大多数文件,并且比加密整个文件要快得多。不幸的是,此时我找不到使用这种技术的特定勒索软件的名称。

中途
发现勒索软件 请参阅中途发现加密勒索软件怎么办?作为背景,在操作过程中捕获勒索软件并不一定能让您完全停止它或取回所有文件。

勒索软件不会加密你的整个文件系统,它们通常会保持可执行文件完好无损,因此受害者必须打开图像、文档或类似的东西才能注意到有问题。
即使对于尚未对勒索软件进行过一些研究的精通计算机的人来说,也可能不清楚发生了什么,文档损坏或无法打开的原因可能有很多(一些勒索软件不会改变文件的扩展名)。将此添加到有人实际注意到勒索软件正在加密他们的文件的可能性上,这似乎并不是一个主要问题。

即使这是一个主要问题,而不是批量加密/删除,恶意软件也可以监控用户活动,同时保持隐藏状态,不进行加密,一旦发现用户处于非活动状态/afk,它就可以启动加密过程。

它们主要是逐个文件的。因此,如果您“幸运”,您可能会发现自己只感染了一些文件夹。有几个原因:

  • 易于编码。只需遍历每个文件,重复加密例程。

  • 适用于外部程序。有时,勒索软件会使用第三方程序来处理文件以执行加密。

  • 没有全盘问题。选项 B 至少需要 50% 的空闲硬盘。你们中有多少人有这个空间?

  • 即使您在操作过程中发现了勒索软件,使用选项 A 也有可能一些非常重要的文件被加密,您仍然需要付费。如果原始文件只是在最后被删除,那将永远不会发生。

但也许最重要的是,它允许他们就地覆盖文件。

这对于反取证和“加密优化”都很重要。

他们可以例如复制一个 100 MB 的文件,而不是复制一个 100 MB 的文件。打开文件,加密前 1 MB 并将其保存到磁盘中的相同位置(可能还附加一些特定于勒索软件的数据)。用户留下了一个 100 MB 的“加密”文件,原始应用程序无法打开该文件,但只需要大约 2 MB 的 I/O 传输。

当您试图使磁盘中的每个文档都不可用时,这真的很重要。