RSA-CRT签名过程
通常RSA签名算法为:s=m^d mod n。其中s代表签名,m代表消息,d是私钥指数,n是公钥模数。为提高计算效率,许多密码库会使用中国剩余定理(CRT)来加速解密和签名过程。CRT将单个大计算拆分为两个较小计算:
- 计算dp=d mod (p-1)和dq=d mod (q-1)
- 计算两个部分签名:s1=m^dp mod p和s2=m^dq mod q
- 计算p mod q和q mod p的逆元
- 组合最终签名: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,从而获取完整私钥。
玩具程序攻击实验
- 编写简易C程序实现RSA-CRT签名
- 使用调试器手动修改部分签名产生错误
- Python程序利用错误签名成功计算出私钥
- 测试不同阶段的位翻转效果
使用Manticore自动化攻击
- 用Binary Ninja定位关键内存地址
- 编写Manticore脚本遍历内存字节进行位翻转
- 记录每次翻转后的中间结果和私钥准确性
- 测试938次位翻转,4.8%成功泄露私钥
mbed TLS实战攻击
- 分析mbed TLS的RSA签名实现(PKCS#1 v1.5填充)
- 绕过运行时检查机制
- 使用GDB脚本自动化位翻转攻击
- 测试566次位翻转,5%成功泄露私钥
研究成果
- 玩具程序:45/938次位翻转成功(4.8%)
- mbed TLS:28/566次位翻转成功(5%)
- 证明该攻击方法对实际密码库有效
这种自动化分析方法能显著加速漏洞利用开发,特别适用于Rowhammer等不精确故障场景。未来可进一步研究在实际环境中的应用。