你本可以发明那个蓝牙攻击
最近一个严重的蓝牙漏洞引起了广泛关注。这是Biham和Newman的重大发现。考虑到BLE在不愿打补丁的物联网设备中的流行程度,这个漏洞影响深远。但令人惊讶的是,这个漏洞原理异常简洁清晰。与许多椭圆曲线漏洞不同,普通人也能完全理解这个漏洞及其利用方式。这是一个概念上易于理解攻击的绝佳案例。
本文将描述这个漏洞、如何利用它,以及它如何在蓝牙协议中具体发生。但首先,让我们快速了解椭圆曲线和无效曲线点攻击。
什么是椭圆曲线?
这个名字其实不太准确。在密码学中,“椭圆曲线"既不是椭圆形的,也不是连续曲线。相反,它是满足y² = x³ + ax + b mod p(p为素数)的(x,y)坐标集合,外加一个"无穷远点”——这个点行为类似于零:任何数加上它都保持不变。图1展示了一条这样的曲线,其中y² = x³ - x,x和y范围是0到71。
椭圆曲线有几个重要特性:
- 可以按照类似常规加法的规则相加:x + y = y + x,x + (y + z) = (x + y) + z等
- 点可以通过乘以自然数n来重复相加自身n次
- 每个点(x,y)都有逆元(x,-y),两者相加等于无穷远点
- 最重要的特性是:选择适当的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中:
- Alice发送给Bob基点P乘以她的秘密数a
- Bob发送给Alice基点P乘以他的秘密数b
- 双方分别用自己秘密数乘以对方发来的点,得到共享密钥Pab
攻击者Chuck可以修改消息中的y坐标使其始终为零。由于y坐标为零的点乘以任何数要么保持不变,要么变成无穷远点,因此:
- 如果Chuck替换Alice和Bob交换的点为(x,0),有50%概率他们得到无穷远点
- 如果同时修改两个中间消息,有25%概率双方协商出无穷远点作为密钥
- 这要么导致ECDH失败需要重试,要么让Chuck知道密钥从而可以读取和插入消息
如何避免这类漏洞?
最重要的是认识到这类攻击完全可以预防。具体建议:
- Diffie-Hellman算法实现风险极高,绝大多数场景都不应该使用它
- 使用X25519进行ECDH或Ed25519进行ECDSA,这些曲线上任何32字节字符串都是有效点
- 如果输入可能无效,在进行加密操作前必须先验证
- 验证点的具体方法很微妙,建议参考专业论文或Cryptopals第8组练习