理解和减轻IoT消息协议的安全风险
介绍
这是一篇来自2020S&P论文,作者有Yan Jia, Luyi Xing, Yuhang Mao, Dongfang Zhao, XiaoFeng Wang, Shangru Zhao, and Yuqing Zhang。
概述
本文首次对主要的IoT云平台与设备通信消息协议的安全性进行了系统研究,作者发现这些云平台上的消息传输协议很容易受到攻击,并且利用这些漏洞进行攻击会造成严重后果。为此,作者提出了IoT云端通用消息协议的安全原则,并且提出和实施了端到端保护的方法。
前置知识
1.基于云平台的IoT通信
一个基于云端IoT系统通常包含三部分:cloud(本文中指云平台)、IoT Device、user’s management console(手机应用)。如图1 所描述的,云是这类系统的关键部分,它控制着设备和应用之间的通信,并且需要对设备和应用进行配对和身份认证。
2.MQTT协议
MQTT是IoT中常用的发布-订阅(publish-subscribe)消息传递协议,它是一个应用层轻量级协议,能够在资源受限的设备上运行。 MQTT通信协议的核心是MQTT消息代理(message broker),如图1所示。
以代理为连接枢纽,MQTT使用发布-订阅模式进行通信: - MQTT客户端(设备或应用)将消息发布到代理托管的特定主题(topic) - 代理将消息路由到另一个订阅了该主题的客户端
MQTT客户端向代理发送三类基本类型消息:CONNECT(建立连接)、PUBLISH(发布主题消息)、SUBSCRIBE(接收订阅消息),如图2所示。
首先,MQTT 客户端,例如智能空调或应用程序,发送 向代理发送用于建立 MQTT 会话的 CONNECT 消息(如果代理接受连接)。session和client由一个ClientId字段唯一标识(嵌入在CONNECT消息中)。在发布状态时,代理维护每个会话的订阅状态,并将发布到主题的 MQTT 消息传递给其订阅者。 通过此渠道,应用程序可以代表其用户在设备上运行,方法是向设备订阅的主题(例如,启动或停止)发布推荐。 此外,设备可以定期将其状态信息更新为主题,例如当前温度,所有订阅该主题的应用程序都会收到该信息。
3.MQTT保护机制
MQTT本身缺乏身份认证和授权机制,在实践中不同厂商IoT云平台通常会实施自定义安全机制,本文主要关注MQTT的认证和授权机制。
- 客户端认证: MQTT可以通过不同的方式进行身份验证,如用户名/密码、证书等。
- 客户端授权: 授权机制保证每个用户只能与允许的设备进行通信。
4.will message
will message是指客户端在异常断开连接时,由代理自动发送的消息。它用于通知其他客户端,该客户端已断开连接。该消息可用于指示客户端由于错误而断开连接或故意断开连接。该消息还可用于指示客户端已停止工作或停止响应。
5.保留消息
保留消息(retained message)是指当MQTT客户端发布了一条消息到相应的主题,而没有客户端订阅该主题(例如设备离线),代理会存储每个主题的最后一条消息(保留消息),当订阅该主题的客户端上线时,代理会将该保留消息投递给它。
威胁模型
- 攻击者能够开通IoT平台账户,能够收集和分析平台、设备与自己应用之间的网络流量,但不能窃听其他用户设备和应用之间的流量。
- 设备共享。攻击者可能具有设备临时访问权限。例如度假酒店为访客授予临时访问设备的权限。
MQTT IoT通信安全分析
作者将MQTT通信分为4个实体:标识符、消息、主题和会话(session),分别研究分析MQTT协议的安全性。下面描述作者在对MQTT协议分析过程中所发现的问题。
未授权的MQTT消息
该场景是在用户具有临时访问设备的权限下被信任,但在其他设备外不能获取任何信息的情况下。
未授权的Will消息
Will消息由客户端提前设定,可以包含控制命令或文本。一旦客户端意外断连(未发送DISCONNECT消息),代理会发布Will消息到所有订阅该主题的客户端,来使他们采取相应的操作。
在设备访问权限转移的情况下,这种意外处理机制会存在问题。攻击者(前用户)可以注册一条Will消息,在他不具有访问权限时触发该消息,来实现攻击。作者使用iRobot Roomba 690在AWS IoT云端实现了利用Will消息的PoC,如图3所示。IBM、Baidu、Tuya Smart等云平台存在与AWS相同的问题。
未经授权的保留消息
攻击者(前用户)在具有设备访问权限期间可以向设备订阅的主题发布保留消息,然后在失去权限时等待设备上线并接收保留指令,以实施攻击。作者发现Baidu IoT Cloud和Eclipse Mosquitto(开源的MQTT代理)会受到此类攻击。
MQTT会话管理故障
MQTT通信是通过在客户端和代理之间建立会话进行的,会话与MQTT客户端状态关联,因此当客户端状态发生变化(如撤销授权),其已建立的会话状态也要更新。
未更新的会话订阅状态
作者发现在MQTT协议规范中没有任何关于在客户端状态变化时更新会话状态的规定和说明。这会导致如果攻击者(前用户)建立了订阅主题的会话,即使之后撤销他的权限使其不能够订阅主题,代理仍然会通过已建立的会话向攻击者(前用户)传递消息,使得攻击者可以接收到当前用户的消息。作者确认了很多IoT平台(IBM、Tuya、Alibaba、Baidu)上存在这种不安全的会话状态管理。
未更新的会话生命周期状态
MQTT客户端可以是设备或用户,通常情况下,IoT云平台将设备看作要访问的资源,将用户看作需要进行身份验证和授权的主体。作者发现这种差异存在安全隐患,当设备由新用户重置时,会删除前用户对设备的访问权限,但是不能撤销设备访问MQTT代理主题的权限。
如果攻击者(前用户)在权限期内获得设备身份凭据(流量分析或逆向工程),那么即使新用户重置设备,攻击者也可以利用设备凭据来伪装成设备发布虚假消息到相应主题。一些IoT平台采取了措施来防止这种攻击,当用户更改时,设备会被强制过期。
但是作者发现如果攻击者在凭据过期之前建立会话并保持会话在线,那么即使凭据过期,他仍可以通过该会话伪造设备消息。这是由于平台在重置设备时,没有更新已建立MQTT会话状态。作者在IBM、Tuya、Alibaba、Baidu等平台中确认了该问题。
未经身份验证的 MQTT 身份
一个IoT平台账户可以有多台设备,每个设备有自己的身份标识ClientId,一台设备可以在多个账户之间共享。作者指出如果这种关系不能安全管理,会使MQTT通信受到攻击。
客户端id劫持
MQTT协议要求代理在发现相同ClientId的新客户端时,断开与原客户端的连接,这会造成DDoS攻击。作者还发现在这种情况下,MQTT代理和客户端能够重新加载之前的会话,恢复之前的状态。
攻击者可以拥有合法的平台账户,即能够建立起与平台的MQTT连接,如果平台不能正确处理平台账户与设备身份的安全访问机制,攻击者可以利用上述机制,通过已知的ClientId来恢复会话并窃取信息。例如,攻击者利用自己的平台身份和通过某种手段获取的受害设备的ClientId,在平台建立MQTT连接,那么即使攻击者没有订阅该设备的主题,仍然可以收到该设备的消息。
攻击者可以通过两种方式来获取ClientId:
- 猜测:ClientId是一个具有特定语义、格式的序列,由于MQTT规范仅要求ClientId的唯一性,大多数IoT云平台建议使用便于管理的ClientId,例如MAC地址、递增分配序列号。攻击者可以从一个已知的ClientId开始进行穷举搜索。
- 共享设备:如果攻击者可以短期访问该设备,那么该设备的ClientId会永远暴漏给攻击者。
作者使用iRobot Roomba 690在AWS IoT云平台上实施了攻击。通过搜索设备该设备令牌附近的序列,来推测了一组可能的iRobot产品设备ClientId,结果显示这样能够造成大规模的DDoS攻击。作者在AWS、Baidu IoT Cloud、IBM等平台上发现了此类问题。
MQTT Topics的授权
MQTT主题结构类似分层文件路径,例如/doorlock/[device ID]/status。作者发现IoT云平台上如果存在对MQTT主题的不正确描述,可能会导致授予攻击者过多的访问权限。
MQTT Topic不安全的快捷方式
由于IoT平台可能需要管理成千上万的设备和用户,作者发现很多IoT云平台采用了快捷方式来进行授权。
如果攻击者可以短期内使用目标设备,那么他可以轻松了解该设备的主题(流量分析)。此外,一些厂商将设备唯一标识符用于其MQTT主题,如设备序列号或MAC,可以受到穷举攻击,这样攻击者仍然可以订阅该设备的主题,窃取隐私信息。
作者使用HONYAR Smart Plug IHC8340AL实施攻击,通过对苏宁Smart Living手机应用和云平台之间的流量进行分析,可以找到它的MQTT主题。作者使用脚本成功订阅了该设备的所有主题,之后即使重置设备使用另一个账户,同样可以进行攻击
MQTT 的表达语法
一台设备可能有很多关联的主题(例如/deviceID/cmd用于传递命令,/deviceID/status用于更新状态),为了便于使用,云平台通常允许用户使用通配符#或+来订阅该设备甚至多个设备的多个主题,这存在很大的安全隐患。
AWS上,即使存在禁止用户访问一个类似deviceId/cmd的主题,如果攻击者能够订阅deviceId/#,该主题表示代理上deviceId下的所有MQTT主题,那么攻击者仍然可以访问那些受保护的主题(deviceId/cmd),使得策略被绕过。苏宁云平台上存在类似更严重的问题,任何用户都可以订阅#主题,该主题表示代理上的所有MQTT主题。
作者进行了实验,通过一个脚本与苏宁Smart Living云平台建立了MQTT通信并通过了验证,成功订阅#主题(平台通用主题)。通过订阅,作者收到了来自智能锁、摄像头、监控等大量隐私信息,甚至能够以此来推断家庭/同居关系、行为习惯等。此外,泄露的信息还包括云下所有设备的ClientId,攻击者能够进行DoS攻击使任意用户设备脱机。
测量
作者对当前流行的IoT云平台的MQTT通信进行了评估,结果如表1。
此外,作者还进行了实验来评估这些问题带来的影响。
通过订阅苏宁代理的通用#主题,攻击者可以收集到云下所有设备的消息。作者收集到三周内一共8亿条真实的MQTT消息,包含了大量的设备信息(设备ID、类型、状态、位置、收集的信息等)和用户信息(PII)。作者将这些信息组合起来纵向分析,能够推断出用户的私人习惯、行为或关系。