【论文总结】理解和减轻IoT消息协议的安全风险
理解和减轻IoT消息协议的安全风险
- 介绍
- 概述
- 前置知识
- 威胁模型
- MQTT IoT通信安全分析
- 未授权的MQTT消息
- 未授权的Will消息
- 未经授权的保留消息
- MQTT会话管理故障
- 未更新的会话订阅状态
- 未更新的会话生命周期状态
- 未经身份验证的 MQTT 身份
- 客户端id劫持
- MQTT Topics的授权
- MQTT Topic不安全的快捷方式
- MQTT 的表达语法
- 测量
介绍
这是一篇来自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)。作者将这些信息组合起来纵向分析,能够推断出用户的私人习惯、行为或关系。
相关文章:

【论文总结】理解和减轻IoT消息协议的安全风险
理解和减轻IoT消息协议的安全风险介绍概述前置知识威胁模型MQTT IoT通信安全分析未授权的MQTT消息未授权的Will消息未经授权的保留消息MQTT会话管理故障未更新的会话订阅状态未更新的会话生命周期状态未经身份验证的 MQTT 身份客户端id劫持MQTT Topics的授权MQTT Topic不安全的…...
SpringBoot基础入门
一、概述 Spring Boot是一个开源的Java框架,它是基于Spring框架的基础之上创建的。Spring Boot可以帮助开发人员更快地创建Spring应用程序,并以最小的配置要求来运行它们。Spring Boot可以用于构建各种类型的应用程序,包括Web应用程序、RESTful API、批处理作业、消息传递应…...
jar 包与 war 包区别
1、war是一个web模块,其中需要包括WEB-INF,是可以直接运行的WEB模块;jar一般只是包括一些class文件,在声明了Main_class之后是可以用java命令运行的。 2、war包是做好一个web应用后,通常是网站,打成包部署…...

【数据结构:复杂度】时间复杂度
本节重点内容: 算法的复杂度时间复杂度的概念大O的渐进表示法常见时间复杂度计算举例⚡算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的&…...

京东pop店铺订单导出
下载安装与运行 下载、安装与运行 语雀 特别提醒 只能导出已登录店铺的订单导出的收件人手机号是虚拟号 功能 主要是方便线下工厂发货的店主 所见即所得的导出自由选择导出项自由排序Excel导出列顺序导出过程中有进度提示,用户可以随时提前中止 什么是所见即所…...

论文阅读:Towards Stable Test-time Adaptation in Dynamic Wild World
今天阅读ICLR 2023 ——Towards Stable Test-time Adaptation in Dynamic Wild World Keywords:Test-time adaptation (TTA); 文章目录Towards Stable Test-time Adaptation in Dynamic Wild WorldProblem:motivation:Contributio…...
2022国赛27:Linux-1时间服务chrony配置
大赛试题内容: 3.利用chrony配置Linux-1为其他Linux主机提供时间同步服务。 解答过程: 安装chrony服务[root@cs1 ~]# yum -y install chrony 配置/etc/chrony.conf文件[root@cs1 ~]# vi /etc/chrony.conf 7行改为 server 10.10.70.101 iburst 23行改为 去掉#号 allow 1…...

Java——二维数组中的查找
题目链接 牛客在线oj题——二维数组中的查找 题目描述 在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二…...
Android 9.0 添加关机铃声功能实现
1.前言 在9.0的系统rom定制化开发中,在原生系统中,关于开机铃声和关机铃声是默认不支持的,系统默认支持开机动画和关机动画等功能,所以关于增加开机铃声和关机 铃声的相关功能,需要自己增加相关的关机铃声功能 2.添加关机铃声功能实现的核心类 frameworks\base\cmds\boo…...
IPv4 和 IPv6 的组成结构和对比
IPv4 和 IPv6 的组成结构和对比IPv4IPv6互联网协议 (IP) 是互联网通信的基础,IP 地址是互联网上每个设备的唯一标识符。目前最常用的 IP 协议是 IPv4,它已经有近 30 年的历史了。然而,IPv4 存在一些问题,例如: 地址空间不足:IPv4 …...
Spring的事务管理
Spring的事务管理Spring的事务管理1、事务的回顾【1】事务的定义【2】事务的ACID原则2、spring事务API介绍【了解】【1】PlatformTransactionManager【1.1】PlatformTransactionManager作用【1.2】PlatformTransactionManager接口【1.3】PlatformTransactionManager实现类【2】…...
MCAL知识点(十六):VADC驱动配置详解(理论基础篇)
目录 1、概述 2、EB配置 2.1、通用界面配置 2.1.1、General 2.1.2、AdcConfigSet_0 2.1.3、AdcGlobinputClass 2.1.4、AdcHwUn...

MySQL--库的操作--校验规则对于数据库的影响--0409
目录 1.库的基础操作 查看数据库 创建数据库 删除数据库 查看建库语句 修改数据库 2.字符集和字符集校验规则 2.1 查看系统默认字符集以及校验规则 2.2 使用特定的字符集创建数据库 2.3 不同校验规则对数据库的影响 2.3.1 大小写验证 2.3.2 排序验证 3.备份和恢复 3.1…...

markdown-it基本使用
markdown-it能够将markdown语法的内容转换为html内容,这样我们使用markdown语法写的笔记,就可以转换作为网页使用了 Markdown语法 Markdown语法图文全面详解(10分钟学会) 基础使用 安装markdown-it npm install markdown-it --save使用markdown-it …...
CMake入门教程【核心篇】8.3对象库
文章目录 知识点实例代码目录代码实现知识点 add_library(libhello OBJECT src/hello.cpp)使用OBJECT 参数可以把对象传入到libhello 中,且不会生成.lib文件 使用变量$<TARGET_OBJECTS:libhello>即可获取,比较实用 实例 代码目录 |-📁prj10 |-- 🎴CMakeLists…...

单片机_CT107D训练平台电路原理图\蓝桥杯训练板\IO扩展模块\74HC138译码器
74HC138译码器(实现3个IO口控制8个引脚实现IO口的扩展) 配置信号放大模块,可以对输入的低电压模拟信号进行放大; 配置 138 译码器,可以做译码实验; 外设可以用存储器映射方式访问,也可以直接控…...
Rabbitmq消息确认机制
1.生产者确认机制 确认消息发送到交换机--Confirm方式 1.1普通Confirm方式 private static void sendMsg(Channel channel) throws IOException, InterruptedException { //开启确认机制 channel.confirmSelect(); //发送消息到exchange St…...

FinClip 云开发实践(附小程序demo)
在开发一个小程序时,除了考虑界面功能逻辑外,还需要后端的数据支持,开发者需要提前考虑服务器、存储和数据库等相关需求的支持能力,此外还可能需要花费时间精力在部署应用、和依赖服务的建设上。 因此,腾讯小程序为…...

真正好用的工业品ERP系统应该是什么样的?
一个好用的进销存ERP系统应该有以下特点: 1. 全面覆盖企业经营流程,包括采购、销售、库存、财务等模块,能够实现全方位的管理和控制。 2. 自定义配置,灵活地适应大多数用户的需求。 3. 数据精准、实时化,支持统计分…...
Shiro重定向
使用了统一认证,然后每次登录,不能定向到用户指定的界面,非得回到首页,所以做了如下改动 1、在FormAuthenticationFilter中在issueSuccessRedirect中加上五句话。 Overrideprotected void issueSuccessRedirect(ServletRequest …...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...