RSA签名故障分析 - 利用位翻转泄露私钥的技术研究

本文详细分析了RSA签名过程中使用中国剩余定理(CRT)优化时可能存在的故障攻击漏洞。通过人工和自动化工具(Manticore)诱导计算错误,成功从内存位翻转中提取私钥,并在玩具程序和mbed TLS实现中验证了攻击有效性。

RSA-CRT签名过程

通常RSA签名算法为:s=m^d mod n。其中s代表签名,m代表消息,d是私钥指数,n是公钥模数。为提高计算效率,许多密码库会使用中国剩余定理(CRT)来加速解密和签名过程。CRT将单个大计算拆分为两个较小计算:

  1. 计算dp=d mod (p-1)和dq=d mod (q-1)
  2. 计算两个部分签名:s1=m^dp mod p和s2=m^dq mod q
  3. 计算p mod q和q mod p的逆元
  4. 组合最终签名:s=(s1qqInv)+(s2ppInv) mod n

故障攻击原理

当部分签名(假设是s2)出现计算错误时,会产生错误最终签名。验证时发现:

  • s^e mod p = m 仍成立
  • s^e mod q ≠ m 不成立

攻击者可计算gcd(n, s^e - m)提取出p,进而得到q=n/p,从而获取完整私钥。

玩具程序攻击实验

  1. 编写简易C程序实现RSA-CRT签名
  2. 使用调试器手动修改部分签名产生错误
  3. Python程序利用错误签名成功计算出私钥
  4. 测试不同阶段的位翻转效果

使用Manticore自动化攻击

  1. 用Binary Ninja定位关键内存地址
  2. 编写Manticore脚本遍历内存字节进行位翻转
  3. 记录每次翻转后的中间结果和私钥准确性
  4. 测试938次位翻转,4.8%成功泄露私钥

mbed TLS实战攻击

  1. 分析mbed TLS的RSA签名实现(PKCS#1 v1.5填充)
  2. 绕过运行时检查机制
  3. 使用GDB脚本自动化位翻转攻击
  4. 测试566次位翻转,5%成功泄露私钥

研究成果

  • 玩具程序:45/938次位翻转成功(4.8%)
  • mbed TLS:28/566次位翻转成功(5%)
  • 证明该攻击方法对实际密码库有效

这种自动化分析方法能显著加速漏洞利用开发,特别适用于Rowhammer等不精确故障场景。未来可进一步研究在实际环境中的应用。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计