原文标题:Sharing More and Checking Less: Leveraging Common Input Keywords to Detect Bugs in Embedded Systems
原文作者:Libo Chen, Yanhao Wang, Quanpu Cai, Yunfan Zhan, Hong Hu, Jiaqi Linghu, Qinsheng Hou, Chao Zhang, Haixin Duan, Zhi Xue
发表会议:USENIX Security 2021
原文链接:https://www.usenix.org/system/files/sec21fall-chen-libo.pdf
主题类型:IOT固件漏洞挖掘
笔记作者:soda
主编:黄诚@安全学术圈
嵌入式设备数量庞大,安全性低。在所有的嵌入式设备中,无线路由和网络相机受到的攻击最多,因为嵌入式系统的大多数漏洞都存在于其开放的网络服务中。但现有的漏洞检测方法无法有效且高效地对嵌入式系统进行分析与漏洞检测:
在这样的场景下,作者提出了一种思想:接收用户输入的前端文件和处理用户输入的后端函数通常共享同一个变量关键字。如下图所示,前端与后端共享device name这个变量关键字。
基于这种思想,本文创新性地提出了一种基于前后端数据相关性的嵌入式系统漏洞挖掘方法SaTC。通过提取前端的通用关键字,定位后端二进制文件中处理相应用户数据的代码;将后端执行体中与前端输入强相关地数据引入点作为污点分析起始点,大大降低了符号执行复杂度;同时使用粗粒度污点分析、路径合并等方法提升了漏洞检测的效率。最后,作者将SaTC应用于知名厂商的39个真实固件样本上,发现了33个0day漏洞。
SaTC整体的流程图如上所示。首先输入固件映像包,对其进行解包并分离出前后端文件;将前端文件送入输入关键词提取模块,提取可能与用户输入相关的关键词,构建关键词集;在输入引入点识别模块,依据关键词集识别后端文件中的边界二进制文件(包含各种处理用户输入关键字的二进制文件),进一步识别各种类型的输入引用点(处理用户输入关键字的函数);最后,从识别出的输入引用点出发,应用输入敏感的污点分析方法,通过粗粒度污点分析、路径合并等方法提升分析效率。
从解压的固件中筛选前端文件,从前端文件中提取两类关键字:参数关键字(parameter keywords)与操作关键字(action keywords)。
作者将前端文件分为HTML文件、XML文件和javascript文件三种,分别根据这三种文件的特点设置相应的两种关键字提取方法。
完成输入关键字的提取后,作者将后端二进制文件中提取出来的关键字与输入关键字作匹配,识别出最大匹配度的后端二进制文件,定义为“边界二进制文件(border binaries)”。
边界二进制文件常是与用户交互最直接的一部分,在前端和后端之间充当接口,导出设备的功能给前端,同时接受来自前端的用户输入,因此其在后续的污点分析中将作为分析起点。
在接收来自前端的请求后,Web服务器会调用相应的处理函数来解析输入数据,定义后端二进制文件中相应的解析输入数据的处理函数为“输入引入点(input entry)”。该模块主要用于识别边界二进制文件中的输入引入点。
1)关键词引用定位器
定位器检测边界二进制文件中等于或包含输入关键字的引用位置,并在所有关键字引用中,优先考虑动作处理程序中的操作关键字。
2)隐式引入点查找器
有时候,后端的输入引入点在前端中并不存在对应的关键字,需要结合上下文启发式识别。作者规定:如果已经识别的引入点旁边存在与其相似代码模式的函数调用,该函数调用也被视作(隐式)引入点。检测隐式引入点可以有效降低假阳性率。
3)跨进程引入点查找器
一些输入数据流可能在不同进程之间传递和共享。进程间数据流的共享通常是通过某种共享数据存储(如NVRAM)间接传递,而不同进程间用户数据保存位置和用户数据再检索位置往往会共享相同的关键字。
因此,作者构建跨进程引入点查找器来跟踪固件中跨越二进制文件或组件的用户输入。它搜索各种使用共享字符串来标记数据的进程间通信范式(包括环境变量与NVRAM),并建立从设定点到使用点的数据流。
SaTC利用路径探索和污点分析技术来跟踪输入数据,以检测在后端的危险使用。为了解决准确率、效率等问题,作者根据固件的独有特征,设计了三种优化方法:粗粒度污点引擎、高效路径探索和路径优先策略。
1)粗粒度污点引擎
根据前面输入引入点识别的结果,SaTC将对应目标函数的返回值或者参数标记为污点源;同时,SaTC的污点引擎在指令层传播污点属性,为了更恰当地处理函数调用,首先将函数分为以下三类:
针对所提出的函数类型,作者设计了一种算法对不同类型的函数和嵌套函数的情况进行处理,有效跟踪程序中的污点传播,算法如下图所示。
2)高效路径探索
SaTC重点检测内存溢出和命令注入
a. 敏感路径引导:
尽管之前的模块减少了污点分析的目标,但仍存在大量的输入引入点需要分析。为了进一步提高分析效率,SaTC在探索任何路径之前,都会搜索每个目标的污点汇聚函数调用路径(sink call traces)。污点汇聚函数调用路径表示从引入点到潜在的污点汇聚函数之间的调用图中的函数调用序列。
SaTC根据每个函数的调用树来搜索函数的污点汇聚函数调用路径,如果该函数不包含污点汇聚函数调用路径,则表示该函数不可达污点汇聚点,SaTC将从目标集合中删除该函数内的所有引入点。
b. 调用路径合并
从引入点起始存在大量的调用路径,很多的调用路径又共享相同的路径。为了减少分析工作量,SaTC尽可能地对同一引用点延申出的路径进行了合并。
如下图所示,SaTC首先基于起始点与输入关键字对所有的路径进行了聚类;然后将所有的函数分为引导函数与污点汇聚函数,在探索过程中,如果遇到一个跳转到引导函数的调用指令,SaTC将对该函数进行细粒度分析。
3)路径优化策略
一些特殊的函数往往会对路径探索产生一定的负面影响,主要包括sanitizers function与parsers function两种,SaTC对此类函数进行识别并应用相应规则处理。
实验部分主要围绕漏洞检测、关键词识别、污点分析三部分展开:
漏洞检测情况:
SaTC总共检测到33个0day漏洞,如下图所示。25个漏洞为命令注入漏洞,2个为缓冲区溢出错误,其他6个属于不正确的访问控制。
同时,和当前的嵌入式系统固件领域的SOTA静态分析工具KARONTE作对比,SaTC的报警数量更多,TP更高,可以发现很多KARONTE无法发现的漏洞。
污点分析的准确率与效率
本文的思想可以应用于一切使用共享关键字进行数据传递的系统。例如,恶意软件应用程序中广泛使用环境变量作为共享信息的隐蔽方式,我们可以使用相同的变量名来查找不同恶意软件进程之间的联系,为恶意软件检测提供帮助。
如果前后端不采用共享关键字进行数据传递,本文所提出的方法将完全失效,出现假阴性。如有的后端程序直接从前端HTTP报文中读取信息,而不使用任何关键字。所以需要寻找隐藏的模式,建立更多前后端之间的联系。
在应用加密混淆技术的情况下,字符串可能被加密,对共享字符串的识别产生干扰。
第一作者陈力波:上海交通大学高级工程师
安全学术圈招募队友-ing
有兴趣加入学术圈的请联系 secdr#qq.com