跳到主要内容

IoT Security

IoT 设备广泛存在硬编码凭证、调试接口暴露、固件漏洞等多个攻击面,且设备生命周期长、补丁覆盖率低。 IoT 的安全问题主要集中在硬编码敏感信息、启用了硬件调试端口、不安全的固件、不安全的数据存储、未认证访问、不安全的通信通道、不安全的配置、数据输入未过滤。与传统软件系统不同,IoT 设备往往在出厂后长期运行而缺乏持续的安全维护,漏洞窗口期可以以年计。

真实攻击案例

Mirai 僵尸网络

Mirai 是 IoT 安全史上影响最深远的攻击事件,它证明了大规模默认凭据扫描可以将数十万台普通设备武器化为 DDoS 工具。 Mirai 通过伪随机扫描互联网 IP,对开放 Telnet/SSH 端口的设备尝试内置的默认用户名密码列表进行暴力登录,感染家用路由器、网络摄像头、空气质量监测器等设备,在峰值期间控制了数十万台设备。被控设备组成的僵尸网络对 OVH、Dyn、Krebs on Security 等目标发起了有史以来规模最大的 DDoS 攻击,导致 Twitter、Netflix、Reddit 等主流网站对美国东海岸用户断网近一整天。Mirai 源码公开后,多个变种相继出现,针对 IoT 设备的僵尸网络攻击从此形成工业化产业。

Mirai 的核心漏洞不是技术复杂的零日,而是用户从未更改的出厂默认密码。 受测 IoT 设备中有四分之三以默认配置部署时即被感染。这表明攻击门槛极低——攻击者不需要理解设备的内部机制,只需要一张默认凭据表和一个端口扫描器。

摄像头劫持与隐私泄露

网络摄像头因其高网络暴露度和低安全配置,成为 IoT 设备中被劫持频率最高的品类。 攻击路径通常是:扫描开放 RTSP(554)或 HTTP 管理端口、尝试默认凭据或已知 CVE 漏洞、直接取得视频流访问权限。Shodan 等搜索引擎可实时检索到大量未经认证即可访问视频流的摄像头。部分针对 DVR/NVR 固件的漏洞(如命令注入、堆栈溢出)已被批量武器化,允许攻击者在同一厂商的所有设备上复制攻击。

IoT基础信息

  • CPU架构:ARM、X86、MIPS、PPC
  • 内存:
  • 储存:Flash(NOR/NAND)、SD、TF
  • Bootloader:Uboot
  • 操作系统:Linux、RTOS、VxWorks

固件

固件提取

固件提取是 IoT 安全研究的起点,目标是获得设备运行的完整二进制镜像以便后续分析。 提取路径从软件到硬件依次升级,软件途径失败后才需要动用物理手段。

预留接口读取

调试接口是厂商为开发便利预留的后门,通常在量产设备上未被禁用,是最快速获取固件的方式。 通过 JTAG/SWD 接口可以直接访问处理器的调试功能,读取内存中的完整固件内容。

JTag/SWD

Jlink/Xtag(GDBs/OpenOCD)插入Jtag->Jflash读取

UART/USART

UART 串口往往直接暴露设备的 Linux Shell,无需任何认证即可获得系统级访问权限。 通过 USB 转 TTL 连接主板 UART 口,使用 PuTTY Serial 模式连接 COM 口(Speed 9600),上电后即可拿到 Shell,进而通过修改 bootargs 参数(init=/bin/sh)获得完整文件系统访问。

  • USB转TTL,连接主板UART口
  • 使用PuTTY Serial模式连接COM口,Speed 9600
  • 上电,拿到shell
    • 通过init启动sh。printenv、setenv bootargs init=/bin/sh、saveenv、getshell

提权获得文件系统权限

当正常调试接口受限时,设备自身的提权漏洞或后门同样可以作为突破口。 利用已知漏洞或预置后门获得完整 Shell 后,即可访问文件系统并提取固件。

从存储芯片读取固件

直接读取 Flash 存储芯片是最彻底的固件获取方式,完全绕过软件层的所有防护。 在线飞线读取可以在不损坏设备的情况下完成,拆焊离线读取则适用于在线读取受保护的场景。

飞线Flash芯片在线读取固件

通过芯片夹连接到芯片的引脚,连接电脑,使用编程器即可读取保存固件。

拆焊Flash芯片离线读取固件

将Flash芯片拆焊下来,通过烧录座编程器,离线读取保存固件。

拆焊STM32->插入烧录座->Jlink插入Jtag->JFlash读取。

其它获取固件方式

固件在流通环节中往往存在公开可获取的副本,软件手段有时比硬件手段更高效。 官方渠道、第三方分享、OTA 更新抓包以及逆向配套软件都是低成本获取固件的路径。

  • 官网下载
  • 找售后客服或代理商要
  • 三方网站共享的
  • 中间人抓包获取更新固件时的远程链接
  • 有些产品固件更新需要借助独立的软件,可逆向该软件获得固件。
  • 逻辑分析仪
  • 修改uboot启动脚本,删除密码、启动sh、挂在硬盘等方式获取高权限和文件
  • 通过uboot的md命令读取内存,NOR Flash使用

网络协议攻击面

MQTT 协议漏洞

MQTT 是 IoT 设备间通信最广泛使用的轻量级发布/订阅协议,但其设计优先考虑低功耗传输,安全机制严重不足。 MQTT Broker(消息中间件)在互联网上大量暴露,默认配置往往不启用认证,任何人都可以匿名连接并订阅所有主题(# 通配符),实时读取设备上报的传感器数据、位置信息、控制指令。

MQTT 的典型攻击路径包括:匿名订阅截获数据、伪造设备身份发布控制指令、以及针对 Broker 的 DoS 攻击。 攻击者连接到暴露的 Broker 后,可以向设备的控制主题发布伪造指令(如关闭报警、开锁、修改温控设定值),因为 Broker 无法区分合法控制端与攻击者。MQTT 服务器同样容易受到拒绝服务、缓冲区溢出类攻击。

防御方向:

  • 启用 TLS/SSL 加密传输层,避免明文传输
  • 配置用户名/密码认证和 ACL 访问控制列表,限制每个客户端只能访问特定主题
  • 将 MQTT Broker 部署在内网,避免直接暴露到公网

CoAP 协议漏洞

CoAP(Constrained Application Protocol)专为资源受限设备设计,基于 UDP 的无状态特性使其天然容易遭受 IP 欺骗和反射放大攻击。 攻击者可以伪造受害者 IP 向大量 CoAP 设备发送请求,设备将响应数据发送到伪造的受害者地址,形成流量放大效果,被用于 DDoS 攻击中的反射放大。CoAP 同样普遍缺乏认证机制,暴露在公网的 CoAP 服务允许未经认证的资源读写。

OTA 更新劫持

OTA(Over-the-Air)更新机制本是修复漏洞的通道,但设计不当时会成为攻击者植入恶意固件的入口。 常见的攻击手法包括:中间人攻击拦截并篡改更新数据包(当更新流量未加密或未验证服务端证书时);利用弱签名验证机制绕过完整性校验安装伪造固件;供应链攻击在更新服务器端植入恶意镜像。一旦攻击者控制了 OTA 渠道,可以对同一型号的所有在线设备批量推送恶意固件,实现大规模设备控制。

防御方向:

  • 对更新包实施固件签名,设备验证签名后再执行更新
  • 使用 TLS 加密更新传输通道,并严格校验服务端证书
  • 实施安全启动(Secure Boot),确保只有经过签名的固件才能运行

云后端与移动 App 攻击面

IoT 系统的安全边界远不止设备本身,云后端和配套移动 App 通常是更容易被突破的薄弱环节。 研究对数十款 IoT 厂商 App 的测评发现,绝大多数存在代码篡改、硬编码密钥、不安全 API 等问题。典型攻击路径包括:

  • 云 API 越权访问:后端接口存在 IDOR(不安全的直接对象引用),攻击者通过遍历设备 ID 可以访问并控制其他用户的设备。
  • 移动 App 逆向:App 中硬编码的 API 密钥、云存储凭证、加密密钥可以通过反编译直接提取,进而横向移动攻击云端。
  • API 流量重放:App 与云端通信的控制指令(开锁、关警报)被拦截后重放,在缺乏时效性校验的系统中直接生效。
  • 云凭证泄露:S3 Bucket 等云存储配置错误导致大量设备数据(固件镜像、用户数据、日志)公开可访问。

固件逆向

识别压缩算法

固件逆向的第一步是判断数据是否经过压缩或加密,决定后续分析路径。 通过 binwalk -E 可以分析固件的熵值分布,高熵区段通常意味着压缩(LZMA、LZO、LZMA2 等)或加密。

加密固件的破解关键在于找到解密密钥,而解密程序往往藏在历史版本固件中。 存在几种典型情况:

  • 早期固件版本没有加密,解密程序随着某个过渡版本提供,过渡版本的固件未加密,找到这个版本提取解密程序来解密最新版本固件。
  • 早期固件就开始加密,中间更改了加密方案,新解密程序随着某个过渡版本提供,过渡版本使用的还是老的加密方式,找到这个版本提取解密程序来解密最新固件。
  • 早期固件就开始加密,中间更改了加密方案,没有过渡期间,后续的版本固件直接使用新加密方案。

第一种情况出现概率较高,第二种也有可能,第三种则难以从版本历史中找到突破口。

在历史固件中找到解密程序后,通过 QEMU 模拟执行解密程序,对新版本固件解密,之后使用 binwalk 提取即可。

IoT 防御困境

IoT 设备难以防御,根本原因在于采购链长、缺乏源码、用户无法主动更新固件。 设备从芯片厂商到方案商再到品牌商,中间经历多个环节,安全责任分散且无人全程负责。出厂后,设备运行在用户网络中,缺乏可靠的远程更新机制,即使厂商发布了补丁,部署率也极低。更关键的是,设备往往使用第三方闭源固件,连品牌商自己也无法审计内部代码,用户更是彻底无从干预。这意味着大量已知漏洞会在设备整个生命周期内持续存在,成为网络中长期暴露的攻击面。