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 构建方法的效率和在固件静态脆弱性
   109   110   111   112   113   114   115   116   117   118   119