蓝牙安全漏洞解析:如何利用无效曲线点攻击破解加密协议

本文深入解析了蓝牙协议中一个严重的椭圆曲线加密漏洞,详细介绍了无效曲线点攻击原理,攻击者如何利用该漏洞获取密钥,以及开发者应如何避免此类安全问题。

你本可以发明那个蓝牙攻击

最近一个严重的蓝牙漏洞引起了广泛关注。这是Biham和Newman的重大发现。考虑到BLE在不愿打补丁的物联网设备中的流行程度,这个漏洞影响深远。但令人惊讶的是,这个漏洞原理异常简洁清晰。与许多椭圆曲线漏洞不同,普通人也能完全理解这个漏洞及其利用方式。这是一个概念上易于理解攻击的绝佳案例。

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

什么是椭圆曲线?

这个名字其实不太准确。在密码学中,“椭圆曲线"既不是椭圆形的,也不是连续曲线。相反,它是满足y² = x³ + ax + b mod p(p为素数)的(x,y)坐标集合,外加一个"无穷远点”——这个点行为类似于零:任何数加上它都保持不变。图1展示了一条这样的曲线,其中y² = x³ - x,x和y范围是0到71。

椭圆曲线有几个重要特性:

  1. 可以按照类似常规加法的规则相加:x + y = y + x,x + (y + z) = (x + y) + z等
  2. 点可以通过乘以自然数n来重复相加自身n次
  3. 每个点(x,y)都有逆元(x,-y),两者相加等于无穷远点
  4. 最重要的特性是:选择适当的a、b和n时,点乘法是一个陷门函数——已知P和n计算Q=n*P很容易,但已知P和Q求n则极其困难

什么是无效曲线点攻击?

无效曲线点是指不满足y² = x³ + ax + b mod n方程的(x,y)点。许多加密算法要求用户提供曲线点,并默认这些点是有效的。如果处理前不验证接收到的曲线点是否在曲线上,就可能导致安全问题。

攻击者可以发送未经验证的点,这些点会被乘以秘密数n,通过观察结果可以推断出密钥信息。攻击者通常会选择属于不同曲线的点——这些曲线上的点数量很少。

例如,攻击者可以选择y坐标为零的点。这样的点加上自身必然等于无穷远点。通过观察秘密数乘以这类点的结果,攻击者可以判断秘密数的奇偶性。类似地,使用在乘以3时等于无穷远点的点可以推断秘密数模3的值,依此类推,最终通过中国剩余定理计算出完整密钥。

蓝牙攻击是如何工作的?

蓝牙协议使用椭圆曲线Diffie-Hellman(ECDH)来协商加密密钥。正确实现Diffie-Hellman算法非常困难。在这个案例中,协议确实要求验证曲线点,但只验证x坐标。这个看似无害的错误潜伏了十年之久。

在ECDH中:

  1. Alice发送给Bob基点P乘以她的秘密数a
  2. Bob发送给Alice基点P乘以他的秘密数b
  3. 双方分别用自己秘密数乘以对方发来的点,得到共享密钥Pab

攻击者Chuck可以修改消息中的y坐标使其始终为零。由于y坐标为零的点乘以任何数要么保持不变,要么变成无穷远点,因此:

  • 如果Chuck替换Alice和Bob交换的点为(x,0),有50%概率他们得到无穷远点
  • 如果同时修改两个中间消息,有25%概率双方协商出无穷远点作为密钥
  • 这要么导致ECDH失败需要重试,要么让Chuck知道密钥从而可以读取和插入消息

如何避免这类漏洞?

最重要的是认识到这类攻击完全可以预防。具体建议:

  1. Diffie-Hellman算法实现风险极高,绝大多数场景都不应该使用它
  2. 使用X25519进行ECDH或Ed25519进行ECDSA,这些曲线上任何32字节字符串都是有效点
  3. 如果输入可能无效,在进行加密操作前必须先验证
  4. 验证点的具体方法很微妙,建议参考专业论文或Cryptopals第8组练习
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计