蓝牙漏洞攻击:椭圆曲线密码学中的无效点攻击解析

本文详细解析了蓝牙协议中基于椭圆曲线密码学的严重安全漏洞,包括无效曲线点攻击的原理、实际利用方法及防御措施,适合密码学和网络安全爱好者深入理解这一经典攻击手法。

您本可以发明那个蓝牙攻击 - Trail of Bits 博客

2018年8月1日
攻击, 密码学

最近一个严重的蓝牙漏洞受到了广泛关注。这是 Biham 和 Newman 的一项重大发现。鉴于 BLE 在厌恶修补的物联网世界中的流行,该漏洞具有严重的影响。然而,它异常清晰和简单。与许多椭圆曲线漏洞不同,普通人完全可以理解这个漏洞及其利用方式。这是一个概念上易于理解的攻击的酷炫应用。

本文描述了该漏洞、如何利用它们,以及它如何具体发生在蓝牙协议中。但首先,让我们快速了解椭圆曲线和无效曲线点攻击。

什么是椭圆曲线?

这是一个相当误导人的名称。在密码学中,“椭圆曲线”既不是椭圆形的,也不是连续曲线。相反,它是 (x, y) 坐标的集合,其中 x 和 y 在 0 和 p 之间,p 是素数,且 y² = x³ + ax + b mod p,外加一个额外的“无穷远点”,其行为反直觉地类似于零;如果你将其加到任何东西上,你会得到相同的数字。图 1 显示了这样一条曲线,其中 y² = x³ - x,x 和 y 的范围从 0 到 71。(从技术上讲,x 和 y 定义在有限域上,但当 p 是素数时,所有相同阶 p 的有限域都是同构的,因此我们的定义是等价的)。

图 1:一条椭圆曲线(用于密码学)

椭圆曲线有一些有用的属性:

  • 你可以用看起来很像常规加法的规则将椭圆曲线点相加:x + y = y + x,x + (y + z) = (x + y) + z,等等。这是因为曲线上的点形成一个阿贝尔群。你可以在下面的图 2 中看到这种加法的可视化。
  • 一个点可以通过将其自身相加 n 次来乘以某个自然数(称为 n)。
  • 对于每个点 (x, y),都有一个逆点 (x, -y),使得任何点加上其逆点等于无穷远点。
  • 最值得注意的是,如果你在上述方程中很好地选择 a、b 和 n,乘以一个常规数是一个陷门函数:给定一个点 P 和一个数字 n,计算一个点 Q 使得 Q = n * P 非常容易,但给定一个点 P 和一个点 Q,找到 n 使得 Q = n * P 极其困难。这个简单的硬度假设让我们构建了许多密码算法。

图 2:加法,以及无穷远点(注意:这些插图使用连续曲线进行可视化,但这仍然不是我们正在处理的东西)

通常,椭圆曲线算法是围绕特定曲线编写的。各方交换曲线上的点和标量,并使用我们上面定义的规则进行计算。然而,当这些算法暴露于不满足曲线方程的 (x, y) 对时,问题就会出现,这些可以被利用来执行所谓的“无效曲线点攻击”。

什么是无效曲线点攻击?

记住,一个点是一对 (x, y),使得对于某些 a、b 和 n,有 y² = x³ + ax + b mod n。然而,如果该方程不成立,(x,y) 就是一个无效曲线点。相当多的密码算法要求用户提供一个曲线点,并且设计上假设该点是有效的且方程成立。在对其进行数学运算之前未能验证接收到的曲线点是否在曲线上,与违反密码学末日原则相差不远,并具有类似的后果。

在椭圆曲线方案中,秘密通常是一个常规数字(记住,找到 n 使得 Q = n * P 是困难问题)。当攻击者可以发送一个未经验证的点,该点乘以 n 并查看结果时,他们可以利用缺乏验证来学习密钥。通常,攻击者可以选择属于与算法指定的曲线不同的曲线上的点,该曲线上的点非常少。

例如,攻击者可能选择一个不在曲线上且 y 坐标为零的点。任何这样的点,当加到自身上时,必须等于无穷远点。我们知道这一点,因为我们通过将 y 坐标乘以负一来计算逆,但零乘以负一是零,因此任何 y 坐标为零的点都是其自身的逆。因此,当我们将它加到自身上时,结果必须是无穷远点。

如果攻击者选择这样的点,那么通过查看秘密乘以该曲线上的某个点,他们可以学习秘密是偶数还是奇数!输入点是两个可能点之一。将其加到自身上将得到另一个点。因此,如果秘密是输入的点,则数字是奇数;否则,是偶数。我们可以提交类似的点,当乘以三时等于无穷远点,以学习秘密 mod 3,当乘以五时等于无穷远点以学习秘密 mod 5,依此类推,直到我们可以使用中国剩余定理计算实际秘密。

这不是使用无效曲线点找出密钥的唯一方法,但可能是最容易理解的方法,并且已在现实生活中用于破解 Oracle 和 Google 的 TLS 库。

虽然最近对蓝牙的攻击不像上述示例那么简单,但概念上非常相似,并使用了相同的小子群限制技术来实现密钥披露。

蓝牙攻击是如何工作的?

蓝牙协议使用椭圆曲线 Diffie-Hellman 来商定加密的共享密钥。正确使用 Diffie-Hellman 算法非常困难。细微的错误可能会危及整个系统的安全性。在这种情况下,协议确实需要曲线点验证,但仅针对 x 坐标。这是一个看起来足够无辜的错误,以至于十年未被注意到。它让聪明的攻击者可以破坏整个系统。

椭圆曲线 Diffie-Hellman 是一个简单的算法。假设 Alice 和 Bob 想要商定某个秘密。双方都有一个秘密数字,并且在某个椭圆曲线上有一个共同商定的“基点”。

Alice 将基点乘以她的秘密数字发送给 Bob,Bob 将基点乘以他的秘密数字发送给 Alice。然后,Alice 将 Bob 的消息乘以她的秘密数字,Bob 将 Alice 的消息乘以他的秘密数字。如果我们称点为 P,秘密为 a 和 b,Alice 发送给 Bob P * a,Bob 发送给 Alice P * b。然后 Alice 计算 (P * b) * a(共享秘密),Bob 计算 (P * a) * b(相同的数字)。

即使攻击者 Chuck 可以看到任一消息,他也不能推导出 a 或 b,也不能组合 P * a 和 P * b 来获得秘密,因此他完全倒霉!然而,当 Chuck 可以修改消息而不仅仅是查看它们时,问题就会出现。由于 y 坐标无效,Chuck 可以将其修改为始终为零。

记住,如果一个点的 y 坐标为零,如果你将其乘以一个随机数,它有 50% 的机会是无穷远点,50% 的机会是原始点,没有机会是其他任何东西。

将这一切放在一起,如果 Chuck 将 Alice 和 Bob 发送给彼此的其中一个点 (x, y) 替换为 (x, 0),那么 Alice 或 Bob 将其乘以他们的密钥,有 50% 的机会他们得到无穷远点,50% 的机会他们得到 (x, 0)。如果 Chuck 替换两个中间消息,有 25% 的机会 Alice 和 Bob 同意密钥是无穷远点,没有机会他们同意任何其他密钥。这意味着要么 ECDH 失败,Alice 和 Bob 必须重试(给 Chuck 另一个机会),要么 Chuck 知道密钥并可以读取和插入消息。

如何避免这样的错误?

从所有这些中最重要的收获不是关于这个特定攻击的任何东西;而是整个类别的攻击是完全可预防的。一些更具体的建议:

  • Diffie-Hellman 是一个异常危险的算法来实现。你几乎肯定不想首先使用它(参考 Latacora 的优秀密码学正确答案)。如果你发现有人使用它,你有很大的机会找到错误。说真的,几乎没有人需要这个,而且做对极其困难。
  • 对于 ECDH 使用 X25519,或对于 ECDSA 使用 Ed25519。在这些曲线上,任何 32 字节字符串都是有效的曲线点;因此无效曲线点是不可能的。
  • 如果你的输入可能无效并且你正在对其执行密码操作,请在执行任何其他操作之前进行验证。

我故意省略了自行验证点的说明,因为这对于博客文章的结论来说是一个过于微妙的话题。如果你对这类事情感兴趣,你可以参考这篇论文。如果你想练习利用这类错误(以及一些更酷的错误),你应该查看 Cryptopals 第 8 组。如果这是你已经觉得有趣的事情,请联系我们。我们很乐意与你合作。

如果你喜欢这篇文章,请分享: Twitter LinkedIn GitHub Mastodon Hacker News

页面内容
什么是椭圆曲线?
什么是无效曲线点攻击?
蓝牙攻击是如何工作的?
如何避免这样的错误?
最近的帖子
非传统创新者奖学金
在你的 PajaMAS 中劫持多代理系统
我们构建了 MCP 一直需要的安全层
在废弃硬件中利用零日漏洞
Inside EthCC[8]:成为智能合约审计员
© 2025 Trail of Bits。
使用 Hugo 和 Mainroad 主题生成。

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