Page 114 - 《软件学报》2020年第11期
P. 114
3430 Journal of Software 软件学报 Vol.31, No.11, November 2020
由表 2 可知,缓冲区溢出和命令注入漏洞对嵌入式设备的威胁较大.对这两类漏洞进行检测,FFVA 系统的
主要思想如下:将这两类漏洞视为一种特殊的“Source-Sink”问题 [25,26] ,分析程序中所有 Source 点到 Sink 点之间
的数据流,然后对 Sink 点的安全性进行判断,同时进行路径敏感性分析.其中,Source 点表示程序中的外部数据
输入点,如网络流读取、文件读取和用户输入等;Sink 点表示程序中可能会存在安全风险的代码片段,如对
strcpy(⋅)等不安全函数的调用(如图 8 所示).
Fig.8 “Source-Sink” problem
图 8 “Source-Sink”问题
以 CVE-2017-6334 漏洞为例,在 NETGEAR DGN2200 型号的设备中存在一个命令注入漏洞,漏洞触发点位
于 diagCgiDnslookup(⋅)函数中.利用 FFVA 系统对该二进制程序样本进行分析,分析流程如图 6 所示,针对
diagCgiDnslookup(⋅)函数构建得到的函数级数据依赖图如图 9(b)所示.由图 9(b)可知,在 diagCgiDnslookup(⋅)函
数内部,先调用 websGetVar(⋅)函数获取请求包中 host_name 字段的值,然后调用 sprintf(⋅)函数进行格式化输出,
之后将结果传递给 system(⋅)函数.由于未对 host_name 字段的值进行有效校验,故存在命令注入漏洞,其中可以
将 websGetVar(⋅)函数看作 Source 点,system(⋅)函数看作 Sink 点.这种分析思路对 FDDG 和 DDG 都适用,但基于
FDDG 进行分析,其数据流更清晰,效率更高.由于指令级数据依赖图的规模比较大(包含 156 个节点、165 条边),
不便展示,故这里未给出对应的指令级数据依赖图.
(a) 汇编代码片段 (b) 函数级数据依赖图
Fig.9 Code snippet of diagCgiDnslookup(⋅) and its function-level data dependence graph
图 9 diagCgiDnslookup(⋅)函数代码片段以及对应的函数级数据依赖图
5 实验与结果
利用 FFVA 系统,本节通过两个实验来评估函数级数据依赖图 FDDG 构建方法的效率和在固件静态脆弱性