RSA签名故障攻击分析:从理论到实战的私钥泄露漏洞挖掘
2018年8月14日密码学, 实习项目, Manticore今年春夏,作为Trail of Bits的实习生,我研究了RSA签名故障攻击建模。重点分析了使用中国剩余定理(CRT)优化的RSA签名过程,通过诱导计算故障揭示私钥。我从底层而非数学角度分析故障攻击,在分析玩具程序和mbed TLS的RSA实现后,成功识别出内存中翻转后会导致私钥泄露的特定位。
RSA签名故障分析 - Trail of Bits博客
Aditi Gupta
2018年8月14日
密码学, 实习项目, Manticore
今年春夏,作为Trail of Bits的实习生,我研究了RSA签名故障攻击建模。重点分析了使用中国剩余定理(CRT)优化的RSA签名过程,通过诱导计算故障揭示私钥。我从底层而非数学角度分析故障攻击,在分析玩具程序和mbed TLS的RSA实现后,成功识别出内存中翻转后会导致私钥泄露的特定位。
CRT-RSA签名流程
标准RSA签名算法为:s=mᵈ (mod n),其中s代表签名,m为消息,d是私钥指数,n为公钥。虽然有效,但当数字达到安全所需规模时计算耗时极长。因此许多密码库使用CRT加速解密和签名——将大型计算拆分为两个较小计算后再合并结果。
给定私钥指数d,我们计算两个值:
dₚ = d mod (p-1)
d_q = d mod (q-1)
接着计算两个部分签名:
s₁ = mᵈᵖ mod p
s₂ = mᵈᵟ mod q
计算p mod q和q mod p的逆元后,最终签名通过公式组合:
s = (s₁·q·qInv + s₂·p·pInv) mod n
故障攻击原理
当两个部分签名之一(假设是使用q计算的s₂)出错时问题显现。组合部分签名将产生错误最终签名。若签名正确,可通过比较原消息与sᵉ mod n(e为公钥指数)验证;但故障签名会使sᵉ mod p仍等于m,而sᵉ mod q不等。
由此可知p是sᵉ-m的因子而q不是。由于p也是n的因子,攻击者可取n和sᵉ-m的最大公约数提取p。n除以p即得q,此时攻击者已获得全部私钥。
玩具程序故障注入
我首先用C语言编写了使用CRT进行RSA签名的简易程序。该程序无填充无校验,采用教科书式RSA处理较小数字。通过调试器手动修改部分签名产生故障签名,并用Python程序基于故障签名计算私钥成功解密另一加密消息。尝试在签名过程不同阶段篡改数据后,开始自动化此过程。
使用Manticore进行位翻转
通过Binary Ninja查看程序反汇编代码,定位目标数据内存地址。随后使用Trail of Bits开发的二进制分析工具Manticore执行故障攻击:编写脚本遍历连续内存字节,翻转特定位后执行RSA签名程序。对未崩溃或超时的执行,尝试用输出提取私钥并通过解密验证准确性。最终生成包含每次位翻转的中间结果、私钥及准确性的CSV文件。
实验结果
测试938次位翻转中,45次(4.8%)成功产生正确私钥。近55%导致崩溃或超时,31%未改变部分签名。
此类自动化极大加速了漏洞利用开发——仅需向Manticore描述漏洞即可获得完整利用方案列表。这对不精确故障(如Rowhammer)尤其有用,可找到翻转即泄露私钥的位簇。
攻击mbed TLS
获得玩具程序位翻转结果后,我开始寻找真实密码库攻击目标。最终选定主要用于嵌入式系统的mbed TLS。因其复杂度远高于自制程序,我先阅读源码理解RSA签名流程,再编译并用Binary Ninja分析反汇编二进制文件。
与玩具程序的关键差异在于mbed TLS使用填充签名。我研究的故障攻击仅适用于确定性填充(给定消息总是生成相同填充值),而非概率方案。虽然mbed TLS支持多种填充方案,我选择使用PKCS#1 v1.5(复杂随机化PSS填充方案的确定性替代品)。同样使用调试器定位目标数据后开始故障部分签名。
但很快发现存在运行时检查阻止此类攻击:两项检查若失败将停止执行并报错而不生成签名。通过调试器跳过检查后成功产生目标故障签名。借助故障签名和公钥数据,成功复现玩具程序的私钥提取流程。
自动化攻击
如同对玩具程序的操作,我开始自动化故障攻击并识别可泄露私钥的位翻转。为加速过程,改用GDB脚本替代Manticore:找到可绕过两项防护检查的位翻转,用GDB修改对应内存指令,再在特定内存地址翻转一位。通过Python循环遍历内存字节,调用脚本并尝试提取私钥(通过解密已知消息验证准确性),最终将结果写入CSV文件。
实验结果
在mbed TLS签名代码段的566次位翻转测试中,结合确保检查通过的两个位翻转,发现28次(近5%)泄露私钥,约55%未能产生签名。
此类分析对真实程序有效令人兴奋,但遗憾的是未能在夏季结束前进行"真实世界"测试。不过,输入真实TLS代码并获得完整故障攻击描述的能力,为未来研究开辟了广阔可能性。
结论
在Trail of Bits的工作经历令我获益匪浅:深化了对密码学的理解,熟悉了安全工程师的常用工具。这段宝贵经验将助力我在卡内基梅隆大学明年的课程和项目。如果你喜欢本文,请分享至:
[Twitter] [LinkedIn] [GitHub] [Mastodon] [Hacker News]
页面目录
- CRT-RSA签名流程
- 故障攻击原理
- 玩具程序故障注入
- 使用Manticore进行位翻转
- 实验结果
- 攻击mbed TLS
- 自动化攻击
- 实验结果
- 结论
- 近期文章
我们构建了MCP始终需要的安全层
挖掘废弃硬件中的零日漏洞
EthCC[8]内幕:成为智能合约审计师
用Vendetect实现大规模代码复制检测
构建安全消息系统之难:关于Bitchat安全辩论的深度解析
© 2025 Trail of Bits.
使用Hugo和Mainroad主题生成。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码
更多推荐
所有评论(0)