前言
IoT正在成为最广泛和实用的在线平台。它将大量的传感器和控制器联网,帮助人们实现和万物之间的无缝通信。IoT正在成为互联网未来的关键,特别是近几年,随着IoT产业的兴盛,多种多样的IoT设备开始迅速发展,全球活跃的IoT设备已经达到70亿,它们在智能家居、智能穿戴、智能制造、智能汽车等一系列和生活相关的领域广泛使用,我们认为这会极大提升我们的生活质量。
同时,IoT设备的安全问题经常发生,也难以解决。惠普的报告表明70%的IoT设备包含安全漏洞,平均每台设备有25个漏洞。攻击者利用这些漏洞控制设备,进行一系列非法的活动。最著名的例子是在2016年Mirai病毒控制了成百上千台IoT设备,用这些设备建造了一个僵尸网络发动TB级的dos攻击,攻击目标包括DNS服务提供商Dyn,这次攻击造成了严重的后果,包括导致美国部分的网络瘫痪。总的来说,随着IoT设备的广泛使用、安全漏洞的增加会对用户的隐私和安全,甚至人类的生活和财产带来严重威胁。
面对频繁的攻击,IoT安全研究变得越来越流行。在美国Auto-ID于1999年第一次提出“物联网”的概念后,安全研究者们投身于IoT行业,研究安全架构和通信的标准。随后产生了许多关于IoT安全的问题。Zhang等人、Mahmoud等人指出了面临的问题和研究方向,于是,研究者开始在IoT安全领域使用传统安全研究的方法。随着AI的发展,将机器学习和深度学习应用于IoT安全上的概念开始产生。Alrawi等人,系统的总结了智能家居中设备、手机应用、云端和通信的IoT攻击点。Xie等人总结及了检测IoT漏洞的技术。最近,Zheng等人发表了IoT漏洞挖掘的技术概论。在上述的两篇论文中,漏洞挖掘和漏洞检测的界限较为模糊。在本文中,漏洞挖掘的技术即挖掘未知的漏洞,漏洞检测指针对已知漏洞的检测。通过以上调查,我们发现现有的研究关注于IoT安全问题,缺少分析技术,其次,漏洞分析技术的重点在漏洞挖掘和检测,缺少漏洞缓解技术,综上,现有的IoT安全的技术总结还不够全面。
为了解决前面提到的问题,我们希望对以下个方面做出一些贡献:
- 首先,我们把重点从IoT架构转移到IoT设备;
- 其次,精简IoT设备安全技术的分类;
- 另外我们总结了现有的研究,包括漏洞分析的基础框架、挖掘未知的漏洞、检测已知的漏洞、漏洞缓解
我们评估了现有的关于IoT设备漏洞分析的研究。除此之外,我们深入分析了阻碍安全研究技术发展的原因,指出了面临的困难和机会。
我们回顾了技术发展的背景,并为相关研究者提出了未来研究的方向。
背景
IoT架构
随着网络的快速发展,越来越多的家用和工业设备开始联网,给我们带来了多元化的生活。物联网架构主要有两个发展方向:消费者层面和产业层面 在消费者层面,如果我们将它们按照应用场景划分,有几类设备类型例如工业制造、智能家居、智能医疗和智能汽车,其中智能家居的发展相对成熟。互联网巨头——三星、谷歌、苹果和小米占据大部分市场份额,同时,它们也发布了SmartThings、Google Weave、Apple HomeKit、HomeAssistant 和 XiaoMi IoT等物联网平台。通过调查这些平台,我们发现绝大多数IoT遵循“设备云端用户”这一架构。
智能设备大部分都放在家中,它们和云服务器进行通信,然后直接或间接通过WiFi、ZigBee、蓝牙或其他协议接入网络。它们上传传感器收集的数据,接收发送给执行单元的控制命令。IoT架构不仅依赖供应商的云,同时也依赖第三方的云,它们相互支持,并为各种功能提供多样化的服务。用户可以通过手机或者电脑连接云查看状态并下载数据。对于一些简单场景例如可穿戴设备,“设备用户”架构更加实用。
对于产业层面,IoT架构延续了IT的做法,通过服务器集中管理用户和设备的交互,区别是设备首先通过OT和PLC进行通信。因此产业中的设备等同于PLC和“传感器+执行器”。安全研究的重点在于PLC。“设备用户”架构也存在于产业物联网:管理员用配置软件控制设备。虽然面向用户的工业终端例如智能仪表也尝试了云的模式,但基于安全考虑没有得到广泛使用。
设备组成
不论是汽车制造中大而复杂的机器,亦或穿戴设备里小巧智能的手环,它们都包含了相对固定的零件例如芯片、闪存、固件等。它们主要包含硬件和软件部分
硬件
- 逻辑芯片:对于复杂的设备来说,它们需要多个逻辑芯片或cpu来运行内置的操作系统;对于简单的嵌入式设备或许只需要一个微处理器来运行程序
- 内存:为系统和程序运行提供空间,大小从KB到GB不等
- 闪存:储存IoT设备固件。部分设备的bootloader也存放在闪存
- 网络模块:IoT设备和传统嵌入式设备的区别就是前者连接了网络。他们通常采用无线技术连接到互联网,如AP
- 串行调试接口:IoT设备需要与外部进行通信,以便调试。串行调试接口可以让开发人员发送和接收命令。最常见的接口是通用异步接收器/发送器UART
软件
- Bootloader:在IoT设备系统启动前,它初始化了硬件设备,将固件加载到引导设备。它使系统的软件和硬件环境达到合适的状态
- 固件:固件包括了操作系统、文件系统和一系列服务程序。IoT设备上的安全研究通常从固件分析开始
攻击面
针对IoT设备的攻击面不仅包括传统软件安全领域,因为它们的特殊结构和功能,也包括了新的攻击领域。根据IoT架构和设备构成,攻击面可以分为三个层面
硬件层
硬件层面的攻击不同于传统的安全领域,它主要包括三个角度:不安全的调试接口、未保护的闪存芯片、硬件敏感信息的泄露
- 不安全的调试接口
当IoT设备被制造的时候,调试接口比如UART会被留在电路板上以便维修。如果它缺少身份验证或者仅有弱身份验证,攻击者就可以通过接口来获得高权限,对固件进行修改或者替换。调试接口在IoT安全检查中排在第一位
- 未保护的闪存芯片
因为闪存通常用来存储固件,因此也成为了关注的重点。如果芯片没有读写保护,安全研究者就可以通过读取固件来分析或者修改固件,来绕过接口的身份验证
- 硬件敏感信息的泄露
硬件电路的密封性并不好,诸如声音和电量消耗的硬件信息泄露可以造成侧信道攻击,攻击者可以由此获得重要的信息,比如密钥。
软件层
软件层面的攻击对应着设备构成中bootloader和固件的软件部分,它主要包括以下五个方面:不安全的bootloader、不安全的操作系统、固件敏感信息泄露、不安全的应用服务、不正确的配置策略
- 不安全的bootloader
因为bootloader是一段在设备运行后加载的代码,因此是一个容易被忽略的攻击点。它的功能是初始化并加载固件,因此当问题出现时它的危险程度很高。例如checkm8这个Boot ROM 漏洞被称为是iphone、ipad、apple TV和 apple watch上的史诗级漏洞
- 不安全的操作系统
由于研发周期短和轻量化的需求,IoT设备的操作系统内核是定制的,版本也不经常更新,这导致了大量的缓冲区溢出问题,如提权等。除此之外,设备使用了各种各样的传感器和通信模块,包括内核中大量的驱动。例如,Marvell WiFi芯片驱动找到了多个漏洞,包括 CVE-2019-14901, CVE-2019-14897 和CVE-2019-14896,它们导致了内核中基于栈或堆的缓冲区溢出。这也是攻击面中重要的一部分
- 固件敏感信息泄露
IoT设备的本地存储通常使用轻量化的存储方案,开发者通常忽略了它的安全性,并使用了明文或只是进行了简单的加密,这很容易导致敏感数据的泄露
- 不安全的应用服务
应用服务开发缺少安全标准。为了加快产品的开发,通常直接编译、使用了简单、不安全的应用代码,因此引入未知的漏洞。IoT安全研究者们已经发现了大量开发时产生的应用漏洞,包括出于未知原因留下的后门
- 不正确的配置策略
为了方便管理IoT设备,ssh、telnet等服务是默认的开启,这样会造成配置问题。默认配置下的弱验证策略使攻击者容易获得设备的权限。例如,Telestar Digital GmbH 的物联网收音机可通过未经验证的telnet服务器被远程攻击者劫持利用,这些漏洞已经被CVE-2019-13473和CVE-2019-13474收录。
协议接口层
协议接口层的攻击包括了通信和API,它涉及到用户侧直接控制和由云端间接控制的设备,以及以上两种通信过程中的信息保护问题,并不涉及到协议的安全。例如,IoT通信协议的滥用和AR-Ddos攻击正是通过IoT通信协议CoAP、SSDP和SNMP执行的,它的目标不是IoT设备,但是它也是IoT安全一个重要的研究方向。协议接口层的攻击主要包括一下三个角度:不安全的远程管理接口、数据传输过程中的信息泄露、弱身份验证
- 不安全的远程管理接口
为了方便管理,IoT设备使用http服务之类的远程管理方式,这带来了诸多漏洞,例如sql注入、XSS和远程执行漏洞等
- 数据传输过程中的信息泄露
IoT通信协议使用了弱加密算法或者根本不进行加密,导致敏感信息泄露。例如论文Passwords in the Air中提到的,当IoT设备接入网络时,WiFi密码以明文传输
- 弱身份验证
由于安全需要,管理IoT设备需要身份验证绑定,于是产生了一个新的攻击面。攻击者可以绕过身份验证,重复绑定然后获得用户的信息,论文Phantom Device Attack在这个攻击面上找到了四种攻击方法
漏洞分析、挖掘、检测和缓解
现阶段,对IoT安全没有精确的分类,此外,安全研究的核心在于漏洞,因此我们把重点放在设备的漏洞。在研究周期中,研究分为三个阶段:挖掘、检测和缓解。因为IoT安全的特殊性导致不可能有用于分析的标准接口,因此,针对物联网的基础分析框架的研究内容也很有价值。为了审视现有的物联网安全技术,我们从以下四个角度进行总结: (1)漏洞分析的基础框架的研究,使用了固件模拟来帮助分析IoT安全问题;(2)漏洞挖掘技术研究,主要针对挖掘IoT设备中的未知漏洞的手段; (3)漏洞检测,研究基于现有漏洞的特征来检测已知漏洞; (4)漏洞缓解技术的研究,研究了自动修复漏洞或者加入访问控制来限制恶意行为。
漏洞分析的基础框架的研究
为了解决人们对物联网安全的担忧,即使没有源代码或者硬件资料,对固件二进制文件的准确分析也极为重要。然而,由于缺少专门的基础框架,IoT安全领域的漏洞分析收到了阻碍。例如,动态分析依赖于在可控的环境(通常是设备化的模拟器)中执行程序,因此基础框架主要提供了通过半仿真和全仿真的功能。它可以进行复杂的动态分析以支持IoT安全研究。
对于缺少专门用于分析固件,特别是用于动态分析的工具,Avatar提出了一个结合了在模拟器上的模拟执行模式和在真实设备上的实际执行模式的框架来分析固件。当固件在模拟模式下运行时,当发生I/O时,Avatar将操作转发到设备,设备执行操作后将结果传给模拟器,以便模拟器继续运行。它有效地应对了特定外围设备缺少源码和文档的问题。
随后,Prospect和Surrogate也提出了类似的动态分析框架。四年后,Avatar开发团队开发出了Avatar2,允许安全研究者在不同动态分析框架、调试器、模拟器和实际设备之间交互操作,除此之外,作者还展示了如何使用Avatar2来记录设备的执行流。
Chen等人提出了用于linux设备的Firmadyne,首先使用软件进行系统仿真,然后采用扫描和探测等动态分析方法来挖掘漏洞。以上框架的模拟功能都基于QEMU。对于不易模拟的传感器操作,半模拟框架在执行表1的固件指令时,通过软件代理的方式引导对物理硬件的I/O操作
表1是漏洞分析基础框架的总结。 Semi-simulation指的是框架需要真实的设备来进行I/O访问
漏洞挖掘技术研究
随着IoT设备漏洞的增加和攻击趋势的上升,安全研究者在设备的漏洞挖掘上花费越来越多时间。这一届表述了漏洞挖掘的技术,包括动态和静态分析。通过学习传统的软件安全分析技术,我们发现动态分析主要包括fuzz和污点检测,静态分析主要包括符号执行、污点分析、数据流分析。
动态分析方法
动态分析方法需要仿真固件工具来进行动态调试,或者在物理设备上进行片上调试,来获得反馈信息。主要通过fuzz来得到漏洞的触发点。
技术要求:在IoT设备上进行动态调试的能力
在卡片安全研究领域,Alimi等人使用了一个通用的算法生成测试样本,对手机卡和银行卡进行fuzz。对于现在一些内置web服务器的智能卡片,Kamel等人发现了一些基于HTTP协议生成方式的bug,并据此对web服务器进行了fuzz。在汽车安全领域,Koscher和Lee通过修改发送给CAN的数据包来改变汽车的状态,来对汽车的智能系统进行fuzz。
因为IoT固件提取的困难,IoTFuzzer通过从用户侧捕获崩溃信息来避免了这个问题。首先,它在手机应用中的交互协议代码里插桩,然后修改从桩获取的数据,最后根据心跳包(Heartbeat packet)和响应来判断fuzz的效率。因为设备很难直接调试,研究者开始结合仿真技术来发现漏洞。Costin等人实现了应用动态固件分析技术来进行嵌入式固件镜像中web接口的漏洞自动化挖掘框架。
最近,Srivastava等人的目标不再仅限于web接口,他们展示了FirmFuzz,一个独立于设备的、针对Linux固件镜像的自动化仿真和动态分析框架。Zheng等人提出了Firm-AFL,它是第一个针对IoT固件的高吞吐量灰盒fuzzer,他们扩展了AFL,把它变成了现在IoT领域最流行的fuzzer。对于fuzz的研究,Muench等人分析了传统的IoT设备异常状态检测方法的通用性,然后实现了一个基于Avatar和的系统,另外,他们比较了黑盒fuzzer在不同配置下的吞吐量,包括本机执行(直接向硬件输入)、部分仿真(仅将硬件请求重定向到硬件)、全仿真,这是一项对漏洞分析技术性能的评估。上述提到的动态分析技术发现的漏洞类型详见表2,主要是内存问题例如缓冲区溢出和空指针解引用,由于对web接口进行了研究,也有一些web服务器漏洞例如XSS、SQL注入。
静态分析方法
静态分析不需要运行固件就可以挖掘漏洞。寻找bug的过程可以理解程序代码,因此它具有可扩展性。
技术要求:能够获得IoT设备的固件
静态分析步骤如下: (1)提取固件,(2)逆向固件中的程序,(3)通过人工审计找到安全问题。
在学术界,研究人员主要探索通过自动化静态分析方法来找到漏洞。在表2,我们总结了静态分析的研究目标、细分的技术和发现的漏洞种类。
Costin等人首先自动化分析了大量嵌入式设备的固件。他们自动解压运行了固件,然后使用模糊哈希来匹配固件中的弱密钥。FIE基于KLEE构建了嵌入式设备的符号执行引擎。它制定了内存规范、中断规范、芯片规范,以发现固件中违反自定义安全规范的问题。Firmalice也是一个基于符号执行的框架,它通过后门的输入确定性来找到身份验证绕过漏洞。SainT和DTaint提出了静态污点分析方法,分别在设备软件或二进制代码上挖掘漏洞。
漏洞检测研究
前面提到的动态和静态分析技术也可以应用于检测已知的漏洞。在大规模的检测场景,动态分析依赖于使用架构专用的工具来执行程序,静态分析检测已知漏洞的方式和发现0day漏洞的方式相同,但提高了性能和耗时。目前,研究者主要使用以下两种方法:网络扫描和代码相似性检测。
网络扫描
网络扫描通过向在线的IoT设备服务发送带有payload的探测包来检测已知漏洞。网络扫描在安全领域更为通用,随着IoT安全的发展,产生了网络扫描物联网设备的议题。
**技术要求:**了解漏洞的有关信息,如POC
Cui等人扫描了网络上存在的嵌入式设备,发现了一系列设备含有弱密码和其他漏洞。在2013年后,搜索引擎例如Shodan和Censys以及Zoomeye产生了,它们能够识别和检测弱密码、后门、和已知的漏洞。然而,仅靠外部扫描只能发现一小部分漏洞,而且,未授权扫描联网设备也存在道德问题。因此,网络扫描漏洞常常在内网和实验室中进行。网络扫描的优点在于从服务层进行检测并不需要考虑设备的结构,并且它高效快速,适合大规模测试。现有的商用漏洞检测系统大多基于这种方法。
相似性检测
由于IoT设备中存在大量没有修复过的已知漏洞,安全研究员们提出软件代码相似性检测方法来检测已知漏洞。在现阶段,相似性检测的研究主要针对传统软件安全领域,然后通过跨架构逐步支持物联网设备,而不存在专门研究IoT固件相似性检测的论文。如图,相似性检测的基本思路是从代码中提取原有特征,如字符串、指令序列、基本块、语法树和函数调用图等,接着,通过算法测量特征的相似度,最终确定相应的代码片段中是否存在漏洞。
源代码相似性检测
对于在源代码上检测已知漏洞, CP-Miner提出了基于token的方法,使了用词法分析器来产生token序列,然后搜索重复的token序列来衡量相似性。ReDeBug提出了一个可扩展的方法,它结合代码补丁来确定修复前的漏洞代码的特征,并且可以识别未打补丁的代码。然而,以上基于源代码的方法并没有应用在IoT上,在绝大多数情况下,安全研究员们无法获得固件的源代码。
二进制代码相似性检测
对于在二进制代码上检测已知漏洞,研究者主要面临的问题是,不同的编译器代码生成算法、编译优化选项以及不同指令集导致难以检测相似性。N-Grams和N-Perms是早期的漏洞搜索方法。Karim等人使用内存中的二进制片段或代码来匹配算法,由于没有对代码语义进行了解,这种方法难以应对不同编译级别带来的指令重排序问题。为了提升匹配的准确性,Tracelet-based提出将代码重构为可执行序列,然后使用求解器来处理程序约束和数据约束,因此它解决了指令重排序的问题。此外,TEDEM采用符号简化二进制程序,并通过树编辑距离作为基本块来判断代码相似性,它甚至可以找到不同操作系统的漏洞。
由于一些相同的语义特征,导致难以表示两个二进制程序基本块特征相似性。研究者开始考虑使用CFG来描述程序的行为,因此可以通过图来进行相似性比较。BinDiff和Binslayer能够通过检测CFG相似度,来检查两个二进制程序的相似性,不过它们并不是专门为漏洞检测设计的。通过比较两个完全不同的二进制文件的CFG,还是难以发现跨平台的漏洞片段。Egele等人提出了Blanket Execution 并指出,基于静态分析的二进制语义相似性研究容易受编译链和编译优化级别的影响。因此他们建议提取程序动态运行时的特征,来应对造成CFG改变的影响。BinHunt和iBinHunt使用了符号执行和理论证明,来检查基本块之间的语义等价性,并找出哪些语义有所不同。
然而不同IoT设备的固件差异很大,包括多种架构如MIPS、ARM、PPC、x86等,它们的操作码、寄存器名称和内存寻址方式都有差别,因此,以上提到的方法难以应用于大规模的跨架构代码漏洞检测。直到最近两三年,研究人员开始研究二进制代码基础上的跨架构代码相似性检测。Multi-MH是第一个基于二进制代码的跨架构代码相似性检测方法。首先,将二进制代码转换为中间代码,然后使用特定的输入来测试程序,并根据I/O的行为来捕获基本块的语义,最后根据捕获的CFG来检测漏洞。然而它在处理大量函数时的性能开销过大。DiscovRE通过图匹配算法检查一组函数对的CFG是否相似,并通过预筛选来加快CFG匹配过程。然而它的预筛选过程并不可靠且会漏报过多漏洞。BinGo通过引入选择性内联相关库函数以及用户定义的用于跨平台代码搜索的函数来捕捉完整功能语义。然而它并不是特别为IoT设备设计的。Genius使用机器学习的传统方式,从CFG学习高层特征表征。另外,它将图嵌入编码为一个高位数字特征向量,然后使用图匹配算法测量目标函数和一组二进制函数的相似性,这可以有效的提升性能和可扩展性。Xu等人首先提出了基于深度学习的跨架构二进制代码相似性检测方法,使用了神经网络模型的图嵌入技术。在跨版本代码相似性检测,αDiff迈出了重要的一步。它基于DNN模型,提取了三个语义特征,包括函数、功能间和模块间的特征,来进行检测。Gao等人提出了VulSeeker和VulSeeker-Pro。这些漏洞搜索方法都通过与深度学习结合,来提高检测的准确性,后面提到的两种方法被证实比目前其他的(例如Gemini)方法准确度都高。
漏洞缓解研究
在漏洞挖掘和检测的基础上,漏洞缓解措施也是行业关注的一个研究问题。根据公开的文献研究,主要研究热点是自动化生成补丁和访问控制。前者旨在修复漏洞,后者研究如何限制恶意行为。
自动化生成补丁
这节所说的自动化生成补丁技术并不专指IoT领域,而是一个传统安全领域的扩展。漏洞修复通常由开发团队在源代码上完成。在获得外部漏洞报告后,他们通过漏洞触发条件和分析漏洞机制来评估漏洞。自动生成补丁可以自动修复软件错误,而不需要开发者人工判断、理解、修正。
技术要求:获得和升级IoT设备固件
软件工程领域的研究者们提出,通过学习正确的c语言、Java和其它源代码级别中的正确代码可以自动生成补丁,这一想法取得了初步可行成果。另一种想法是改变程序的形式而不改变它的功能。GenProg使用了遗传编程的扩展形式来演化程序变体,该变体保留了所需功能但不易受到给定缺陷的影响,然而由于突变操作的随机性,它会生成无意义的补丁。因此Kim等人提出了基于模式的自动化程序修复(PAR)来解决上述的问题。在安卓平台上,Zhang等人提出了AdaptKpatch,一个自适应内核修补程序框架和LuaKpatch,它将一个类型安全的动态语言引擎插入内核来执行补丁。这两个方案解决了安卓平台的补丁链过长、碎片化和平台生态布局不匹配、细分修复不及时的问题。然而它们没有考虑解决在跨CPU架构自动进行热修复的问题,他们依旧需要基于知识和经验进行手工编写。DARPA的CGC引领了在二进制代码级别上的自动化防御方法,然而主要采用的依旧是通用的防御方法,例如二进制代码加固、边界检查和指针修复
访问控制
访问控制方法是通过管理IoT设备的用户侧或平台许可,来阻止或结束攻击者的恶意行为。
技术要求:用户侧或云端的可扩展性
Fernandes等人首先深入研究了IoT平台的安全例如SmartThings,他们发现,由于功能粗粒度,大量的应用获得了多余的权限,智能家居中的许多设备获得了过多的权限,模糊的权限管理,导致了许多针对IoT设备的攻击以及隐私泄露。密歇根大学的研究者们想出了一系列办法来解决这些问题。2016年,他们提出了Flowfence,一个基于数据流来保护隐私泄露的系统,它将程序分为两部分:(1)一系列负责操作沙箱中敏感数据的隔离的模块。(2)不操作敏感数据,但通过污点跟踪不透明的句柄将隔离的模块链接在一起来协调执行的代码,其中涉及到的数据的数据只能在沙箱内被解引用。于是在2017年,他们又提出了基于上下分信息的ContextIoT,它可以帮助用户提升访问控制的有效性,通过识别敏感操作上下文标识和保证运行时的上下文完整性,来抵御攻击者进行危险操作。2018年,一个针对智能家居的基于风险控制的模型Tyche被提出,它建立了访问控制列表(ACCLs),在源代码层面解决访问权限过多的问题。Smartauth和FACT同样基于ACCLs,然而他们采取了不同的方法来建立ACCLs。Smartauth通过NLP识别的文件和APP源代码建立ACCLs,FACT在设备开发的阶段就建立了ACCLs。
|