Marvin攻击深度复盘:RustCrypto RSA库RUSTSEC-2023-0071漏洞与marvin-toolkit复现指南

发布时间:2026/8/23 12:21:25
Marvin攻击深度复盘:RustCrypto RSA库RUSTSEC-2023-0071漏洞与marvin-toolkit复现指南 Marvin攻击深度复盘RustCrypto RSA库RUSTSEC-2023-0071漏洞与marvin-toolkit复现指南【免费下载链接】RSARSA implementation in pure Rust项目地址: https://gitcode.com/gh_mirrors/rsa1/RSA本文围绕RustCrypto RSA 库一个纯 Rust 实现的 RSA 公钥加密算法库展开完整复盘 2023 年被披露的Marvin 攻击对应安全公告RUSTSEC-2023-0071并手把手讲解如何使用项目内置的marvin-toolkit一键复现这次远程私钥恢复攻击。即使你是加密新手也能看懂每一步在做什么。一、Marvin 攻击一个只看时间就能偷私钥的远程攻击Marvin 攻击Marvin Attack是 2023 年曝光的一类针对 RSA PKCS#1 v1.5 填充方案的远程定时侧信道攻击。它的可怕之处在于要素说明攻击者位置网络对面无需接触服务器攻击手段观察每次 RSA 解密操作的耗时差异攻击目标恢复 RSA 私钥、恢复明文、伪造签名攻击成本收集数十万至数百万次解密耗时样本攻击原理可以概括为两步定时泄露RSA 私钥运算的核心是模幂运算。如果运算时间随输入数据波动泄露的信息量就会累积。填充校验放大PKCS#1 v1.5 解密流程会先做模幂、再校验填充格式首字节是否为 0x02 等。校验通过与否、提前返回与否会让有效密文与无效密文的耗时产生可统计的差别攻击者据此逐比特逼近私钥。RustCrypto RSA 库此前使用**随机掩蔽RSA blinding**来掩盖定时泄露但研究表明这种手段在 Marvin 攻击面前并不足以完全防御因此在 RUSTSEC-2023-0071 公告中被标记为受影响。二、漏洞在库中的位置从源码看解密路径要理解漏洞先看库内 PKCS#1 v1.5 解密的核心链路相关源码文件src/pkcs1v15.rs定义Pkcs1v15Encrypt填充方案decrypt函数注释中明确写道——是否返回错误会泄露秘密信息若攻击者能反复触发并观察错误就能像持有私钥一样解密和伪造签名。src/algorithms/rsa.rs实现rsa_decrypt与rsa_encrypt其中模幂运算采用非常数时间的实现并通过可选的rng参数启用 RSA blinding。src/pkcs1v15/decrypting_key.rs面向用户的DecryptingKey解密入口。主 READMEREADME.md的Security Warning章节也直接承认本 crate 受到 Marvin 攻击影响可能让网络攻击者恢复私钥并引导读者查看官方修复进展。这正是 RUSTSEC-2023-0071 的落点。三、marvin-toolkit 复现指南一条命令搭建攻击实验项目内置了marvin-toolkit/目录含Dockerfile、entrypoint.sh、README.md把整条攻击流水线封装成了 Docker 镜像保证结果可复现。3.1 构建镜像cd marvin-toolkit docker build -t marvin:latest .镜像基于 Python 3.12 Rust 工具链构建时会自动准备 Marvin 攻击分析所需的脚本环境见marvin-toolkit/Dockerfile。3.2 运行分析# 创建输出目录并允许容器写入 mkdir -p outputs chmod arw outputs # 启动攻击分析默认 RSA-2048重复 10 万次 docker run -d --rm \ --name marvin \ -v $(pwd)/outputs:/home/rustcrypto/marvin-toolkit/outputs \ marvin:latest运行过程可以用docker logs -f marvin实时跟踪结束后读取结论cat outputs/results/report.txt3.3 调节两个核心参数marvin-toolkit/entrypoint.sh支持两个命令行参数docker run ... marvin:latest -h可查看全部帮助参数含义默认值可选值-sRSA 密钥长度20481024 / 2048 / 4096-n密文重复生成次数越大置信度越高耗时越长100000任意正整数例如用 RSA-4096 做 100 万次重复的分析docker run -d --rm --name marvin marvin:latest -s 4096 -n 10000003.4 容器内部在做什么entrypoint.sh把攻击拆成四个阶段理解它就理解了 Marvin 攻击的完整闭环生成密钥用 OpenSSL 生成 RSA 1024/2048/4096 私钥PKCS#8 PEM 等格式并自签名证书批量构造密文用step2.py按 Marvin 攻击论文中的模板生成带特殊填充结构的密文如valid_repeated_byte_payload、zero_byte_in_padding等畸形构造采集解密耗时编译 Rust 测试程序默认使用rsa 0.9对每份密文执行rsa_decrypt_and_check并记录原始耗时到raw_times.csv统计分析用extract.py归一化耗时再用analysis.py做统计检验最终输出report.txt结论——能否据此恢复私钥。分析产物密钥、密文、报告统一拷贝到容器的outputs目录配合上面-v挂载即可保留到宿主机。 小技巧测试程序在容器运行时才编译因此可以在运行时挂载自定义Cargo.toml把分析对象换成任意版本的 RSA 库例如docker run -d --rm --name marvin -v $(pwd)/Cargo.toml:/home/rustcrypto/marvin-toolkit/example/rust-crypto/Cargo.toml marvin:latest四、给开发者的防护建议优先改用 OAEP 或 PSS库文档在src/pkcs1v15.rs顶部就明确建议——除非兼容性必须否则不要使用 PKCS#1 v1.5。关注官方修复跟踪CHANGELOG.md与 README 中指向的安全问题进展及时升级版本。部署层面对暴露 RSA 解密的服务如 TLS 握手、API 密钥交换增加限流、监控解密耗时异常降低攻击者采集样本的能力。验证手段像marvin-toolkit/这样可复现的定时分析工具可以作为你自己加密服务上线前的体检手段。五、延伸阅读项目内文件索引文件作用marvin-toolkit/README.mdMarvin 攻击复现完整操作手册marvin-toolkit/Dockerfile分析容器构建脚本marvin-toolkit/entrypoint.sh密钥生成→密文构造→解密计时→统计分析流水线src/pkcs1v15.rsPKCS#1 v1.5 加解密与签名实现src/algorithms/rsa.rs底层模幂与 RSA blinding 实现src/algorithms/pad.rs填充/去填充工具函数README.md安全警告与漏洞说明Marvin 攻击的意义在于它把侧信道从机房内部搬到了网络对端。任何依赖 PKCS#1 v1.5 解密的系统都值得用 marvin-toolkit 跑一次自我检验——花几十分钟复现一次攻击胜过事后被攻击一次。如需完整代码可克隆仓库git clone https://gitcode.com/gh_mirrors/rsa1/RSA【免费下载链接】RSARSA implementation in pure Rust项目地址: https://gitcode.com/gh_mirrors/rsa1/RSA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考