明文 OTA 改固件:拆 Govee 智能取暖器 H7135
原创
黑卷
黑卷
黑卷的IoT攻防日记
2026年10月18日 07:28
浙江
去阅读
智能家电越来越爱联网,取暖器也不例外。Include Security 盯上了 GoveeLife 的一款 Smart Space Heater Lite,型号 H7135:WiFi + 蓝牙,手机 App 管开关和温度。他们发现,设备查固件版本和下更新包走的是明文 HTTP——同局域网里做一次 MitM,就能把固件换成自己的。
改完的固件不只是「能跑」:研究员把发往副控的 UART 指令改写成反复「开/关加热」,继电器就一直咔哒咔哒响。软件控制面一丢,物理行为也就跟着丢了。对取暖器这种带大功率负载的东西来说,这已经不只是「被远程开关」那么简单。
后面这台机器还被美国 CPSC 列入召回名单(过热/起火风险,牵涉无线控制相关条款)。本文只拆 Include Security 公开的技术路径:明文 OTA、弱校验、救砖和改固件落地。召回原因跟这个洞有没有直接因果,公开材料没写死,两边分开看更稳妥。
先看关键数字
目标很具体:GoveeLife H7135。主控是一块 Ameba Z2(RTL8710C) WiFi/蓝牙模组,跟主板上另一颗 MCU 用串口说话——灯、按键、加热丝、风扇都归那颗副控管。攻击前提是能对设备所在局域网动手脚(DNS 劫持或透明代理),不是公网 0click。
但「同网」这件事,在家里并不稀罕:访客 WiFi 配错、路由器被蹭、恶意 App 同网扫描,都可能落到同一层二层网络上。对 IoT 来说,局域网往往就是默认信任域。
拆开:盖、主板、电源
盖子盖着时,是一台普通的「智能」取暖器;揭开盖,触摸按键和 LED 位置一目了然。研究员的第一反应不是直接挖洞,而是先把硬件摸清楚:谁在跑逻辑、谁在驱动负载、调试口在哪。
主板拆下来,左侧那块就是 WiFi/BLE 模组,中间是驱动加热和风扇的副控,底下还有电源和「非智能」加热部分。这种「无线模组 + 副控」的拆法很常见:联网、OTA、云协议堆在模组上;真正碰电的部分交给另一颗更「笨」但更稳的 MCU。
模组近拍能看到未焊接的 TXD/RXD 调试口焊盘。后面救砖、进 shell、看 OTA 日志,全靠这几根线。模组丝印上没有明显型号字,但固件字符串里蹦出了 AmebaZIIRTL8710C——Realtek 那条 RTL8710 家族,定位就清楚了。熟悉 ESP8266 的人,可以把它们理解成同赛道竞品。
第一步:抓到明文查版本
设备进测试 WiFi、用官方 App 配好网之后,流量里立刻冒出一条明文请求:
POST /device/rest/devices/v1/wifiCheckVersion,Host 是 app.govee.com。请求体带着 sku=H7135、软硬件版本、设备号等字段。响应 JSON 更直接:
needUpdate
布尔值
* 明文downloadUrl
(指向 S3 的 HTTP 链接)
* 一段截断的 md5、以及 size
设备跟着就用 HTTP GET 把固件 bin 拉下来。Wireshark 里整条链清清楚楚——没有 TLS,也没有额外的「挑战-应答」之类握手。
问题来了:这条 OTA 有没有验签?能不能劫持查版本响应,塞一份自己改过的镜像?
答案是:能,但要多走几步。Include Security 的做法很工程:先用 Flask 冒充接口,再对着失败日志一点点把校验补齐。
攻击链:四步到继电器
核心步骤可以压成四句:
- 同网劫持 DNS 或代理,让
app.govee.com落到自己的服务; - 伪造
wifiCheckVersion,把downloadUrl指到改包,并按同样规则填 md5/size; - 按固件格式重算 checksum 与各段 HMAC(密钥就在镜像头里);
- 改 UART 协议打包函数,让每条发往副控的消息都变成「开/关加热」。
前两步决定「设备愿不愿意下你的包」;后两步决定「包能不能启动、启动后能不能改物理行为」。
OTA 流程里藏着什么校验
第一次只改几个字节就推上去,调试串口报了:
HAL_Ota_DoChecksum 失败——期望 checksum 和算出来的对不上。这是一个很朴素的整文件字节累加,差多少,末尾 4 字节小端整数就要补多少。修完这一层,设备愿意擦写升级区了。
结果重启卡在 Bootloader:Hash Result Incorrect! Boot Load Err!。OTA 服务线程以为成功,启动链却不认——等于砖了一回。说明除了末尾累加和,还有一层更「像样」的完整性校验在挡着。
砖了怎么办:拆模组 + ltchiptool
模组从主板上拆下来,底面居然印了完整 pinout。对做硬件的人这是救命稻草:不用猜脚位,直接按丝印飞线。开源工具 ltchiptool(社区给多家无线模组做的刷写工具)可以直接 dump / 回写,先把原厂固件救回来。
救活之后,他们没有焊回板子完事,而是飞线搭了一套「可反复刷」的环境:控制 UART 接回主板、调试 UART 接电脑,边刷边看日志。调试口还有个 GoveeShell,要口令——从固件 strings 里就能抠出来。进 shell 后可以列命令、看任务、搞网络信息,OTA 失败时的详细日志也从这里出。
这一段值得单独记一笔:很多 IoT 分析不是「一把梭成功」,而是「先砖、再救、再迭代」。模组可拆、工具现成,研究成本会低一个数量级。
固件格式:HMAC 有,密钥也有
ltchiptool 附带的分区解析脚本把格式摊开了:镜像分段,每段头有 HMAC-SHA256;Bootloader 会验。模组其实支持更硬的安全启动(密钥从保密值派生),但这台设备没开——HMAC 密钥就写在固件头里。
于是补丁脚本的逻辑很直白:改完代码 → 按固定密钥重算各段 HMAC 和 OTA Signature → 再重算末尾 checksum。之后就可以用同一套 Flask MitM,让设备「自愿」刷上改包。
这里有个容易误判的点:日志里出现 HMAC、出现 signature,不代表「没法改」。要看密钥从哪来、安全启动开没开、校验发生在写 flash 前还是启动时。这台机器的答案是——密钥可读、安全启动关、校验可重放。
让固件「有存在感」:改 UART 打包函数
加热器开/关会打继电器,声音很响,适合做 PoC。研究员盯上调试串口里反复刷的 uart send: 字符串,在 Ghidra 里跟到 FreeRTOS 任务和队列,定位到编码函数 Govee\_Uart\_Protocol\_Package。固件里调试字符串不少,跟引用比对着看,比盲翻汇编快得多。
原始逻辑是正常组包;补丁把开头的校验分支换成:不管上层想发什么,一律改写成「开加热」或「关加热」交替。状态位甚至借用了日志级别变量里的高位来翻转。
心跳、读传感器……所有高频消息全被替换。刷上去之后,设备插着电就不停咔哒——不用猜,一听就知道固件被改了。视频里还能同步看到查版本的绿色 HTTP 包、下载改包、校验通过、重启后开点。
演示选「狂点继电器」是为了直观。真要恶意用,改温度曲线、改上报云端的数据、加后门 beacon,都在同一权限面上。文章没展开那些,但含义很清楚:拿下 OTA,就拿下整台设备的软件定义。
厂商与召回
Include Security 从 2024 年 4 月起跟 Govee 协调披露。厂商承认问题,并表示会上非对称加密 OTA、把通信迁到 HTTPS/MQTTS,但排期一推再推——中间出现过「预计 2024 年 9 月」「再改到 2025 上半年」这类回复,最终在 2025 年 2 月初公开细节。
另:美国 CPSC 后来召回了含 H7135 在内的多款 Govee 智能电暖器,理由是过热/起火风险,并提到无线控制相关功能未满足自愿性标准 UL 1278。公开材料里有 113 起过热报告、7 起火灾、1 起轻微烫伤。召回与本文漏洞是否有直接因果,文中未下定论——技术分享归技术分享,安全合规召回归召回。
对还在用同类设备的人,务实建议就两条:能断网就断网,固件更新通道一天不加固,就多一天同网风险;厂商若已推修复包,优先升,并确认更新本身也走了验签通道。
黑卷点评
一台客厅取暖器,同网劫持明文 OTA,就能换固件、改物理动作。根子不复杂,但很典型。
① OTA 必须 HTTPS + 非对称验签——明文查版本、明文下包,同网换包几乎零成本;别把「自家服务器 + 截断 md5」当成安全边界。
② 有 HMAC ≠ 安全启动——密钥写进镜像、启动硬路径关掉,Bootloader 验了也等于贴纸锁;看校验,先问密钥从哪来。
③ 通用 WiFi 模组是双刃剑——RTL8710 / ESP 一类生态成熟,公开刷写工具多,救砖容易,改固件门槛也低;选型时要把「工具链成熟」算进威胁模型。
换到车载 T-BOX、充电桩、楼宇控制器,题目一样:更新通道就是最高权限入口。别让「智能」只剩 App 好图标,固件门却敞着。
往期推荐
从调试口抽到改固件:Sonoff ZigBee 网关的芯片到云端两条 CVE
EOL 路由照样打穿:Netgear WGR614v9 UART + Bitdefender Box SPI 降级 RCE
拍桌子才出 root:FiberGateway GR241AG UART 故障注入打到公网 WiFi RCE
四根铜焊盘听出 root:TP-Link TL-WR845N UART 未认证调试口
从 UART 焊到未认证后门:ANJIA PTZ 摄像头(CVE-2026-31077)
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论