嵌入式设备和固件中的自动漏洞检测(三):静态分析技术

2023-11-13

原文链接:Automatic Vulnerability Detection in Embedded Devices and Firmware: Survey and Layered Taxonomies: ACM Computing Surveys: Vol 54, No 2

Please Subscribe Wechat Official Account:信安科研人

发送“嵌入式设备和固件中的自动漏洞检测”,获取原文pdf
 

一 静态分析技术层次概览

       静态分析的方法在学术界使用得更频繁,因为它们提供了比较来自不同体系结构的代码的方法。在这些技术中,如果函数与存储库中已分析的易受攻击的函数之间存在匹配,则该函数被视为潜在易受攻击的函数。

     为了分析程序二进制文件,现有工作从不同的二进制代码表示或中间表示 (IR) 中提取广泛的特征,IR 是一种与处理器无关的形式,它表示具有中间抽象级别的二进制代码的操作语义。

        这些特征 (或它们的组合) 用于表示函数或程序二进制的语义,并最终帮助分析代码的结果。本文将特征分为四类。

        图3显示了建议的特征分类以及利用这些特征的相应方法:

1.1 指令级别的特征

        指令级特征可以直接从给定的二进制代码中提取。例如,n-gram 是二进制程序中的 n 个标记序列(例如,字节或指令)。 n-gram 的一个缺点是它们对指令的顺序很敏感,因为某些指令可以在保留语义的同时重新排序。

1.2 统计特征

        统计特征表示二进制代码的语义信息。例如,与将某些信息写入文件的函数相比,加密函数使用更多的算术和逻辑指令。为此,很多工作中使用了不同特征(如频率)的统计数据。

        例如,利用指令分组(例如,算术指令的数量),映射最可能的函数信息。又如操作码的分布向量,很多工作用其来检测恶意软件。

1.3 结构特征

        结构特征既代表了代码的语义信息,又代表了代码的结构特性。

  •  控制流图(CFGs)是用来表示执行的控制流的最常用的特征。同时,调用图是程序级别提取的内容,以获得更多关于调用者和被调用者之间的关系以及程序逻辑的信息。
  •  另外,一些图度量方法,如图能量和中间中心性(节点中心性),被用来提取关于图拓扑信息。 

1.4 语义特征

        此类别包括在更大程度上传达代码语义的特性。

  • 执行流图(EFG)保留CFG中指令之间的数据和控制依赖关系,因此,表示函数的内部结构。
  • 数据相关性和程序相关性图(PDGs)被用来推断控制和数据流,其中需要提取存储器和寄存器值。 
  • 结合路径切片和值集分析的数据流分析被用于构造条件公式,该公式描述给定程序行为何时将在哪个条件下发生,并可能捕获不正确的数据依赖和条件检查。

二 代码相似性检测

        本节将回顾识别固件映像中漏洞的代码相似性检测方法,将现有的工作分为基于图的、基于数据流的和基于距离的三类。

2.1 基于图的方法

概念:基于图的方法基于代码的图表示来执行分析,如控制流图(CFG)、子图、tracelets和调用图,每个图都传达特定的信息。 

现有工作:

(1)Discovre

        为了在交叉编译的跨体系结构固件映像中进行易损功能检测,Discovre提到它扩展了最大公共子图(MCS)距离,以根据几个特征(如函数中的拓扑顺序、字符串和常数)额外考虑基本块之间的相似性。

        MCS的执行时间是指数增长的,因此作者采用了基于集合函数(例如,指令数、参数数、局部变量大小和出/入边数)的数值滤波器和KNN算法,并在一定次数的迭代后终止该算法。

         Discovre在DD-WRT路由器、Netgear Readynas和Android ROM映像的固件映像上进行了测试。 

(2)Genius

        受Discovre的启发,Genius利用在多个CPU体系结构中一致的统计和结构特征,并用属性集标记CFG中的每个基本块来构造属性控制流图(ACFG)。

        为了执行有效的搜索过程,使用谱聚类将ACFGs转换成码本,并使用高级嵌入和局部敏感散列(LSH)进一步编码。 然而,作者指出,创建码本是烧钱的。

         其对来自26个不同供应商的8126个固件映像进行了bug搜索,这些供应商包括ATT、Verizon、Linksys、D-Link、Seiki、Polycom和TrendNet。 这包括不同的产品,如IP摄像机、路由器和接入点。

(3)BinARM

        基于从粗到细的检测方法的多级检测引擎BINARM,以有效地识别智能电网中智能电子设备的漏洞函数。

        在第一阶段,从给定函数中剔除具有一定欧氏距离(基于偏度、峰度和图能量)的候选函数。

        第二阶段通过利用概率密度函数和TLSH来删除具有不同执行路径的候选函数。

         最后,利用加权Jaccard相似度和匈牙利算法进行模糊图匹配来识别易损函数。

2.2 基于数据流的方法

        基于数据流的方法通常通过分析特定的读写、输入/输出对、变量位置等来观察数据流。 然而,现有的基于数据流的解决方案大多不能大规模应用。 

现有工作:

(1)Multimh

        Multimh从源代码和程序二进制文件中以子图的形式导出错误签名,以识别多个CPU架构上的易受攻击的功能。

        首先,使用 VEX-IR将汇编指令提升为类似 RISC 的表达式以获得赋值公式,然后利用 Z314 定理证明器将赋值公式简化为 S-Expressions。

        其次,通过使用随机的具体输入值对分配公式的输入/输出行为进行采样,以捕获基本块语义。

        之后,使用工具MinHash降低两个基本块之间的相似性度量的复杂度。

        最后,为了将整个签名与给定的目标函数匹配,提出了一种贪心但局部最优的图匹配算法,称为最佳命中扩展(BHB)。BHB 算法首先执行基本块匹配,并使用匈牙利方法(无回溯)进一步探索直接邻域节点,以识别额外的最佳匹配。 然而,所提出的方法在大规模上并不实用,因为 k-MinHash 会显着降低性能。

(2)FIRMUP

        另一种称为 FirmUp 的方法通过考虑函数之间的关系来识别固件映像中的漏洞该函数。

        首先将函数分解为基本块,然后对基本块进行切片以获得链。

        此外,编译器优化器和规范化器用于将语义等价的链转换为规范形式(句法形式)。

        函数共享相同的链越多,它们就越相似。

        为了提高准确性,利用称为 Ehrenfeucht-Fraïssé 的来回博弈算法来执行相邻函数的匹配,从而扩展更合适的部分匹配。  

(3) XMATCH

        XMATCH 从二进制代码函数构建条件公式,其中指令使用 McSema15 转换到 IR。 条件公式对 CFG 结构和 CPU 架构变化具有鲁棒性。  

        XMATCH 同时利用数据依赖和条件检查,可以检测错误的数据依赖和不存在或不正确的条件检查。

2.3 基于距离的方法

        基于距离的方法为一个函数提取不同的特征集,然后对所选特征应用各种相似度度量以找到匹配对。

现有工作:

(1)Gemini

        Gemini是一款基于神经网络模型的跨体系结构二进制码相似性方法。

        它首先提取带有手动选择特征的控制流图,称为属性控制流图(ACFG),然后使用Structure2vec结合连体结构来生成两个彼此接近的相似函数的图嵌入。

        Gemini通过深度学习引入嵌入,极大地改善了多平台CPU架构上的二进制函数指纹识别。

        然而,由Gemini生成的嵌入主要依赖于统计特征,而没有考虑它们之间的关系以及这些特征所表示的指令集。报告的漏洞识别准确率约为82%,反映了这些特征选择应用于漏洞检测问题的局限性。

(2)VulSeeker17

        该工具提取了标记的语义流图 (LSFG),该图将CFG与DFG相结合,然后提出了一种语义感知的深度神经网络模型来生成函数嵌入。最后,余弦相似度用于测量两个函数之间的相似度。

(3)αDIFF

        该方法提取函数代码(原始字节)、函数调用和函数的导入函数,以执行跨版本二进制代码相似性检测。

        然后使用卷积神经网络 (CNN) 和连体网络将函数代码转换为嵌入。 计算三个距离,包括函数间距离、函数内距离和模块间距离。

        最后,测量从给定函数到存储库中易受攻击函数的总距离。 

三 静态分析方法对比

        对现有作品的全面评估由于缺乏数据集和确切的固件图像很难进行。 但是,如果根据每个解决方案在方法、实施和评估方面提供的信息进行定性比较。

         表 5 和表 6 总结了本研究的结果:

 

 探讨

首先,文献中存在几个特征,这些特征被证明可以显著提高漏洞检测解决方案的效率和准确性。可以看出,语义和结构特征是最常用的特征。

第二,没有单一的解决方案来识别漏洞函数的。其中,基于数据流的方法是固件映像漏洞检测的最佳犯法。最近,使用DNN和NLP的基于距离的方法显示了跨体系结构漏洞检测的最佳结果。

第三,过滤过程是克服可伸缩性问题的一种很有前途的解决方案。然而,应仔细设计和全面评估这些滤波方法,以确保准确性。

第四,代码相似性解决方案都无法识别未知漏洞。

最后,尽管MinHashing和LSH被用于函数匹配,但由于其对于具有大而复杂的控制流图的函数的时间复杂度,该类别下的现有工作在大规模上是不实用的。

总之,大多数最近的基于静态的代码相似性解决方案在x86、ARM和MIPS架构上采用基于数据流的方法,用于使用GCC编译器编译的基于Linux的固件映像。

局限性

检测未知漏洞

        大多数静态解决方案为函数定义模式/签名,然后执行函数匹配。因此,已知的易受攻击的函数存储在存储库中,并通过识别与它们的任何匹配项,发现易受攻击的函数。但是,可能有一些具有未知漏洞的函数无法以这种方式识别。

        通过使用数据流和动态分析可以识别未知漏洞。

检测运行时漏洞

        静态方法无法检测到可以在执行期间被利用的漏洞。例如,由于缺乏执行语义检查或在网络活动的情况下,无法检测到运行时面向数据的漏洞利用,因为这些信息是在运行时过程中提供的。

使用过滤提高扩展性

        静态分析方法的可扩展性问题 已通过过滤过程得到一定程度的解决。 在此过程中,极有可能不相似或不相关的功能将被排除在分析之外。 因此,过滤过程最小化搜索空间以更有效地静态识别漏洞,并在动态分析的情况下提供更好的代码覆盖率。 但是,过滤过程可能会影响准确性。 因此,检查所提出的过滤过程有助于更好地了解每种方法的优缺点,并进一步提出新的高效和准确的过滤技术。

缺乏语义洞察力和重放漏洞

        静态方法提供了具有相对较高误报率的潜在易受攻击函数的列表。 因此,需要人工验证获得的漏洞结果。 这些技术不提供有关如何触发已发现漏洞以进行进一步调查和重放攻击的任何信息 。因此,可以采用其他方法(例如,符号执行)来产生可偿还的输入以验证错误并进一步提供有关执行原因和代码相应部分的语义洞察。 然而,可以采用静态方法来克服纯动态分析和符号执行技术的可扩展性问题。

生成漏洞签名

        现有的方法大多是为每个漏洞函数提供不同表示和语义层次的特定模式,然后采用匹配技术或相似性度量来识别它。为每个漏洞(例如,缓冲区溢出)提供通用签名,而不是与已经具有特定漏洞的函数进行匹配,这是未来的发展方向之一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式设备和固件中的自动漏洞检测(三):静态分析技术 的相关文章

  • 常见升降压电源原理

    文章目录 一 开关降压电路 buck 二 开关升压电路 boost 三 线性降压电路 一 开关降压电路 buck 电路图 开关闭合时 电源给电感和电容充电 开关断开时 电感作为电源给负载供电 工作时的电压变化 二 开关升压电路 boost
  • 微信小程序框架

    框架 小程序开发框架的目标是通过尽可能简单 高效的方式让开发者可以在微信中开发具有原生 APP 体验的服务 整个小程序框架系统分为两部分 逻辑层 App Service 和 视图层 View 小程序提供了自己的视图层描述语言 WXML 和
  • SAP ABAP 数据填充进EXCEL模板或代码生成EXCEL并维护数据下载到本地

    文章目录 需求 一 针对有EXCEL模板只填充数据的情况 二 没有模板需要凭空生成Excel的情况 如果需要把大量数据整理后转化为excel传向OA 三 检查Excel是否正确安装 四 如果系统中没有ZCL EXCEL 的帮助类 总结 需求
  • jackson的jar包下载

    没必要去csdn的下载频道去付付费下载 这里有最全最新的Jackson的jar包资源 点我即可 评论有朋友说链接失效了 因为现在工作内容与java无关 不知道地址正确与否 但各位仍可一试 更新后的链接

随机推荐

  • Selenium快速入门

    目录 一 Selenium简介 二 Selenium组成 三 Selenium特点 四 Selenium使用 导入pom依赖 下载浏览器驱动 创建一个测试类 获取网页数据 1 Class选择 driver findElement By cl
  • Android平台和java平台 DES加密解密互通程序及其不能互通的原因

    网上的demo一搜一大堆 但是 基本上都是一知半解 包括我 为什么呢 我在尝试分别在两个平台加密的时候 竟然发现Android DES 加密和java DES加密的程序不能互通 就是加密的结果不一样 更不要说Android平台的加密输入作为
  • JAVA内存模型与JVM内存模型的区别

    JAVA内存模型与JVM内存模型的区别 直接进入正题 JAVA内存模型 Java内存模型规定所有的变量都是存在主存中 每个线程都有自己的工作内存 线程堆变量的操作都必须在工作内存进行 不能直接堆主存进行操作 并且每个线程不能访问其他线程的工
  • 计算机网络(互联网组成、计算机通信方式、电路、报文、分组交换、主要性能指标)

    互联网的组成 边缘部分 由主机组成 这部分是用户直接使用的 核心部分 由网络和路由器组成 边缘部分 计算机之间通信 主机A和主机B进行通信 实际上是指 主机A的某个进程和主机B上的另一个进程进行通信 或简称为 计算机之间通信 计算机的进程
  • Python数据库操作手册

    数据库的操作在现在的Python里面已经变得十分的好用 有了一套API标准 下面的就是讲讲如何的去使用这套框架定义 此框架包含以下部分 模块接口 连接对象 游标对象 DBI辅助对象 数据类型与定义 如何实现的提示 从1 0到2 0的变化 例
  • APP上架需要的准备和流程

    一 上架iOS应用市场前的准备 1 选择适合自己的苹果开发者账号 1 个人账号 Individual 费用99美金一年 该账号在App Store销售者只能显示个人的ID 比如zhitian zhang 单人使用 个人账号只能有一个开发者
  • 一篇学会Swagger2(集成knife4j)

    目录 一 Swagger2简介 1 前言 2 Open API是什么 3 Swagger简介 3 1 特性 3 2 组件 二 knife4j 三 内容 3 1 依赖 3 2 配置类 3 3 Controller层添加注解 3 4 测试 sw
  • Apache Tomcat如何高并发处理请求

    介绍 作为常用的http协议服务器 tomcat应用非常广泛 tomcat也是遵循Servelt协议的 Servelt协议可以让服务器与真实服务逻辑代码进行解耦 各自只需要关注Servlet协议即可 对于tomcat是如何作为一个高性能的服
  • make,makefile,make install,make clean,cmake,gcc(转)

    1 gcc是GNU Compiler Collection 就是GNU编译器套件 也可以简单认为是编译器 它可以编译很多种编程语言 括C C Objective C Fortran Java等等 2 当你的程序只有一个源文件时 直接就可以用
  • Mail command failed: 502 Invalid paramenters错误

    from要配置自己qq响应的邮箱
  • vue安装了babel-polyfill ie依旧无法适配

    上一篇写到安装babel polyfill 插件来适配ie浏览器 链接如下 https blog csdn net qq 43469899 article details 102969776 有些小伙伴会发现尽管你是配好了我上一篇的那些部分
  • HightCharts双y轴+x时间轴

    公司布置完成图表 使用HightCharts显示 根据时间显示探头点数据 由于探头分为两种数据属性 一种是温度 单位 一种是湿度 单位 所以需要使用双纵轴显示 加上横轴使用date属性 需要对date进行formart 上代码 myCont
  • linux修改日期时间

    Linux机器上的时间比较复杂 有各式各样的时钟和选项等等 机器里有两个时钟 硬件时钟从根本上讲是CMOS时钟 而系统时钟是由内核维护的 1 修改硬件时钟的可以使用下面的方法 你就可以用它来随时更新你的硬件时间 命令为 hwclock ad
  • 计算机组成原理笔记

    文章目录 一 计算机的基本组成 二 总线 2 1 总线控制 三 主存储器 3 1 RAM 3 2 存储器与CPU相连 3 3 存储器校验 3 4 提高存储器访问速度 3 5 cache 四 输入输出系统 4 1 I O接口 4 2 程序中断
  • 【狂神说Java】SpringBoo

    作者简介 CSDN内容合伙人 信息安全专业在校大学生 系列专栏 添砖加瓦 狂神说JAVA系列笔记 新人博主 欢迎点赞收藏关注 会回访 个人格言 舞台再大 你不上台 永远是个观众 平台再好 你不参与 永远是局外人 能力再大 你不行动 只能看别
  • Flutter Dialog模态框使用及自定义Dialog

    自定义dialog插件 用来弹出确认取消提示框 或者自定义模态框 自定义类 import package flutter material dart class dialogUtil 通用显示确定按钮框 static showConfirm
  • UART串口协议

    通用异步收发传输器 Universal Asynchronous Receiver Transmitter 通常称作UATR 是一种异步收发传输器 将数据由串行通信与并行通信间做传输转换 作为并行输入称为串行输出的芯片 UART是一种通用串
  • Python3.8的下载与安装

    一 介绍 Python由荷兰数学和计算机科学研究学会的吉多 范罗苏姆 于1990 年代初设计 作为一门叫做ABC语言的替代品 Python提供了高效的高级数据结构 还能简单有效地面向对象编程 Python语法和动态类型 以及解释型语言的本质
  • SQL中的and、or

    在sql查询语句中长用到and和or 它们在用的时候有些需要注意的地方 不管在一项表达式中有多少个and或or 它是将前一个表达式看作一项 and与or后的所有表达式看做一项 and的前后都为真的时候才为真 取交集 or有一个为真 即为真
  • 嵌入式设备和固件中的自动漏洞检测(三):静态分析技术

    原文链接 Automatic Vulnerability Detection in Embedded Devices and Firmware Survey and Layered Taxonomies ACM Computing Surv