六起事件揭秘:钱包密码学实现缺陷如何导致私钥泄露
核心要点
通过六起真实案例,深入剖析密钥生成中的弱随机数与签名过程中的Nonce缺陷,揭示攻击者如何绕过存储保护恢复私钥,并提出支付机构应遵循的密码学实现与验证原则。
据 Woofun AI 消息,在'超越安全存储(Beyond Secure Storage)'系列的第二篇深度分析中,研究视角从流程控制转向底层密码学实现,揭示攻击者无需读取受保护的密钥副本,即可通过重建密钥获取控制权。
这一路径依赖于对 助记词生成与 密钥派生过程中潜在缺陷的利用,表明仅靠存储隔离无法抵御来自实现层面的渗透。
在分层确定性钱包体系中,密钥的生命周期涵盖生成、存储与使用三个关键阶段,每个阶段均有其独特的安全要求。生成阶段的核心在于不可预测性,即攻击者无法以可行成本枚举出控制钱包的秘密信息;存储阶段要求保密性,确保未经授权者无法通过软件、物理接口或日志获取秘密数据;使用阶段则强调不泄漏,即使收集大量公开签名,攻击者也无法从中反推密钥。硬件钱包、安全元件(,SE)以及可信执行环境()虽能强化存储保护,但若生成时的随机源存在缺陷,或签名时泄漏了关键信息,这些硬件隔离措施便形同虚设。攻击者正是通过绕过受保护的存储副本,直接从公开数据或可预测的生成逻辑中恢复密钥,从而掌控相应资产。
密钥生成的每一步都必须严格保留不可预测性,熵源必须适合密码学用途,且在转换为种子或私钥时不得损失不确定性。若目标为 128 位安全性,任何实现错误都不应将搜索范围缩小至攻击者可穷举的程度。以下四个案例分别展示了依赖库弱随机数、随机源绑定错误、输入转换熵损失以及初始状态空间受限等典型问题,揭示了看似正常的地址生成背后隐藏的巨大风险。
在 事件中,部分软件钱包因使用存在漏洞的 crypto-js 版本生成 BIP-39 助记词而陷入危机。该库的 .lib.WordArray.random() 函数并未从密码学安全的随机源获取熵,而是采用由 Math.random() 初始化的自定义 Multiply-With-Carry(MWC)生成器。
尽管后续执行了标准的助记词编码和密钥派生,但随机源的先天缺陷无法弥补。在 crypto-js v3.1.9-1 的实现中,自定义 MWC 生成器 r() 的状态受 Math.random() 影响,导致其输出的伪随机字节缺乏密码学所需的不可预测性。标称 128 位和 256 位的输出,其实际候选空间分别仅约为 2³⁹ 和 2⁴⁷。攻击者通过枚举候选助记词、派生钱包地址并与公开链上活动比对,即可在不提取受害者设备数据的情况下恢复秘密信息。这表明,符合标准的助记词格式无法掩盖旧版依赖库带来的弱随机性风险。
的案例则凸显了集成错误导致的随机源绑定问题。设备虽配备安全随机源,但构建阶段的错误使种子生成过程中的 rng_get() 实际调用了 的软件 PRNG ,而非硬件随机数生成器。Yasmarang 以设备固定唯一 ID 和有限计时信息初始化,初始状态易预测,导致钱包种子有效熵大幅下降。
此外,种子生成还混入了第二个 Yasmarang 生成器的输出:较老的 Mk2/Mk3 设备用公开常量初始化第二个生成器,未增加熵;较新型号虽引入安全元件随机数,但重新设置种子时仅保留 32 位。因此,256 位钱包种子的实际搜索空间远小于预期。按照 的攻击假设,Mk2/Mk3 约有 2⁴⁰ 个候选,Mk4/Q/Mk5 约有 2⁷² 个候选。攻击者通过离线尝试候选种子并比对链上数据,即可派生对应私钥,搜索成本虽因型号而异,但一旦匹配成功,控制权即告丧失。

评论
暂无评论