耶鲁门锁漏洞
Last updated
Last updated
Yale 提供了一个名为 Yale Bluetooth Key 的应用程序,可以通过手机控制他们的门锁。耶鲁应用程序通过 BLE 与耶鲁门锁通信。在他们的通信中,门锁使用一个 8 字节的密钥来验证用户的手机。一旦我们拿到这把钥匙,我们就可以在任何手机上打开这扇门。
通过嗅探手机和门锁之间的 BLE 通信,可以轻松计算出钥匙。
当手机尝试连接到门锁时,有 2 个数据包用于身份验证过程:
请求和响应包的结构如下所示:
认证请求从门锁发送到手机,手机在处理请求的有效载荷后,生成一个认证响应给门锁。
通过逆向分析对应的app,我们可以找到一个名为“encodeCounter”的必不可少的函数,如下图:
参数 counterData 是认证请求的载荷,keyString 是我们上面提到的 8 字节的认证密钥。
keyString 被拆分为 6 部分,存储在变量 key1 ~ key6 中。
keyString的每一部分都加到对应的counterData中,结果保存在变量c1r1~c3r4中。
最后,函数返回 HexString(c1r1 + c1r2 + c1r3 + c1r4 + c2r1 + c2r2 + c2r3 + c2r4 + c3r1 + c3r2 + c3r3 + c3r4)。这是身份验证响应的负载。
正如我们在第 2 节中分析的那样。为了计算身份验证密钥,我们只需要嗅探 BLE 通信,这很容易。下面是一个例子:
BLE 通信由 USB 加密狗嗅探,来自 ebay 的 5 美元。
在这种情况下,请求的负载是“FB 2B 30 5B 06 31 2B 5C 11 42 31 73”,响应的负载是“EA 83 2C 29 71 2D C5 2A 0D 9A 20 0D”。身份验证密钥是这样计算的。
所以,key1 = 0xEF,key2 = 0x58,key3 = 0xFC,key4 = 0xCE,key5 = 0x6B,key6 = 0x9A。
在这种情况下,身份验证密钥应为“EF58FCCE6B9A0000”。我们还附加了 2 个字节的 0x00,因为身份验证密钥应该是 8 个字节,但只使用了 6 个字节。
使用此身份验证密钥,我们可以通过任何手机未经授权解锁此门锁。