Zigbee近场打进网关:拆PhilipsHueBridge的OTA堆溢出(CVE-2026-3555)"

admin 2026-10-16 13:40:35 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

Zigbee 近场打进网关:拆 Philips Hue Bridge 的 OTA 堆溢出(CVE-2026-3555)

原创

黑卷
黑卷

黑卷的IoT攻防日记

2026年10月14日 10:05
上海

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

先把结论摆上来:Pwn2Own Cork 第一次开智能家居赛道,Synacktiv 的 Mehdi Talbi 与 Matthieu Breuil 没去挤 HomeKit 的局域网洞,而是从 Zigbee 近场把 Philips Hue Bridge 标准版打成了 reverse shell。漏洞落在厂商私有 ZCL「Download Blob」分片拷贝上,编号 CVE-2026-3555。

换句话讲:灯还在闪,网关已经是你的壳。对做智能家居和车联网网关评估的人来说,这比又一个局域网 CGI 0day 更值得记一笔——RF 面同样能直接进 root。

目标是白壳标准版(赛场指定机型,不是 2025 才出的黑壳 Pro)。板子跑 MIPS Linux,核心业务几乎全塞进一个叫 ipbridge 的大二进制:体积超过 9 MB,函数约 4 万个,多实例同时管 HomeKit、Matter 和 Zigbee。

作者从买板到第一次 root 用了三周:第一周摸 SSH 和攻击面,第二周逆向 Zigbee 状态机,第三周写利用。赛场上第二次尝试打通——第一次只是 Zigbee 信道配错,不是 exploit 不稳。

这种节奏本身就说明问题:智能家居网关并不是「黑盒不可碰」。调试口捷径一开,后面全是软件活;RF 面再给一条不撞车的入口,三周足够出赛场级链。

整条链长什么样

一句话:短接开机脚开 SSH → 逆向 ipbridge → 用 nRF52840 假冒飞利浦灯泡触发 Download Blob FSM → 堆溢出(CVE-2026-3555)→ musl dlmalloc 上走 Vudo 任意写 → 劫持读 Zigbee 帧的全局函数指针 → reverse shell。下面拆开讲。

三周摸透一台网关

ZDI 规定的攻击场景是:能碰局域网服务,或能从近场网(Wi‑Fi / Bluetooth / Zigbee)动手。多数队伍扎进 HomeKit 的 hk_hap(TCP 8080)——认证绕过再加内存破坏,撞洞风险高。作者刻意选了 RF 面,撞车概率低一档。

再补一层背景:Zigbee 网络里常见两把钥匙。默认 Link Key 很多设备仍是字面量 ZigBeeAlliance09,用来保护配对时下发的 Network Key;旁听配对窗口,Network Key 就可能被抠出来。Zigbee 3.0 用 install code 加严了这一步,但落地参差不齐。

对评估的人更要紧的是:就算 Network Key 护住了,厂商私有簇的解析漏洞仍然能在已入网节点上触发——这篇打的就是「已经在配对 / 发现流程里」的网关逻辑,不只是偷钥匙。

Zigbee 帧怎么进进程

空中帧先被板上的 Atmel 控制器接住,转成文本格式,再经 /dev/ttyZigbee 串口设备丢给 ipbridge 里的 smartlink 线程。消息长这样:

Group,Command,Data_1,Data_2,...,Data_N

二进制按 Group 分了十二类:Bridge、Link、Zdp、Zcl、TrustCenter……每一类挂一批处理例程。不是所有消息都来自空中,有些是控制器自己下的内部命令。

这一层「控制器 → 文本帧 → 大二进制」的折返,往往让人误以为 Zigbee 栈在独立芯片里、主机侧只做业务。实际上主机进程仍在解析字段、跑状态机、分配堆块——溢出点就在这里,不在射频前端。

别人打 HomeKit,他们盯 Zigbee

局域网热区是 HomeKit;Matter、mDNS、UPnP 也在听,但作者没深挖。本地拿壳很直接:开机时短接特定脚,就能重置密钥并打开 SSH——逆向成本接近零。真正的赛场武器,落在 Zigbee 厂商私有命令上。

Check Point 早年那篇《Don't be silly – it's only a lightbulb》把 Zigbee 帧处理里的一堆坑摊开过,是很好的入门。作者把火力收在 Philips 私有 ZCL 上:非标命令没有公开规范约束,实现更容易缺边界检查。

Download Blob 状态机

ipbridge 里一堆 FSM(有限状态机)管节点发现、配对、配置。Download Blob 这一台,负责在发现新节点后,按块把型号信息下载下来。作者还写了 IDA Python 脚本,把状态、迁移、事件画成图,黄点是初始态 IDLE。

漏洞就挂在这台机器上。要撞进有漏洞的处理函数,FSM 得先被别的状态机(Configure Devices)从 IDLE 拉起来——对飞利浦灯泡,网关会主动要 model 信息,于是 Download Blob 开始转。

帧格式与漏掉的那一刀

Philips 私有命令的判定很直白:manufacturer_code == 0x100B 且 cluster_command == 0xC1,就进 zcl_handle_block_received_data,再触发 FSM 事件 DATABLOCK RESPONSE RECEIVED。真正干活的函数从 payload 里抽出 offset、total\_size、blob\_size,再 memcpy 进堆缓冲。

校验其实写了不少:offset 要对上上下文期望值;total_size 要 ≥ offset + blob_size 且 < 0x2800;blob_size + 11 还得等于整帧长度。偏偏没验:这一片会不会越过首包分配的 ctx->total_size。

利用姿势很经典:第一包用很小的 total_size 触发 malloc;第二包把 blob_size 撑过 ctx->total_size - offset,邻接堆块元数据被写穿。这就是 CVE-2026-3555。

注意:直接跳进漏洞函数不行,Download Blob 得先处于 REQUEST DATA BLOCK 一类状态。Configure Devices 状态机在给新发现的飞利浦节点要 model 信息时,会把 Download Blob 从 IDLE 拉起来——所以假灯泡不只是「能说话」,还得把配对 / 发现流程完整走完。

分配器一认,Vudo 复活

桥上用的是 musl 1.1.24 改过的 dlmalloc。作者一开始想喷一个带函数指针的邻接对象,很快放弃——转而打分配器本身。Phrack 老文《Vudo malloc tricks》里的套路,在这套堆上重新管用。

直接改邻块的 next / prev 容易把 bin 链搞崩、双分配、进程早死。更稳的做法是把邻块 csize 改成「负值」,让 free 时的合并遍历拐进溢出缓冲里预埋的假 chunk 链。假块不在真实 bin 里,每走一节就触发一次 4 字节任意写。

任意写用来放下一段调用 system 的迷你 shellcode,再写下 reverse shell 命令字符串,最后劫持「读 Zigbee 帧」用的全局函数指针——这条路径被高频轮询,shellcode 会赶在分配器不一致扩散之前跑起来。要触发 free,在 payload 后再丢三包畸形帧,FSM 进 RETRY,重试次数超限就回 IDLE 并释放缓冲区。

假灯泡:nRF52840 + ZBOSS

空中侧要有一台能说 Zigbee、还能在配对窗口里装成飞利浦灯泡的设备。硬件选了 nRF52840 加密狗,USB 直接拖拽刷固件。软件先试了 WHAD(Python 框架,写交换快),但 commissioning 状态机定时太紧,Python 栈延迟扛不住,配对反复超时。

后来换成厂商常用的 ZBOSS 原生栈:改一份灯泡示例,填好 endpoint / attribute,把 model 信息采集阶段的 payload 嵌进去。定时一稳,漏洞路径就能反复复现。

工具链选择本身也是经验:能快写的 Python 框架适合抓包与原型,但对「状态机定时以毫秒计」的近场协议,经常要把热路径沉到原生固件里。车载的 BLE / UWB 钥匙评估里,同样常见这种「原型用脚本、决赛用固件」的切换。

演示现场很直观:手机 Hue App 正在加灯,笔记本一边跑 HTTP 服务一边 nc 听壳。灯图标亮起来的时候,桥上的 shell 也回来了。

赛场成绩

这台 Hue 是 Synacktiv 多项得分演示之一。Cork 站 Master of Pwn 榜上,Synacktiv 以 11 分、奖金 9 万美元排第三。智能家居赛道第一次开张,Zigbee 近场打穿网关,给后面做评估的人树了个不太好看的样板。

缓解怎么做

分片拷贝必须按「首包分配长度」卡上界,别只验帧自洽。厂商私有 ZCL 要当外网入口看,评估报告里单独开 RF 面。配对窗口与默认 Link Key 该杀就杀,Zigbee 3.0 install code 要真正启用。量产件封死开机短接 / SSH 捷径,否则逆向成本接近零。

对已经铺出去的网关,至少要能识别固件版本、推进补丁;硬件改版周期长,不能把「等下一版」当成唯一答案。

黑卷点评

这篇我看完第一反应是:又一个「局域网打穿了以为完事、RF 面根本没进威胁模型」的现场。结合我做 IoT / 车联网评估的习惯,记三条:

一是局域网打穿不算完,RF 近场也能打进网关。HomeKit 是热区,Zigbee 厂商私有命令往往更脆。智能家居网关、车端的蓝牙钥匙 / UWB / Zigbee 路侧节点,RF 面都要单独进 TARA,不能写一句「仅局域网」就收工。

二是FSM + 分片拷贝,是嵌入式溢出高发区。校验写了一堆,漏掉「相对首包分配长度」就够用。评估固件时我会专门搜「按块下载 / blob / model info」这类状态机,而不是只扫 HTTP 参数。

三是分配器决定利用上限。认出 musl dlmalloc,Vudo 旧技巧立刻复活。报告里记下 libc 版本和分配器变种,比只写「存在堆溢出」有用得多。做 GB 44495 / ISO 21434 陪跑时,网关类组件我会要求看到:RF 面测试记录、私有簇解析的边界检查、以及本地调试口是否封死。

防御侧很直接:分片上界校验;私有 ZCL 当外网入口;干掉默认 Link Key、启用 install code;量产封死短接拿壳路径。对已经铺出去的设备,至少要能远程识别固件版本并推动补丁。


往期推荐


Zigbee近场打进网关:拆PhilipsHueBridge的OTA堆溢出(CVE-2026-3555)" 网络安全文章

Zigbee近场打进网关:拆PhilipsHueBridge的OTA堆溢出(CVE-2026-3555)"

本文详述Pwn2OwnCork赛事中Synacktiv团队通过Zigbee近场攻击PhilipsHueBridge的完整过程,利用CVE-2026-3555堆溢出漏洞实现远程代码执行。攻击链包括短接开机脚开SSH、逆向ipbridge二进制、用nRF52840假冒飞利浦灯泡触发DownloadBlob状态机、利用musldlmalloc的Vudo任意写技术劫持函数指针获得reverseshell。文章强调RF面安全评估的重要性,并提出分片上界校验、封死调试口、启用installcode等缓解措施。
地下室不计入排练时长" 网络安全文章

地下室不计入排练时长"

乐队成员在排练时发现租用的排练室涨价,睦提出使用她家免费的地下室排练,乐队成员们接受了提议并进行了排练,同时展现了乐队成员间的相互支持和鼓励。
评论:0   参与:  0