SlowMist 出品:区块链应用中常见的密码学风险

本文由 SlowMist 团队撰写,旨在揭示区块链应用中常见的密码学风险,涵盖私钥随机数安全、ECDSA 安全、EdDSA 安全、Schnorr 安全、BLS 安全、RSA 安全、哈希安全和 AES 安全等多个方面。针对每种风险,文章详细描述了其严重性、描述、利用场景和建议,旨在帮助 Web3 项目团队建立强大的密码学安全基础。

SlowMist 出品:区块链应用中常见的密码学风险

背景概述

密码学是 Web3 安全的基石。从私钥生成到交易签名,每一步都依赖于密码学组件的正确和安全实现。然而,在 Web3 项目的实际开发中,开发团队往往专注于业务逻辑和性能优化,而忽略了底层密码学实现中细微但至关重要的方面。使用不安全的随机数生成器、不正确地调用密码学库或误解算法特性都可能引入致命的漏洞——导致私钥泄露、签名伪造,并最终导致不可逆转的资产损失。

通常,项目团队依靠安全审计来发现此类问题。然而,审计是一种事后验证的形式,不能完全覆盖整个项目生命周期。许多漏洞源于早期阶段的设计和技术选择。如果缺乏对密码学安全的基础理解,团队就无法从源头上有效地缓解这些风险。

为了解决这个问题,SlowMist 安全团队开源了区块链应用中常见的密码学风险,旨在分享通过一线攻防工作积累的实践经验和最佳实践。 我们希望该资源能够帮助项目团队从开发伊始就建立稳固的密码学安全基础,并最终构建独立和可持续的安全编码能力。** ](https://github.com/slowmist/Common-Cryptographic-Risks-in-Blockchain-Applications)。

0x01 私钥随机数安全

1. 使用 JavaScript Math.random 或基于时间的基于种子的随机数生成

  • 严重性:
  • 描述: JavaScript 的 Math.random() 是一个伪随机数生成器 (PRNG),不适合用于密码学安全目的。它的实现取决于浏览器或 JavaScript 引擎(例如 V8 的 Xorshift128+),并且种子和算法通常不可控,导致不可预测性不足,并可能允许攻击者猜测或重现生成的随机数序列。
  • 利用场景: 当用于生成加密密钥、会话Token、CSRF Token或游戏随机事件时,这可能导致加密密钥被破解、会话劫持或游戏作弊。
  • 建议: 优先使用 crypto.getRandomValues() (Web Crypto API) 来生成密码学上安全的随机数,这适用于密钥和Token等敏感场景。

2. 使用 Java 的不安全随机数生成方法生成私钥

  • 严重性:
  • 描述: Java 的 java.util.Random 或 java.util.concurrent.ThreadLocalRandom 是非密码学安全的伪随机数生成器 (PRNG)。它们的种子和算法(例如线性同余生成器)是可预测的,并且熵不足。如果这些方法用于生成密码学私钥(例如 RSA、ECDSA),则生成的密钥可能是可预测的,并且容易被攻击者推导或重现。
  • 利用场景: 在基于 Java 的 Web 应用程序中,使用 Random 生成的密钥可能会被攻击者利用来破解 TLS 会话或伪造 JWT Token。
  • 建议: 切换到 java.security.SecureRandom,这是一种专为密码学场景设计的随机数生成器,可提供适合生成私钥的高熵输出。或者,优先使用标准库或框架(例如 KeyPairGenerator、KeyFactory)来生成密钥。

3. Android 系统在某些版本中未能正确初始化 SecureRandom

  • 严重性:
  • 描述: 在某些版本的 Android(尤其是早期版本,例如 4.1–4.3)中,java.security.SecureRandom 无法正确初始化,导致生成的随机数中的熵不足。这通常是由于系统熵池(例如 /dev/urandom)没有被充分填充,或者 SecureRandom 的实现存在缺陷,导致生成的随机数序列具有更高的可预测性。当用于私钥生成时,它会显著降低安全性。
  • 利用场景: 在受影响的 Android 设备上,使用 SecureRandom 生成的比特币私钥可能会被破解,从而导致资金被盗。
  • 建议: 在调用 SecureRandom 之前,显式调用 SecureRandom.setSeed() 并将其与高熵源(例如用户输入或硬件传感器数据)结合使用,以提高随机性。

4.私钥生成过程中用于存储随机数的变量类型空间太小

  • 严重性:
  • 描述: 在私钥生成过程中,如果使用空间太小的变量类型(例如 32 位整数)来存储随机数,将会限制随机数的范围和熵,导致生成的私钥强度不足。
  • 利用场景: 攻击者可以利用有限范围的随机数的弱点,通过暴力破解或预计算攻击(例如彩虹表)快速猜测私钥。例如,在 Profanity 工具的案例中,攻击者通过分析生成的地址的模式成功破解了多个以太坊钱包,窃取了大量资金。
  • 建议: 使用足够大的变量类型(例如 256 位或更高)来存储随机数,以支持完整的密钥空间(例如 secp256k1 曲线的 2²⁵⁶ 范围)。

5. Libbitcoin Mersenne Twister 弱熵漏洞

  • 严重性:
  • 描述: Libbitcoin Explorer(3.0.0 到 3.6.0 版本)中的 bx seed 命令使用 Mersenne Twister (MT19937) 伪随机数生成器 (PRNG) 生成钱包种子,这些种子仅由 32 位系统时间 (high_resolution_clock) 初始化。这会将熵空间限制为 2³²(大约 43 亿)个可能的值,远低于 128 位或 256 位熵的安全要求。攻击者可以暴力破解种子、推导私钥,从而危及用户资金。此漏洞被称为“Milk Sad”,因为其生成的第一个种子短语以“milk sad”开头。
  • 利用场景: get_clock_seed() 函数返回一个 32 位系统时间戳 (uint32_t),该时间戳用作 Mersenne Twister 的种子。尽管 std::mt19937 生成看似随机的输出,但其熵受到 32 位种子的限制,无法提供 128 位或更高的安全级别。当 pseudo_random_fill 填充输出时,将其扩展到 256 位仅仅是伪随机扩展,并不会增加实际熵。
  • 建议: 将 Mersenne Twister 替换为密码学上安全的随机数生成器(例如 /dev/urandom、C++ 的 std::random_device 与高熵源配对,或 OpenSSL 的 RAND_bytes)。

6. OpenSSL 随机数生成器安全风险

  • 严重性:
  • 描述: OpenSSL 密码库中的随机数生成器 RAND_pseudo_bytes() 用于将 num 个伪随机字节放入 buf 中,但它存在安全设计缺陷。如果 RAND_pseudo_bytes() 生成的伪随机字节序列足够长,则是唯一的,但不一定是不可预测的。它们可用于非密码学目的以及某些密码学协议中的特定目的,但通常不用于密钥生成等。
  • 利用场景: 低熵密钥泄漏 (LESLI),攻击者可以获取 nonce,并通过暴力破解所有可能的 PIN 码和 RNG 状态来恢复原始 PIN 值。
  • 建议: 避免使用 RAND_pseudo_bytes,并将其完全替换为 RAND_bytes,同时检查其返回值。

0x02 ECDSA 安全

1. secp256r1 后门问题

  • 严重性:
  • 描述: secp256r1(也称为 NIST P-256)是一种广泛使用的椭圆曲线密码学算法,但有人担心其生成的参数中可能存在后门。在标准化过程中,这些参数由 NSA 提供,并且缺乏透明的生成过程意味着它们可能被故意设计为包含弱点,从而允许特定的攻击者(例如 NSA)利用隐藏的数学关系来解密数据或伪造签名。
  • 利用场景: 攻击者可能会利用后门(如果存在)通过使用已知参数的数学属性来快速计算私钥或预测随机数生成器的输出,从而破坏基于 secp256r1 的加密通信、伪造数字签名或窃取加密系统中的敏感数据(例如 TLS、比特币、SSH)。
  • 建议: 考虑切换到具有透明生成的参数的曲线,例如 Ed25519 或 Secp256k1,以降低后门的风险。

2. secp256k1 中 k 值的弱随机性导致私钥泄露

  • 严重性:
  • 描述: 在 secp256k1 曲线的 ECDSA 签名过程中,签名需要一个随机数 k (nonce)。如果 k 值由弱随机数生成器(例如低熵源、不安全的 PRNG 或可预测的种子)生成,则攻击者可能可以通过分析签名数据来推断 k 值,然后使用 ECDSA 的数学属性直接计算私钥。该漏洞通常源于使用不安全的随机数生成器(例如 rand()、Math.random())或环境熵不足(例如虚拟机或嵌入式设备)。
  • 利用场景: 攻击者可以收集少量签名数据(例如 r 和 s 值),并结合弱随机性的可预测性,重构 k 值并推导出私钥。在区块链场景(例如比特币、以太坊)中,这可能导致钱包私钥暴露和资金被盗。例如,如果 k 值是基于时间戳或固定种子生成的,则攻击者可以通过暴力破解或模式分析快速恢复私钥。早期密码学钱包的实现中曾出现过类似的问题,其中使用弱随机源生成 k 值,后来被破解。
  • 建议: 使用确定性 k 值生成 (RFC 6979),该生成基于私钥和消息哈希生成唯一的 k 值,从而避免依赖随机数生成器的质量。

3. secp256k1 中 k 值的重用导致私钥泄露

  • 严重性:
  • 描述: 在 secp256k1 椭圆曲线上使用 ECDSA 签名时(广泛用于比特币等加密货币),如果两个签名使用相同的随机数 k (nonce),则签名中的 r 值将相同。攻击者可以通过分析这两组签名(r、s1)和(r、s2)以及相应的消息哈希 h1 和 h2 来推导私钥。该漏洞源于 ECDSA 签名方程的数学结构;k 的重用允许攻击者建立一个方程组并直接求解私钥 d。
  • 建议: 遵循 RFC 6979 标准,基于私钥和消息哈希生成确定性但不可预测的 k 值,以防止重用。

4. ECDSA 签名值的可伪造性

  • 严重性:
  • 描述: ECDSA(椭圆曲线数字签名算法)的签名值 (r, s) 是可伪造的,这意味着给定一个有效的签名 (r, s),可以生成另一个等效的有效签名 (r, -s mod n),其中 n 是椭圆曲线的阶。这种数学属性源于 ECDSA 签名验证中模运算的对称性。如果实现未对签名进行规范化(例如,通过强制使用“low s values”),则攻击者可以在不影响其有效性的情况下修改签名,从而可能绕过签名验证机制或违反某些协议的唯一性要求。
  • 利用场景: 攻击者可以利用签名的可伪造性在区块链(例如比特币、以太坊)或协议中制造问题。例如,在比特币交易中,攻击者可以修改交易签名的 s 值以生成新的签名,从而更改交易 ID (txid),这可能导致交易被拒绝或触发双花风险。此外,在某些智能合约或多重签名协议中,非规范化的签名可能被用于绕过验证逻辑,从而导致经济损失或协议失败。2013 年,比特币网络遭受了由于签名可伪造性导致的交易延展性攻击,影响了 Mt. Gox 等交易所。
  • 建议: 强制使用“low s values”(s ≤ n/2),遵循 RFC 6979 或 BIP-66 标准(由比特币社区采用),并拒绝非标准签名以消除可伪造性。

5. ECDSA 和 Schnorr 签名共享随机数 k 导致私钥泄露

  • 严重性:
  • 描述: 在椭圆曲线数字签名算法 (ECDSA) 和 Schnorr 签名中,如果在生成签名时使用相同的随机数 k (nonce),攻击者可以通过分析签名对来推导私钥。此漏洞源于两种签名方案之间的数学结构相似性,这允许从已知的签名方程中对私钥进行逆向工程。无论是 k 在同一系统中多次重用还是在不同的签名算法之间重用,私钥都将被完全暴露,从而使攻击者能够伪造签名或控制相关帐户。
  • 建议: RFC6979 中的输入参数可以包括“附加数据”,并且在推导 k 时,可以将签名算法的信息填充到此字段中。这允许在算法级别安全地重用 k。

6. ECDSA 可以伪造签名值,而无需提供与签名值对应的消息 m

  • 严重性:
  • 描述: 在验证 ECDSA 签名时,如果验证过程仅需要消息的哈希值,而不需要原始消息本身,则攻击者可以构造一个通过验证的伪造签名,而无需知道私钥。该漏洞利用了 ECDSA 验证机制的数学特性,允许攻击者选择特定的数值组合来创建伪造签名,而无需知道相应的原始消息或私钥。
  • 建议: 验证签名时,必须提供原始消息 m,而不仅仅是哈希值。

7. ECDSA 签名 Nonce 侧信道攻击漏洞

  • 严重性:
  • 描述: LadderLeak 是 ECDSA 实现中存在的一种侧信道漏洞,攻击者可以通过缓存时序分析获取签名过程中使用的随机数 (nonce) 的最高有效位信息。但是,泄漏概率小于 100%(即“小于 1 位”的信息)。 此漏洞存在于 OpenSSL 1.0.2 和 1.1.0 分支以及 RELIC 工具包 0.4.0 版本中,尤其会影响基于 sect163r1 和 NIST P-192 曲线的 ECDSA 实现。该漏洞源于 Montgomery 阶梯算法实现中坐标处理不当引起的细微时间差异。攻击者可以观察到这些时间差异,并使用统计方法来推断随机数 k 的最高有效位。 即使泄漏率小于 100%(例如 P-192 为 99%,sect163r1 为 97.3%),攻击者仍然可以通过使用改进的 Bleichenbacher 傅里叶分析方法收集足够数量的签名来完全恢复私钥。
  • 利用场景: 在 OpenSSL 实现中,该漏洞表现在两种场景中——二元曲线情况(例如 sect163r1)和素数曲线情况(例如 NIST P-192)。 研究人员已经利用此泄漏仅需大约 ²³⁵ 个签名即可完全恢复 P-192 的私钥;对于 sect163r1,仅需要大约 ²²⁴ 个签名。 这大大突破了先前攻击技术的限制,先前攻击技术需要至少 2 位的泄漏才能实现可行的攻击。
  • 建议: 坐标随机化。

8. 椭圆曲线密码术中的 Twist 攻击漏洞

  • 严重性:
  • 描述: 椭圆曲线密码术 (ECC) 的实现中存在严重的安全漏洞,称为“twist 攻击”。 这些攻击利用椭圆曲线的数学特性和实现中的安全缺陷,允许攻击者在某些条件下提取受害者的私钥。 当使用单坐标阶梯算法(例如 Montgomery 阶梯算法)来实现 Diffie-Hellman 密钥交换时,尤其如此。 如果不采取适当的防御措施,攻击者可能会成功获取私钥信息。
  • 建议: 验证收到的点是否确实位于预期的曲线上。

0x03 EdDSA 安全

1. Ed25519 签名算法中的私钥提取漏洞

  • 严重性:
  • 描述: 此漏洞存在于 Ed25519 签名算法库的实现中,主要是由于某些库的设计缺陷以及用户对算法库接口的不正确使用。攻击者可以操纵两个签名过程,使用相同的私钥但不同的公钥来签署相同的消息,然后通过分析这两个签名的结果直接提取用户的完整私钥。 在标准实现中,签名计算应使用与私钥对应的唯一公钥。 但是,许多库实现了一个类似 sign(privateKey, message, publicKey) 的接口,允许调用者提供任何公钥参数,而不验证公钥是否与提供的私钥匹配。 这种缺陷,再加上在 Ed25519 签名算法中使用确定性随机数的特性,允许攻击者通过两个签名消除签名过程中的确定性不变量,从而提取用于签名的私钥扩展值,从而获得对完整私钥的控制。 此漏洞会影响所有提供此不安全接口且不执行公钥验证的 Ed25519 实现库,包括可能用于移动钱包、硬件钱包和云钱包的各种场景。 类似的攻击方法也适用于 Schnorr 签名算法。
  • 建议: 不要提供类似 sign(privateKey, message, publicKey) 的接口,而仅提供 sign(privateKey, message) 接口,并在内部通过私钥计算对应的公钥。

2. WolfSSL 中 Ed25519 签名算法的侧信道漏洞

  • 严重性:
  • 描述: Ed25519 是一种椭圆曲线数字签名算法 (EdDSA),旨在避免 ECDSA 中需要高质量随机数。 Ed25519 确定性地从消息和辅助密钥派生临时密钥,以消除随机数生成风险。 但是,研究表明,这种确定性设计在侧信道攻击的背景下引入了新的漏洞。 已经在 WolfSSL 库中的 Ed25519 实现中发现了一个严重的功率分析漏洞。 攻击者可以通过收集大约 4,000 个签名操作的功率迹线来完全恢复私钥。 该漏洞源于 SHA-512 哈希函数,该函数用于临时密钥的确定性生成,这允许攻击者使用差分功率分析 (DPA) 提取密钥信息。 具体来说,由于其非线性性质,SHA-512 消息调度函数中的模加运算会产生可观察的侧信道泄漏。 此漏洞对使用 WolfSSL 实现 Ed25519 的物联网设备和嵌入式系统构成严重威胁,因为这些设备通常更容易受到物理访问和侧信道攻击。
  • 建议: 修改 Ed25519 实现,以便在计算临时密钥时添加一个随机值,使攻击者无法预测哈希函数的输入。 确保整个前 1024 位数据块仅包含密钥和随机值,而不包含攻击者已知的任何位。

3. Ed25519 曲线协因子不为 1 导致双花漏洞

  • 严重性:
  • 描述: Edwards25519 椭圆曲线的协因子为 8,这意味着曲线上的点组结构包括一个大的素数阶子群 G1 和一个 8 阶的小子群 G2。 当构建基于 Edwards25519 的密码学协议(例如环签名和 RingCT)时,如果不正确处理协因子不为 1 的情况,则可能导致严重的双花甚至多花攻击。 该漏洞源于在验证过程中未能确保密钥图像(防止双花的关键组件)属于正确的子群,从而允许攻击者构建特殊的交易,使相同的资金可以多次花费。 它会影响所有基于 CryptoNote 协议并使用 Edwards25519 曲线的加密货币项目。
  • 建议: 对所有密钥图像实施子群成员资格检查,以确保它们属于大的素数阶子群 G1。

4. 历史版本中 Ed25519 的可扩展性漏洞

  • 严重性:
  • 描述: Ed25519 算法本身满足选择消息攻击的安全要求,但其可扩展性问题允许攻击者修改现有签名以生成新的有效签名,这可能会导致在假设签名唯一性的系统(例如重复验证或篡改检测失败)中出现漏洞。 这已在标准 RFC 8032 中修复,但旧的实现(例如 ed25519-dalek 1.0.1 版本)仍然存在风险。
  • 利用场景: 在 Ed25519 签名中,签名由 (R, s) 组成,其中 s 是一个标量。 如果攻击者获得与消息 M 和公钥 A 对应的有效签名 (R, s),则他们可以构造一个新的签名 (R, s’),其中 s’ = s + l(l 是子群的阶,即素数 2²⁵² + 27742317777372353535851937790883648493)。 由于群的模运算特性,验证者将检查 s’ * B == R + h * A(其中 h = Sha512(R || A || M),B 是基点),这等效于原始签名,导致新的签名也被接受。 例如,如果原始 s = 123,则 s’ = 123 + l 也会通过验证,但签名不再是唯一的。
  • 建议: 在签名验证过程中,按照 RFC 8032 标准添加检查:确保 s < l(群的阶)。 如果 s >= l,则拒绝签名。

0x04 Schnorr 安全

1. Schnorr Nonce 重用或不良的随机数生成

  • 严重性:
  • 描述: Schnorr 签名的安全性在很大程度上取决于随机数(nonce, k)的唯一性和不可预测性。 如果在不同的签名中重用了相同的 nonce,攻击者可以通过数学计算恢复私钥。 这个问题在理论上已经被广泛讨论,但是在 Schnorr 签名的实际应用中,还没有公开报告的案例。
  • 利用场景: 虽然不特定于 Schnorr 签名,但 ECDSA(其与 Schnorr 签名具有相似的数学基础)由于在比特币和以太坊中重用 nonce 而发生过私钥泄露事件。 例如,在 2010 年代初期,由于其随机数生成器中的缺陷,一些比特币钱包存在 nonce 重用,黑客利用这些缺陷窃取资金。 Schnorr 签名开始在比特币的 Taproot 升级中使用(于 2021 年推出),并且由于其实现严格遵循 BIP-340 规范(例如确定性 nonce 生成),因此没有观察到类似的问题。
  • 建议: 使用确定性 nonce 生成(例如 RFC 6979)或密码学上安全的随机数生成器。

2. Schnorr 相关密钥攻击

  • 严重性:
  • 描述: 2015 年发表的一篇学术论文分析了 Schnorr 签名和 DSA 在相关密钥攻击下的安全性。 该研究发现,标准 Schnorr 签名方案不满足完全 RKA(攻击者可以操纵签名密钥并获得修改后的签名)安全性,并且存在理论攻击方法。 例如,攻击者可能会通过篡改密钥来伪造签名。 但是,该研究还提出,对 Schnorr 签名方案进行细微修改(例如调整签名生成方法)可以实现完全 RKA 安全性。
  • 利用场景: 这不是实际的攻击事件,而是一种理论分析,表明 Schnorr 签名在特定的侧信道攻击场景(例如篡改设备)中可能存在风险。
  • 建议: 实施密钥完整性检查或使用抗 RKA 变体方案。

3. Schnorr 侧信道攻击

  • 严重性:
  • 描述: 从理论上讲,Schnorr 签名的实现可能容易受到侧信道攻击(例如时序攻击、功率分析或电磁泄漏)。 这些攻击利用签名生成过程中的物理信息泄漏来推导私钥或 nonce。
  • 利用场景: 尽管对该主题进行了广泛的学术研究,但没有公开报告的与 Schnorr 签名相关的侧信道攻击事件。
  • 建议: 实施恒定时间操作,使用抗侧信道攻击的硬件或算法。

0x05 BLS 安全

1. Filecoin BLS 签名验证中的可扩展性漏洞

  • 严重性:
  • 描述: 在 Filecoin 的 Lotus 实现中发现了 BLS 签名验证中的可扩展性漏洞。 BLS 签名可以用两种不同的形式表示:序列化和压缩,这两种形式都可以被 BLST 库的 VerifyCompressed 方法成功验证。 但是,Lotus 中的区块验证逻辑使用包含签名的区块头 CID 来识别区块的唯一性,从而导致以下安全问题: 如果相同的区块使用两种不同形式的 BLS 签名,则它将被视为两个不同的区块,因为它们的 CID 不同。 攻击者可以通过提交内容相同但签名格式不同的区块来利用此漏洞,从而绕过重复区块检测,这可能导致区块链分叉、双花攻击或共识失败。
  • 建议: 在验证签名之前,将所有签名转换为统一格式(全部序列化或全部压缩)。

2. BLS 库中与零值相关的漏洞和“拆分零”攻击

  • 严重性:
  • 描述: 研究人员在四个主流 BLS (Boneh-Lynn-Shacham) 密码学库和 BLS 标准草案中发现了一系列与零值处理相关的严重安全漏洞,统称为“拆分零”攻击。 这些漏洞源于密码学算法中特殊值“0”的处理缺陷,这些缺陷可能导致签名验证绕过、私钥恢复、拒绝服务和其他严重的安全问题。 尤其值得注意的是,GitHub 报告还提到了一些其他的与零值相关的漏洞,包括在 supranational/blst 库中,零长度签名或零长度消息可能导致程序崩溃,并且在模运算中,处理 inverse(0) mod p = 0 时会出现错误,而 inverse(p) mod p = 1。 BLS 签名方案以其独特的聚合特性而闻名,并被广泛用于区块链和分布式系统中。 这些漏洞可能对依赖于这些库的大型系统产生重大的安全影响。
  • 利用场景: 根据研究文档,“拆分零”攻击主要包括以下类型:零签名验证绕过、零公钥攻击、库崩溃漏洞、模运算中的零值问题以及聚合签名中的零值操作。
  • 建议: 明确定义并一致地实施针对零值(零长度输入、零点、零标量等)的处理策略。

3. 多重签名中 BLS Rogue Key 攻击漏洞

  • 严重性:
  • 描述: 在 BLS 签名方案中,公钥和签名的聚合仅仅通过求和来实现。 攻击者可以通过将密钥设置为 0 并计算诚实密钥的加性逆元来创建一个“rogue key”,以消除诚实参与者的贡献。
  • 建议: 实施严格的 Proof-of-Possession (PoP) 机制,避免依赖简单的求和聚合;考虑使用非线性聚合或其他随机性。

0x06 RSA 安全

1. RSA 密钥长度太短

  • 严重性:
  • 描述: RSA 的密钥长度(通常以位表示,例如 1024 位、2048 位)决定了 𝑛 的大小,从而影响了因式分解的计算复杂度。 如果密钥长度太短(例如 512 位或更低),攻击者可以使用现代计算资源(例如高性能计算机或分布式计算网络)相对容易地分解 𝑛,从而推导出私钥。
  • 建议: NIST 建议使用至少 2048 位的 RSA 密钥;对于高安全性要求,可以使用 3072 位或 4096 位的密钥。

2. RSA 密钥生成中的近似素数漏洞

  • 严重性:
  • 描述: RSA 加密算法的安全性依赖于整数分解问题的计算难度,其中模数 n 是两个大素数 p 和 q 的乘积。 当 p 和 q 选择得太接近时,会出现严重的安全漏洞,使得 n 的分解变得容易得多,并可能允许恶意攻击者恢复 RSA 私钥。 该漏洞源于 Fermat 的分解方法及其变体可以有效地分解具有彼此接近的因子的合数。 当 p 和 q 非常接近时,它们的平均值 √(pq) 非常接近 (p+q)/2,并且可以通过在 (p+q)/2 附近尝试值来实现有效的分解。
  • 利用场景: 具体来说,如果 |p-q| 很小,我们可以定义整数值 s = (p+q)/2 和 d = (p-q)/2,使得 p = s+d, q = s-d, 且 n = pq = s²-d²。 这转化为检查 n+d² 是否为完全平方数。 当 p 和 q 接近时,d 的值很小,使得这种搜索非常有效。
  • 建议: 遵循 NIST 标准(例如 FIPS 186-4),该标准要求 |p-q| > 2^(nlen/2–100),其中 nlen 是模数 n 的位长度;对于 2048 位 RSA 密钥,p 和 q 之间的差应至少为 2⁹²⁴ 位;考虑更严格的标准,如 |p-q| > 2^(nlen/2) 和 |p-(n/p)| > 2^(nlen/2)。

3. RSA 模数重用漏洞

  • 严重性: 非常高
  • 描述: RSA 加密的安全性基于整数分解问题的难度,其中模数 n 是两个大素数 p 和 q 的乘积。 在正常的 RSA 实现中,每个密钥对都有一个唯一的模数 n 和相应的唯一公钥指数 e 和私钥指数 d。 当模数 n 被重用时,即使使用不同的公钥指数 e 和私钥指数 d,如果攻击者获得多个使用相同模数的公钥,他们也可以通过简单的数学计算来恢复私钥。
  • 建议: 每次生成 RSA 密钥对时都必须生成一个新的模数 n;禁止在不同的密钥对、用户或系统之间共享模数。

4. RSA 小公钥指数漏洞

  • 严重性:
  • 描述: RSA算法的安全性基于大整数分解的计算难度,其中公钥由模数n(两个大素数p和q的乘积)和指数e组成,而私钥主要由指数d组成,满足e·d ≡ 1 (mod φ(n))。当选择一个非常小的e值时,特别是e=3,虽然加密操作简化为计算 c = m³ mod n,但它引入了数学上的弱点。
  • 利用场景: 这些漏洞主要体现在直接求根攻击(Direct Root Attack)、Håstad广播攻击(Håstad Broadcast Attack)、Coppersmith相关消息攻击(Coppersmith’s Related Message Attack)和Bleichenbacher填充攻击(Bleichenbacher Padding Attack)等攻击场景中,并且在实际应用中特别危险,因为许多开发者可能会选择小的指数来提高性能,尤其是在资源受限的环境中,同时仍然没有意识到或忽略相关的安全风险。
  • 建议: 避免使用e=3、e=5或其他非常小的值;建议使用e=65537 (2¹⁶+1),这是一个大的素数,并且仍然保持合理的性能。

5. RSA私钥小指数漏洞

  • 严重性:
  • 描述: RSA算法的安全性基于整数分解问题的计算难度,其中公钥由模数n(两个大素数p和q的乘积)和公钥指数e组成,而私钥主要由指数d组成,满足 ed ≡ 1 (mod φ(n))。私钥指数d用于解密和签名操作,其计算复杂度与d的大小成正比。当使用小的私钥指数d时,即使模数n非常大,整个加密系统也可能被破坏。此漏洞允许攻击者通过数学方法恢复私钥,而无需执行困难的整数分解,从而完全破坏RSA的安全保证。
  • 利用场景: 为了提高解密和签名的效率,一些实现可能会有意选择较小的d值,这可能导致一些严重的数学攻击,包括Wiener攻击(Wiener Attack)、Boneh-Durfee攻击(Boneh-Durfee Attack)和Partial Key Exposure攻击(Partial Key Exposure Attack)。
  • 建议: 使用足够大的私钥指数d:确保d至少与φ(n)在同一数量级,并避免有意选择小值d。在实践中,随机选择e通常会导致d与φ(n)在同一数量级,这是安全的。

6. RSA无填充短消息攻击漏洞

  • 严重性:
  • 描述: 当使用RSA直接加密消息 ( m ) 时,加密过程计算 ( c = m^e \mod n ),其中 ( e ) 是公钥指数, ( n ) 是模数。如果原始消息 ( m ) 相对于模数 ( n ) 非常小 (( m \ll n )),则 ( m^e ) 可能小于 ( n ),导致 ( c = m^e ) 而不是 ( c = m^e \mod n )。在这种情况下,攻击者可以简单地计算 ( m = c^{(1/e)} ) (即,对密文 ( c ) 求 ( e ) 次方根) 来直接恢复原始消息,而无需知道私钥。
  • 建议: 在实现RSA加密时,使用PKCS#1 v2.1 OAEP(Optimal Asymmetric Encryption Padding),它增加了随机性并扩展了消息大小。

7. RSA填充Oracle攻击漏洞

  • 严重性:
  • 描述: 在RSA加密中使用PKCS#1 v1.5填充时,如果服务器在解密具有无效填充的密文时返回特定的错误消息(例如,“无效填充”与“其他错误”),则会创建一个“填充Oracle”。攻击者可以重复发送修改后的密文并观察响应,以缩小明文范围。
  • 建议: 确保RSA解密和填充验证过程不会在时间和返回消息方面泄漏信息。

8. RSA时间攻击漏洞

  • 严重性:
  • 描述: RSA时间攻击是一种旁道攻击,攻击者可以通过精确测量RSA操作(如解密或签名)中的执行时间差异来推断私钥信息,从而完全破坏RSA密码系统。即使RSA算法在数学上是安全的,但其实现也可能导致这种严重漏洞。这种类型的攻击主要利用RSA私钥操作中的模幂运算(m^d mod n),它通常使用诸如“平方-乘”或“Montgomery reduction”之类的算法。在这些算法中,处理时间根据私钥d的比特模式而变化。例如,在基本的平方-乘算法中,当私钥位为1时,执行额外的乘法运算,而当私钥位为0时则不执行,从而导致可测量的时间差异。
  • 利用场景: 通过发送精心选择的消息并测量处理时间,攻击者可以推断私钥d的每一位。通过足够数量的测量样本,攻击者可以完全重建私钥,从而解密所有通信或伪造数字签名。
  • 建议: 确保RSA操作在固定的时间内完成,无论私钥位模式如何。使用本机支持恒定时间操作的密码库。

9. RSA可延展性攻击漏洞

  • 严重性:
  • 描述: RSA加密具有乘法可延展性:如果 c = m^e mod N,那么对于任何k,c’ = (c*k^e) mod N 解密为 m*k mod N。 攻击者可以利用此属性来操纵密文,而不会触发解密错误。
  • 利用场景: 假设一条加密的银行转账消息 m = “转账100元”,密文为 c = m^e mod N。攻击者计算 c’ = c * (2^e) mod N,解密后为“转账200元”。这在没有签名的协议中有效,例如早期的电子现金系统或自定义加密方案,并且已在现实世界的攻击中被利用,例如,通过修改加密的投票或财务数据,导致2010年代某些区块链或协议中的漏洞。
  • 建议: 结合使用数字签名(如RSA-PSS)或消息认证码(MAC)来验证消息完整性并防止篡改。

0x07 哈希安全

1. 哈希碰撞生日攻击

  • 严重性:
  • 描述: 哈希生日攻击基于概率论中的“生日悖论”,它可以显著降低找到哈希碰撞所需的计算复杂度。对于一个n位的哈希函数,理论上需要 2^n 次尝试才能找到一个特定的碰撞,但使用生日攻击,只需要大约 2^(n/2) 次尝试,就可以找到两个输入产生相同哈希值的概率为50%的碰撞。
  • 利用场景: 假设使用MD5哈希函数(128位输出),攻击者可以通过生成大约 2⁶⁴ 个变体消息来找到碰撞。例如,攻击者可以创建两个不同的合约文件A和B(A是合法的,B是被篡改的),使得MD5(A) = MD5(B)。如果系统使用MD5来验证签名,攻击者就可以使用A的签名来伪造B,从而导致像2004年的Flaming攻击这样的事件,其中MD5碰撞被用于生成虚假证书,或者2012年的Flame恶意软件利用碰撞来绕过Windows更新验证。
  • 建议: 采用具有强大抗碰撞性的现代哈希算法,如SHA-256、SHA-3或BLAKE2,并避免使用像MD5和SHA-1这样已被证明不安全的算法。

2. 哈希函数的长度扩展攻击

  • 严重性:
  • 描述: 长度扩展攻击是一种针对使用Merkle-Damgård结构的哈希函数的密码学攻击,例如MD5、SHA-1和SHA-2系列。攻击者可以利用这些哈希函数的内部工作原理来计算H(message||padding||extension)的值,而无需知道消息本身,前提是他们知道H(message)和消息的长度。这里,extension是攻击者选择的任意数据。这种攻击是可行的,因为Merkle-Damgård结构的哈希算法将输入处理成固定长度的数据块,并且每个块的哈希值都取决于前一个块的哈希状态。这意味着攻击者可以通过添加更多数据块来继续从已知的哈希状态开始的哈希计算,而无需知道产生该状态的原始数据。此漏洞在Web应用程序、API身份验证、身份验证系统和区块链应用程序中尤其危险,尤其是在系统使用像H(secret||message)这样的简单验证模式时。
  • 建议: 采用不使用Merkle-Damgård结构的现代哈希算法,如SHA-3或BLAKE2,这些算法本身对长度扩展攻击免疫。

0x08 AES安全

1. AES加密密钥长度不足

  • 严重性:
  • 描述: 标准AES支持128位、192位和256位的密钥长度。如果使用的密钥长度太短(例如,小于128位,如56位或更低),加密就变得脆弱。攻击者可以通过暴力攻击或字典攻击快速解密数据,这可能导致敏感信息泄漏、数据篡改或系统入侵。尤其是在现代计算环境中,高性能GPU和分布式计算可以加速破解过程。
  • 利用场景: 根据NIST(美国国家标准与技术研究院)的指南,低于128位的密钥长度被认为是不安全的,无法抵御当代威胁。
  • 建议: 始终使用至少128位的AES密钥,并优先考虑256位以获得更高的安全性。避免自定义或非标准长度。

2. AES中的IV/Nonce重用攻击

  • 严重性:
  • 描述: IV/Nonce重用攻击是AES加密模式的一个严重安全威胁。当在相同的密钥下重复使用相同的初始化向量(IV)或nonce时,可能导致严重的安全问题。在CTR模式下,重用会生成相同的密钥流,允许攻击者通过密文的XOR操作直接获得两个明文的XOR结果,然后通过频率分析等方法恢复原始明文。在GCM模式下,nonce重用不仅会泄漏明文信息,还会完全破坏认证机制,允许攻击者伪造认证标签。在CBC模式下,虽然影响相对较小,但仍然会泄漏有关相同明文块的信息。这种攻击的危险在于它不需要获取密钥;攻击者可以通过观察密文模式来推断明文内容,在某些情况下,甚至可以完全恢复密钥。
  • 利用场景: 最典型的案例是2016年发现的Android加密漏洞,其中文件系统加密使用AES-CBC模式,但在IV生成方面存在缺陷,导致相同的文件内容可能在不同时间使用相同的IV进行加密,从而泄露文件模式信息。另一个著名的例子是某些WPA2实现中的密钥重装攻击(KRACK),攻击者通过重放握手消息来强制nonce重用,从而导致AES-CCMP加密流被破解。在Web应用程序中,一些开发人员错误地使用固定的IV或基于时间戳的可预测的IV来加密用户数据,允许攻击者通过比较来自不同用户的加密数据来推断敏感信息。类似的问题也发生在云存储服务中,其中重复数据删除机制中的设计缺陷导致相同的文件使用相同的参数进行加密,从而导致数据泄漏。
  • 建议: 确保每次加密操作都使用唯一且不可预测的IV/Nonce。

3. AES-ECB模式弱加密风险

  • 严重性:
  • 描述: 电子密码本模式(ECB——Electronic Codebook)是AES加密的一种运行模式,存在严重的安全漏洞。ECB模式的主要缺陷是,它总是为相同的明文块生成相同的密文块,而不管该块在消息中的位置或之前加密的内容如何。这种确定性的加密模式意味着加密后的数据仍然保留原始数据的模式和结构特征,未能提供现代密码学所要求的语义安全。在ECB模式下,密文可能会泄露明文的模式信息,允许攻击者在不知道密钥的情况下推断部分或全部明文内容。这种弱加密模式尤其不适合加密大型数据集、结构化数据或包含重复信息的数据。
  • 利用场景: 当使用ECB模式加密图像时,图像的轮廓和主要特征在加密后仍然可见。一个经典的例子是ECB企鹅图像,即使在“加密”后,企鹅的轮廓仍然清晰可辨。
  • 建议: 除非加密小于块大小(16字节)的单个数据块,否则应完全避免ECB模式。

4. AES-CBC填充攻击

  • 严重性:
  • 描述: AES-CBC填充攻击是一种针对使用CBC模式的对称加密系统的旁道攻击。此攻击利用解密系统在填充验证期间泄漏的信息,允许攻击者在不知道加密密钥的情况下逐字节解密密文。当加密系统返回有关填充是否有效的任何信息(例如,错误消息、返回代码或响应时间差异)时,攻击者可以系统地修改密文并观察系统响应,以逐步推断原始明文内容。攻击原理基于CBC模式的解密特性。解密密文时,将先前的密文块与当前解密的块进行XOR运算。通过仔细构造和修改密文块,攻击者可以使用填充验证机制作为“Oracle”来推断解密的中间值,并最终恢复完整的明文数据。此外,使用CBC-R(CBC Reverse)技术,攻击者甚至可以伪造可以被系统正确解密的密文。
  • 利用场景: 从历史上看,多个TLS实现都受到了此类攻击的影响,例如POODLE(2014)和“Lucky Thirteen”攻击(2013)。攻击者可以拦截加密通信,修改密文,并分析服务器响应,最终破解加密内容。
  • 建议: 采用AEAD(Authenticated Encryption with Associated Data)密码模式,例如AES-GCM或ChaCha20-Poly1305。

0x09 其他密码学协议

1. 弱Fiat-Shamir变换

  • 严重性:
  • 描述: Fiat-Shamir变换是将交互式零知识证明协议转换为非交互式证明协议的重要方法,用哈希函数的输出替换证明者和验证者之间的随机挑战。“Frozen Heart”漏洞指的是“弱Fiat-Shamir”变换的实现,它只对证明者消息的一部分进行哈希处理,而不对公共信息(如参数、公共输入等)进行哈希处理。这允许攻击者通过预先计算公钥A而无需知道秘密值来伪造证明并欺骗验证者。此漏洞影响多个主流的零知识证明系统,包括Bulletproofs、Plonk、Spartan和Wesolowski的VDF。
  • 建议: 确保在Fiat-Shamir变换的实现中,所有公共输入数据也包含在随机数生成过程中。

2. GG18和GG20 Paillier密钥漏洞

  • 严重性:
  • 漏洞描述: 此漏洞存在于两个广泛使用的多方计算(MPC)协议GG18和GG20的规范中,影响超过10个钱包和库(包括Binance Custody服务)。该漏洞的根本原因在于协议实现,它不检查攻击者的Paillier模数N是否包含小因子或是否为两个素数的乘积。攻击者可以利用此漏洞与MPC协议中的签名方进行交互,窃取其秘密份额,并最终获得主密钥,从而完全提取私钥并从加密钱包中窃取所有资金。
  • 建议: 确保检查签名方的Paillier公钥是否包含小素因子,以防止攻击者使用包含小因子(如2²⁰大小的素数)的恶意模数。

总结

SlowMist安全团队已在GitHub上开源 Common-Cryptographic-Risks-in-Blockchain-Applications,旨在系统地揭示隐藏在关键组件(如私钥生成、数字签名、哈希函数和对称加密)中的高风险安全漏洞。

Web3项目团队可以参考本报告中对漏洞原理、利用场景和补救建议的详细分析,以加深对密码学安全的理解,避免常见的实现陷阱,并更好地保护项目和用户资产。

关于SlowMist

SlowMist是一家专注于区块链安全威胁情报的公司,成立于2018年1月。公司由一支拥有超过十年网络安全经验的团队创立,旨在成为全球力量。我们的目标是为每个人尽可能地确保区块链生态系统的安全。我们现在是一家著名的国际区块链安全公司,曾参与过多个知名项目,如HashKey Exchange、OSL、MEEX、BGE、BTCBOX、Bitget、BHEX.SG、OKX、Binance、HTX、Amber Group、Crypto.com等。

SlowMist提供多种服务,包括但不限于安全审计、威胁情报、防御部署、安全顾问和其他安全相关服务。我们还提供AML(反洗钱)软件、MistEye(安全监控)、SlowMist Hacked(加密黑客档案)、FireWall.x(智能合约防火墙)和其他SaaS产品。我们与国内外公司建立了合作关系,如Akamai、BitDefender、RC²、天际伙伴、IPIP等。我们在加密货币犯罪调查方面的广泛工作已被国际组织和政府机构引用,包括联合国安全理事会和联合国毒品和犯罪问题办公室。

通过提供为个别项目定制的全面安全解决方案,我们可以识别风险并防止其发生。我们的团队能够发现并发布多个高风险区块链安全漏洞。通过这样做,我们可以传播意识,提高区块链生态系统中的安全标准。

  • 原文链接: slowmist.medium.com/prod...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
slowmist
slowmist
江湖只有他的大名,没有他的介绍。