AES、ChaCha20、Salsa20 在勒索软件中的工程用法、间歇加密技术及其安全折损的系统性分析。
对称密码负责勒索软件中 99% 以上的加密运算量。攻击者对它的核心诉求按优先级排序是:速度、速度,还是速度——必须在备份系统响应、EDR 告警升级、管理员断网之前完成加密"收网"。由此衍生出三条清晰的技术演进线索:硬件加速(AES-NI)、软件高效流密码(ChaCha20/Salsa20)、以及以间歇加密(Intermittent Encryption)为代表的"少加密一点"哲学。
AES 自 FIPS 197 标准化后成为操作系统与 CPU 的原生能力(AES-NI 指令集,单核吞吐可达数 GB/s)。LockBit 等家族直接调用系统 CryptoAPI,利用 AES-NI 将单文件加密压到毫秒级。
ChaCha20/Salsa20 基于 ARX(加法-旋转-异或)结构,无需硬件指令即可在纯软件实现中达到接近 AES-NI 的吞吐,且天然免疫时序侧信道——这是 Conti、BlackCat、Akira 等新一代家族,尤其 Rust 系家族偏爱它的根本原因。
只加密文件的部分区块(头部、定距分块或按比例抽样),在"看起来完全不可用"与"加密耗时"之间取得攻击者视角的最优平衡——代价是留下可恢复的明文分块,成为数据恢复与检测的突破口。
规范:NIST FIPS 197(2001)标准化,分组长度 128 位,密钥 128/192/256 位,SPN 结构、10–14 轮。勒索软件几乎全部使用 AES-256,配合 CryptEncrypt 等系统 API 时默认走 CBC 模式(NIST SP 800-38A)[01][02]。
典型用法:WannaCry 为每个文件生成 16 字节的 AES-128 密钥并以 CBC 模式加密,随后用内置 RSA-2048 公钥封装该密钥——这是教科书式的混合加密,无任何公开实现缺陷[19]。LockBit 2.0/3.0 采用 AES-256-CBC,并对文件头部区块实施部分加密以换取速度。
分析要点:① IV 是否随机且与密钥一同封装;② 分组填充(PKCS#7)处理是否完整——Ryuk 解密器曾在大文件恢复时错误截断最后一个字节,毁掉 VHDX/数据库文件,说明填充与长度记账是最易出错的工程细节[23];③ 是否复用密钥与 IV 对(CBC 下 IV 重复不直接泄露明文,但结合固定前缀会产生模式泄露);④ 调用栈中 BCryptEncrypt 的批量特征可用于 EDR 行为检测。
规范:IETF RFC 8439(2018)定义 ChaCha20-Poly1305。20 轮 ARX 结构,256 位密钥 + 96 位 nonce + 32 位计数器,生成与明文等长的密钥流后异或。纯软件实现吞吐高、常数时间、无查表——在缺少 AES-NI 的 ESXi/ARM/容器中优势明显[04]。
典型用法:Conti 以 ChaCha20 加密数据、X25519 封装密钥;BlackCat/ALPHV 将 ChaCha20(或 AES)作为可选项;Akira 使用 ChaCha20(部分后续版本的公开报告采用轮数缩减的 ChaCha8 提速),封装层采用 RSA-4096(CISA 通报确认);其 C++/Boost 异步加密实现与泄露的 Conti 源码存在显著相似性[17][18][25]。
分析要点:流密码的本质是一次一密的工程化——密钥流复用即灾难:两个明文用同一密钥流加密后异或,即得两明文的异或值,可被已知明文/ crib-dragging 技术击穿。Hive 正是栽在自研"双密钥流 XOR"设计上(第 4 册详析)[13][14]。分析时应重点核对:nonce 空间与计数器溢出保护、每文件密钥是否独立、密钥流偏移是否被复用。
规范:Bernstein 设计(2005),入选 eSTREAM 最终组合流密码,至今无对完整 20 轮的有效攻击[05][06]。REvil/Sodinokibi、GandCrab、DarkSide 均采用 Salsa20 作为数据加密原语,封装层分别使用 Curve25519 或 RSA。
反面教材:2016 年的 Petya 自实现了一个"缩水版 Salsa20"(社区戏称 Salsa10):流位置用 32 位变量、旋转操作误用 16 位类型、内部缓冲错误降宽,导致 512 位密钥流中 256 位可预测——Check Point 公开了三处缺陷的技术细节,leo-stone 以遗传算法实现秒级破解[15][16]。同一份源码教训的另一面是 NotPetya 修复了实现 Bug 却擦除了密钥,使受害者付款也无门(第 3 册详析)[20]。
分析要点:流密码实现审计的黄金法则——对照参考实现逐轮核验状态矩阵、轮函数常量(如 expand 32-byte k 常量是否被篡改,NotPetya 将其替换为自定义串 -1nvald s3ct-id(经 Malwarebytes 逆向确认:该替换不削弱密码强度,但可解读为"invalid sector id",成为研判其"非求财"意图的密码学旁证之一[20]))、nonce 拼接顺序与密钥流偏移。
间歇加密并非某一种算法,而是一种加密调度策略:只处理文件的部分区块。Pavur 与 Martinović 在 NDSS 2020 的基准研究中系统评估了此类方案,证明其可将加密耗时压缩数倍,同时仍能让文件"不可用"——但安全性损失是可度量、可利用的[07]。
| 策略类型 | 机制 | 代表家族 | 安全后果 |
|---|---|---|---|
| 头部加密 | 仅加密文件起始区块(常见为 4KB 量级) | LockBit 系列(公开样本分析) | 文件签名、元数据被破坏即"不可用",但主体明文可残留 |
| 定距分块 | 按固定步长抽取区块加密(如每 N 字节取 M 字节) | Ryuk(大于 57,000,000 字节≈54.4MB 的文件按 1MB 粒度分块,尾部含加密块计数器)[23] | 未加密分块可被拼接恢复,数据库页面级抢救成为可能 |
| 比例/档位加密 | 运营者按"速度—彻底"档位选择加密比例 | BlackCat/ALPHV、Akira 的部分配置 | 低档位留下大量明文,恢复率随档位下降而上升 |
① 时间预算:大型数据库/VHDX 全量加密耗时不可接受;② 规避检测:部分文件熵升幅度低,可绕过基于熵突变的粗粒度检测;③ 心理学:头部损坏足以让系统与业务停摆,受害者感知与全量加密无异。
① 数据抢救:未加密分块可拼接出可用文档/数据库页(Ryuk 案例实战中已用于恢复 VHDX/Oracle 文件)[23];② 已知明文:残留的明文+密文对是密码分析(含解密器 PoC 验证)的关键输入;③ 检测特征:定距加密产生规则的空洞熵模式,可被文件系统遥测识别。
以下八类缺陷在真实勒索软件中反复出现,是样本审计与解密工具开发的首要检查项。任何一项命中,都可能让"不可破解"变成"可以恢复"。
| # | 缺陷类型 | 技术说明 | 可利用后果 | 真实案例 |
|---|---|---|---|---|
| 1 | 弱随机数源 | 用时间戳/GetTickCount/自实现 LCG 播种密钥 | 密钥空间塌缩至可暴力枚举 | CryptoDefense(2014)及历史弱 PRNG 家族[21] |
| 2 | 密钥流/nonce 复用 | 多文件共享密钥流或复用 (key, nonce) 对 | 已知明文异或泄漏,主密钥可恢复 | Hive(2022)[13][14] |
| 3 | 算法误用/降级实现 | 自实现轮函数时变量位宽、常量、轮数错误 | 密钥流出现可预测结构,穷举量骤降 | Petya "Salsa10"(2016)[15][16] |
| 4 | 密钥明文驻留内存 | 封装前的对称密钥/随机数未安全擦除 | 内存镜像取证可直接提取 | 应急响应内存捕获规程的密码学依据(第 3 册) |
| 5 | 密钥落盘残留 | 密钥/随机数写入临时文件、页面文件或未清零扇区 | 磁盘级取证可恢复 | 若干历史家族的取证报告;vss 残留分析实践 |
| 6 | 封装格式缺陷 | 封装结构可预测、含可推导字段或硬编码公钥 | 剥离封装直接取回明文密钥 | Avast 对 DoNex 加密方案的利用(2024,Recon 披露) |
| 7 | 部分加密过度 | 间歇加密比例过低 | 明文分块可拼接恢复业务数据 | Ryuk >54.4MB 大文件的部分加密[23] |
| 8 | 解密器交付 Bug | 长度记账、边界处理错误,且运行后删除原密文 | 付款者数据二次损毁(攻击者自伤) | Ryuk 解密器截断 Bug(2019,Emsisoft 披露)[22][23] |
勒索软件的算法选型看似多样,实则被同一个物理约束锁定:加密耗时必须远小于防御响应时间。Pavur 与 Martinović 在 NDSS 2020 的系统性基准测试给出了量化框架:成熟的混合方案可在数分钟内完成数万个文件的加密,而间歇加密能在此基础上进一步成倍压缩时间开销,代价是可度量的安全折损[07]。下表为定性数量级归纳(具体数值随硬件与实现差异波动,以实测为准)。
| 原语/方案 | 软件吞吐数量级(现代 x86,定性) | 硬件加速 | 勒索软件采用动因 |
|---|---|---|---|
| AES-256-CBC(经系统 CryptoAPI) | 数百 MB/s 量级(AES-NI 加持下) | AES-NI 指令集原生支持 | 调用现成系统 API 开发成本最低;LockBit 等家族直接受益[09] |
| ChaCha20 / Salsa20(纯软件流密码) | 与 AES-NI 同数量级,无需特殊指令 | 无依赖,ARM/ESXi/容器内表现稳定 | 跨平台一致性 + 常数时间天然免疫时序侧信道;Rust 系家族(BlackCat)首选[04][12] |
| RSA-2048/4096 封装 | 比对称算法低约三个数量级,仅用于封装小密钥 | — | 历史包袱与"可信宣传"(勒索信常强调 RSA-4096);单次封装成本可忽略 |
| X25519 封装 | 单次 ECDH 微秒级,32 字节公钥易内嵌 | 部分平台有 P-256 加速,X25519 主要走软件 | 密钥材料小、实现简洁(REvil、BlackCat、Qilin)[05] |
| 间歇加密 | 按加密比例线性提速(如仅加密 1/N 分块则耗时约为全量的 1/N) | — | 大文件/海量文件场景的时间预算解;留下明文分块与"空洞熵"检测指纹[07][23] |
调用 CryptEncrypt/BCryptEncrypt 的样本天然带有系统调用栈特征;自实现 ChaCha20 的样本则内嵌 "expand 32-byte k" 常量(或变体,如 NotPetya 的自定义串)。两者都是静态检测与家族聚类的高价值锚点。
间歇加密在攻击者时间账本上划算,在防御账本上同样"划算":未加密分块支撑数据抢救与已知明文分析,规律性熵空洞支撑检测。评估一个家族的实际威胁时,加密比例与算法名气同等重要。