手机App竟然能让头发拉直器起火?
多年来,我们一直专注于物联网(IoT)方面的安全研究,并试图找出它们的漏洞来hack这些联网设备。
在不久前,我们曾对号称全球首款无线电水壶的iKettle进行了安全测试,但并没有什么收获。
转而我们将目光瞄准了智能头发拉直器。在圣诞期间电视上大力推广的Glamoriser拉直器;由于其BLE与移动应用的连接特性,引起了我的兴趣。
你可以在关机前更改温度和空闲时间。
对于有狂热意图的我们来说,这似乎是一个更好的hack对象;我们可以尝试将它的最高温度调至纸张闪点(233C/451F)之上。
一项在线调查显示,英国一消防部门称,拉直器已在全英造成多达65万起的房屋火灾事故。显然,三分之一的拉直器用户都烧伤过自己!
移动应用
该应用设计的非常简单:温度控制和超时。你可以在谷歌应用商店里下载到它。
Googleplay Store:https://play.google.com/store/apps/details?id=com.fenda.diva
对APK的反编译工作非常顺利,99%的代码都完好无损。这对我们之后的代码查找工作会有所帮助。
该应用可直接与Alexa和AWS服务连接。“Assets”文件夹中存储了一个通用的API密钥:
api_key.txt文件实际上是一个JWT(Java Web Token):
Android应用已启用备份:
蓝牙挖掘
通过BT4 dongle和运行的BLEAH,我们可以更详细地查看设备:
该设备的通用名为“Bluetooth Styler”。它的“Peripheral Privacy Flag”已被禁用,我们可以“WRITE(写)”到0015 Handle(句柄)…
让我们来看一些代码。
看看应用程序是如何使用BLE协议进行工作的,可以看到几乎所有的内容都被记录到了LOG:
通过代码库进一步搜索,我们找到了BLE通信的状态UUID字符串:
BES_DATA_CHARACTERISTIC_TX_UUID是之前的写入特征。
还有一些代码概述了BLE命令:
从这里我们可以看到,命令是由不同的部分构建的:
CheckSum(校验和)值的计算方式如下:
因此,现在我们知道了如何发送BLE命令,让我们确认下我们是对的。
通过查看手机的SD卡,我们可以看到创建了多个文件和文件夹:
创建的Log.txt文件准确列出了BLE通信的内容:
2019-02-12 12:43:44V<BleService>---onConnectionStateChanged connected = false2019-02-12 12:43:44V<BleService>---isHumanDisconnect = false2019-02-12 12:43:44V<BleService>---quickyDisconnectCount = 02019-02-12 12:43:44V<BleService>---totalReconnectCount = 12019-02-12 12:43:44V<BleService>---totalReconnectCount < 10 and equels = 12019-02-12 12:43:44V<BleService>---totalReconnectCount < 5 and reconnect after 5002019-02-12 12:43:44V<BleService>---handleMessage msg.what == RECONNECT reconnectMAC= F0:13:C3:00:4B:8C2019-02-12 12:43:44V<BleService>---onConnectionStateChanged connected = true2019-02-12 12:43:45V<BleService>---onConnectionStateChanged handle discoverServices2019-02-12 12:43:45V<BleService>---onServicesDiscovered() + status = 02019-02-12 12:43:45V<BleService>---onCharacteristicNotifyEnabled() + status = 02019-02-12 12:43:45V<BleService>---READY TO SEND DATA IS = 54,45,eb,50,c8,00,05,f8,2019-02-12 12:43:45V<BleService>---READY TO SEND DATA IS WRITH TO HAL RET IS = true2019-02-12 12:43:45V<BleService>---onWritten() + status = 02019-02-12 12:43:45V<BleService>---onReceive BES_DATA_CHARACTERISTIC_RX_UUID2019-02-12 12:43:45V<BleService>---onReceive 54,45,f8,
从该日志文件中我们还可以看到,从设备发送的ACK确认命令已被接收并执行。
通过更改移动应用程序上的某些值然后查看日志,我们可以看到发送的数据:
54,45,eb,50,50,00,05,70, 5 mins 80 °C 54,45,eb,50,5a,00,05,66 5 mins 90 °C 54,45,eb,50,64,00,05,5c, 5 mins 100 °C 54,45,eb,50,96,00,05,2a 5 mins 150 °C 54,45,eb,50,c8,00,05,f8 5 mins 200 °C
让我们看看是否可以发送一些数据并让拉直器做点什么(坏笑)。首先,我们需要计算checksum。
为此,我们编写了一个Java脚本:
此Java代码将为我们计算校验和,并打印出我们需要发送的值。
有一点需要注意!设备和手机之间的BLE通信并没有验证。只要设备处于开启状态(通过主电源插座),就可以将数据随时发送到设备。
bleah -b “f0:13:c3:00:4b:8c” -u “0783b03e-8535-b5a0-7140-a304f013c3ba” -d “0x5445EB50EB0014C6”
哇!我们做到了!
这意味着只要拉直器处于打开状态,我们就可以向其发送命令来更改它的温度!
我们测试一下,看看是否可以将设备温度上调至235C以上,遗憾的是这并不起作用,但这不重要。
如果你发出超过235C或低于50C的温度请求,它将不会在设备上注册,因此我怀疑设备的温度可能存在某种限制。
此外,拉直器在时间上也做了限制,即最长持续运行时间为20分钟。拉直器上有个物理开关,如果它没被按下,那么它将自动关闭。
你可以做的是在他们使用时覆盖这些设置。例如,如果有人在120°C下使用拉直器,并且睡眠时间为使用后5分钟,则你可以将其改为235°C和20分钟的睡眠时间。
让过程更加简单
对于有的人来说,逆向并非一件简单的事。其实在本例中,逆向非不是所必须的步骤。由于在连接手机时没有在BLE上建立配对或绑定,因此应用范围内的任何人都可以控制拉直器,但并不支持多个手机的并发连接。此外,如果用户超出了BLE的范围,那么你本地的黑客很有可能侵入并调高它们的温度。
总结
如果不安全使用,直发器可能会导致房屋火灾和皮肤灼伤。
我们已经证明了拉直器的温度可以随时被我们篡改,因此即使用户安全使用拉直器,它们也未必真的安全。
当然,这种攻击要求黑客必须处于蓝牙范围内,但是对于制造商来说,包含配对/绑定功能可以很容易地防止这种情况的发生。
只要按下按钮将拉直器置于配对模式就可以解决这个问题。
相反,现在我们有了一种让房屋起火的方法。