本文为物联网方案商云巴工程师龙淼投稿。利益相关声明:云巴提供共享单车解决方案。
前段时间一篇《破解 ofo 最新款锁》的文章引起了我的注意,说的是百度安全研究员通过使用特殊的工具劫持了锁和云端通信的信号来破解单车锁。
身为同是共享单车智能锁开发的工程师,我看过文章之后也萌生了想法:能不能用更简单的方法,对 ofo 小黄车最常见的天王星锁进行一次破解?
我们最常见的 ofo 小黄车锁——天王星,是一款集合 GPRS 、密码、蓝牙模块的锁具,我尝试从这款锁蓝牙开锁的入手,使用 Android App 和常见的 Android 抓包工具达到破解的目的。
使用蓝牙开锁的原理
用户扫码后,手机 App 会向服务器发送开锁请求,随后服务器把蓝牙信息发送回手机,手机 App 通过蓝牙把这些信息发送给锁达到开锁目的。整个过程里面,用户的手机充当着一个中间人的角色,连接服务器与单车。
比说,我想传纸条给坐得比较远的同学但是又够不着,只能给隔壁的同学递过去。手机 App 扮演的就是在我们传纸条的过程中隔着的那位“中间人”的角色。
破解,从官方 App 入手
要从蓝牙开锁的方式破解这款锁,第一步需要知道它的蓝牙协议,说白了是要知道设备和云端之间是怎样沟通的。我获取 ofo 蓝牙协议的方式,仅仅是简单地下载其官方 Android app,再用上合适的工具。
有个简单的方法:Android 4.3 以上的手机都有一个记录蓝牙日志的选项,只要我们勾选,系统会记录某个接口中所有的活动记录,ofo 的蓝牙开锁所有的读写操作也会被记录下来。然后我们分析导出的日志文件,就能分析出上面 ofo 蓝牙开锁的协议。
手机上的“万能钥匙”
我们发现 app 开锁之前需要和锁进行认证才能顺利打开。这段认证码我们叫做 token。这里的 token 可以简单的理解为共享单车上每辆车的一个电子密码,手机获得这个密码之后用蓝牙发送到单车锁就可以完成开锁。
关于获取 token 我有两个思路,一是通过监听 app 和 ofo 服务器的开锁交互,进而截获出每辆单车编号相对应的 token;二是通过记录手机和锁之间的蓝牙日志,获取到开锁 token。这两个方式都可以获取单车编号对应的 token。
打个容易理解的比喻,我们传统的写信寄信,把信件送到目的地必须通过邮差把信送达,我们要想截获信件的内容必须在邮差取信或者送信之间做手脚。在这次破解的过程里面,手机 App 扮演的是邮差的角色,我们通过在“邮差”取信前截获 token,或者在“邮差”送信到达前截获 token。
每使用一辆单车,我都可以把这辆车对应的 token 截获并记录下来,以后再使用同一辆车就不再需要向服务器请求 token,做到直接解锁。不需要很长的时间,我就可以获取到某一区域所有单车的 token。
更极端地,我甚至可以找不同的渠道按编号发出请求,获取 token 并记录,建一个单车锁 token 数据库,集成到一个手机 App 中。
前面提到,我们已经获取了 ofo 小黄车的蓝牙协议,加上能够获取单车编号对应的 token,这样,破解就不再需要随身带什么专业的设备,现在只需要在手机上装上我集成好的破解 app ,就能破解上千万辆带天王星锁的 ofo 单车,相当于在手机上安装了 ofo 天王星锁的“万能钥匙”。
不仅如此,我还可以通过一些方法,在自己的破解软件添加一键开锁的功能,只需要一次操作就能开附近所有带天王星锁的 ofo 单车。
修复有一定难度
要想修复,现在有三种做法:
一是更新 ofo 小黄车的蓝牙协议,这需要对每辆车进行动态的固件更新;二是每辆单车的开锁 token 进行每次开锁的动态变换;三是重新设计开锁逻辑,采用手机透传,在锁和服务器端加密的方式去阻止协议暴露和避免中间人攻击,这也是目前我们采用的做法。
相比之前曝光过的使用劫持信号来破解车锁的方法,这次的破解更为简单,我们在手机上装一个破解软件就能达到破解的目的,不需要昂贵的专业设备,不需要特殊的工具。我这次的破解已经向 ofo 相关职员进行反馈。
物联网有两大要素,一是连接,二是安全。市面上很多共享单车商家对连接这一部分下了不少功夫,但对其安全性方面有所欠缺,没有足够重视。
从共享单车行业发展初期,我们就一直在关注共享单车的安全性问题,除去这次的破解 ofo 天王星车锁外,我也用同样的原理破解了市面上一系列的共享单车车锁,包括小鸣单车、优拜单车、酷奇单车。
不知攻,焉知防。作为同是共享单车方案商的我们,自然不是为破解而破解,而是在破解这些车锁的过程中不断学习,希望在一次次的破解中寻找更好的做法,不断提升自己产品的安全性。