3. CoAP 安全威胁分析:这五种攻击,你迟早会遇到

CoAP 协议设计之初,主要考虑的是低功耗和轻量级。安全嘛,说实话,当时想得没那么周全。我在做物联网网关项目时,第一次用 CoAP 就被现实狠狠教育了一顿。今天我把最常见的五种攻击手法拆开揉碎讲给你听。你想想看,一个传感器节点可能只有几 KB 内存,跑不了 TLS,那攻击者会怎么搞它?

核心观点:CoAP 的 UDP 底座 + 无加密载荷 + 弱身份验证,构成了攻击面的“黄金三角”。这五种攻击不是理论推演,是真实战场上每天都在发生的事。

CoAP 五类攻击全景图 CoAP 协议 嗅探攻击 重放攻击 中间人攻击 资源耗尽攻击 URI 欺骗 攻击后果一览 • 嗅探:泄露传感器数据、控制指令、固件更新内容 • 重放:重复开关门锁、重复执行写操作、状态篡改 • 中间人:完全控制通信、伪造响应、注入恶意载荷 • 资源耗尽:设备死机、电池耗尽、网络瘫痪

3.1 嗅探攻击:你的数据在裸奔

CoAP 默认跑在 UDP 上,消息是明文传输的。这意味着什么?只要攻击者能接入同一个局域网,或者在你的网关和节点之间某个位置搭个监听点,所有 CoAP 消息就跟没穿衣服一样。

我记得有一次做智能楼宇项目,客户说他们的温度传感器数据“很敏感”。我抓了个包给他看——温度值、湿度值、设备 ID、甚至固件版本号,全在报文里明文写着。他当场就沉默了。

我的建议:只要你的 CoAP 消息里包含任何你不希望路人甲看到的内容——传感器读数、控制指令、设备标识——就必须上加密。别信“内网安全”这种鬼话。我在多个项目里见过,内网被攻破往往就是从一台不起眼的摄像头开始的。

嗅探攻击能拿到什么?

  • 载荷数据:温度、湿度、电压、开关状态等传感器读数
  • 控制指令:PUT/POST 里的目标值,比如“设定温度 25°C”或“打开阀门”
  • 元数据:Token、Message ID、URI-Path,这些可以用来辅助其他攻击
  • 设备指纹:通过 Option 字段推断设备类型、固件版本

你可能会问:“那我不传敏感数据不就行了?”嗯,问题是很多场景下你根本不知道什么算敏感。一个智能电表的读数,结合时间戳,就能分析出家里有没有人。我在安全审计时见过太多这种案例了。

3.2 重放攻击:同一个消息,打你两次

重放攻击的原理很简单:攻击者把嗅探到的 CoAP 请求原封不动地再发一次。CoAP 本身没有内置防重放机制——它依赖的是 Token 和 Message ID,但这些字段太容易被预测了。

我亲身经历过一个智能门锁项目。门锁收到 CoAP PUT 请求“/lock/state = unlock”就会开锁。攻击者只要在门口蹲点,等合法用户用 App 开锁时抓一次包,然后自己重放这个请求——门就开了。你说吓不吓人?

避坑指南:我曾经在一个项目中看到团队用 Message ID 做防重放。他们以为 ID 递增就能防重放。结果呢?攻击者只要把 ID 改大一点,消息照样被接受。Message ID 是用于去重和匹配响应的,不是安全机制。别搞混了。

防重放的标准做法:

方案 原理 适用场景 我踩过的坑
时间戳 + 窗口 消息携带时间戳,接收方只接受窗口内的消息 时钟同步良好的设备 低功耗设备时钟漂移严重,窗口设太大又失去意义
Nonce + 序列号 每条消息携带唯一 Nonce,接收方记录已用 Nonce 有状态设备 Nonce 表会膨胀,内存小的设备扛不住
挑战-响应 先交换随机数,再基于随机数计算 MAC 高安全场景 握手开销大,不适合频繁通信

3.3 中间人攻击:你在跟谁说话?

CoAP 基于 UDP,没有 TLS 握手那样的身份验证过程。攻击者只要能在通信路径上插入自己,就能扮演服务器欺骗客户端,或者扮演客户端欺骗服务器。

我参与过一个智慧农业项目,网关和传感器之间用 CoAP 通信。攻击者伪造了一个假网关,传感器把土壤湿度数据发给了假网关,假网关回了一个“灌溉指令”——结果大棚里的作物被淹了半亩。嗯,那次事故的直接损失不大,但暴露的问题很严重:传感器完全无法验证它收到的响应是不是来自真网关。

中间人攻击的典型手法:

  • ARP 欺骗:在局域网内伪造 MAC 地址,劫持 CoAP 流量
  • DNS 劫持:让 coap://sensor.example.com 解析到攻击者的 IP
  • 路由劫持:在 6LoWPAN 网络中伪造路由公告
  • 代理注入:在 CoAP 代理节点上做手脚

关键认知:没有传输层安全(DTLS/TLS),CoAP 的中间人攻击几乎无法防御。你可以在应用层加签名,但密钥分发又成了新问题。我个人建议:只要设备算力允许,优先上 DTLS。实在跑不动 DTLS 的设备,至少用 OSCORE 做端到端保护。

3.4 资源耗尽攻击:让物联网设备“累死”

物联网设备资源极其有限。一个典型的传感器节点可能只有 64KB RAM、几百 MHz 的 MCU、靠电池供电。攻击者不需要搞什么高深漏洞,只要发一堆精心构造的 CoAP 请求,就能让设备累趴下。

我见过最典型的案例:攻击者对一台 CoAP 服务器持续发送 Observe 注册请求,每次都用不同的 Token。服务器要为每个 Token 维护观察关系表,内存很快就爆了。设备重启后,攻击者再来一轮——循环往复,设备永远无法正常工作。

资源耗尽攻击的常见变种:

攻击类型 手法 影响 我见过的真实案例
放大攻击 伪造源 IP,发送小请求触发大响应 网络带宽耗尽 某厂商的 CoAP 代理被用作 DDoS 放大器
观察者洪泛 大量 Observe 注册请求 内存耗尽 智能路灯控制器频繁重启
分片耗尽 发送不完整的分片报文,占用重组缓冲区 无法处理合法请求 6LoWPAN 网络中的经典攻击
计算密集型请求 请求复杂的资源查询或计算 CPU 满载、电池快速耗尽 某温控器被攻击后电池寿命从2年降到3天

避坑指南:我曾经在一个项目中看到团队只做了速率限制,没做资源配额。攻击者用不同的源端口绕过速率限制,照样把设备打挂了。记住:速率限制要结合源 IP、Token、URI 做多维度的配额。另外,对 Observe 注册一定要设上限,我一般建议不超过 32 个观察者。

3.5 URI 欺骗:指东打西

CoAP 的 URI 是资源标识的核心。攻击者可以通过篡改 URI 来诱导客户端访问错误资源,或者让服务器处理非预期的请求。

URI 欺骗的手法很多样:

  • 路径遍历:用 ../ 跳出资源目录,访问敏感文件
  • URI 混淆:用 //、./、URL 编码绕过访问控制
  • 代理 URI 重写:CoAP 代理修改请求的 URI,指向恶意资源
  • 资源名称猜测:通过枚举 URI 发现隐藏资源

我审计过一个智能家居系统。它的 CoAP 服务器用 URI 路径做权限判断:/admin/ 开头的需要管理员权限,/user/ 开头的普通用户可访问。结果呢?攻击者用 /./admin/config 绕过了检查——因为服务器在解析 URI 时没做规范化。就这么一个小疏忽,整个系统的配置信息全暴露了。

我的建议:URI 解析一定要做规范化。把 ..、.、// 全部解析成标准路径后再做权限判断。另外,不要在 URI 里暴露敏感信息——比如设备密钥、会话 ID。我在代码审查时经常看到有人把 Token 直接放在 URI 里,这是大忌。

3.6 小结:这五种攻击,你防得住吗?

说实话,看完这五种攻击,你可能会觉得 CoAP 浑身都是漏洞。但别慌——这些攻击都有成熟的防御手段。嗅探靠加密、重放靠 Nonce 和时间戳、中间人靠 DTLS/OSCORE、资源耗尽靠配额和限流、URI 欺骗靠规范化。

关键是要在项目设计阶段就把安全考虑进去。我见过太多团队先把功能做出来,上线后再补安全——结果发现架构不支持,只能推倒重来。嗯,那滋味可不好受。