Page 116 - 《软件学报》2020年第11期
P. 116
3432 Journal of Software 软件学报 Vol.31, No.11, November 2020
内对变量进行数据依赖更新的频度.本文对比了两种数据依赖图中节点与边的规模,如表 6 所示,节点与边的数
量分别相差约 3 个数量级.
Table 5 Comparison of time consumed in constructing the data dependence graph
表 5 数据依赖图构建时间对比
耗费时间(min)
名称 大小(k) 设备型号 分析函数个数 时间性能提升(倍)
CFG DDG FDDG
wlancmd 38 HG532e 7 0.07 0.03 0.002 15
stupid-ftpd 53 DIR-882_A1 24 0.16 6.99 0.005 1 500
upnp 90 HG532e 56 0.43 113.54 0.038 3 000
jjhttpd 118 DIR820LB1 45 0.47 120.14 0.027 4 400
lighttpd 145 HIVDC-F100V 136 0.98 468.02 0.091 5 100
cgibin 150 DIR-890L 356 1.24 600.72 0.115 5 600
cgibin 155 DIR-645 88 0.90 53.21 0.038 1 400
miniupnpd 165 DIR-882_A1 147 1.02 728.91 0.080 9 100
upnpd 213 DGN2200 114 0.65 346.93 0.108 3 200
setup.cgi 324 DGN1000 39 0.92 17.17 0.016 1 050
httpd 994 DGN2200 168 1.59 831.41 0.138 6 000
注:(1) DDG 对应 angr 框架中的方法,FDDG 对应本文提出的方法;(2) 时间性能提升结果为取整后的结果.
Table 6 Comparison of the data dependence graph scale
表 6 数据依赖图规模对比
节点数 边数
名称 大小(k) 设备型号 分析函数个数
DDG FDDG DDG FDDG
stupid-ftpd 53 DIR-882_A1 24 102 037 57 120 825 12
upnp 90 HG532e 56 494 854 372 585 385 266
jjhttpd 118 DIR820LB1 45 544 243 198 612 616 157
lighttpd 145 HIVDC-F100V 136 2 318 991 428 2 646 642 491
cgibin 150 DIR-890L 356 2 845 062 1 223 3 132 910 742
cgibin 155 DIR-645 88 634 415 502 766 330 205
miniupnpd 165 DIR-882_A1 147 3 184 594 697 3 490 395 505
upnpd 213 DGN2200 114 1 850 608 1 291 2 047 508 1 242
setup.cgi 324 DGN1000 39 157 698 458 185 527 177
httpd 994 DGN2200 168 2 517 499 801 2 795 711 566
注:DDG 对应 angr 框架中的方法,FDDG 对应本文提出的方法.
总的来说,本文提出的 FDDG 构建方法极大地降低了分析所需的时间和空间开销,实现在相同计算资源条
件下分析更大规模的程序,同时适用于对批量固件的快速分析.
5.2 固件脆弱性分析系统有效性评估
在前面分析中强调函数级数据依赖图保留了关键变量等有效信息,但能否在固件静态脆弱性分析中发挥
效用,需要通过实验进行评估.
本文首先利用 FFVA 系统对表 4 中的二进制程序样本进行分析,然后借助逆向分析工具如 IDA Pro [27] ,对系
统的分析结果进行人工审查,利用真实设备或 QEMU 模拟器 [28,29] 对脆弱点进行验证.实验结果如表 7 所示,共发
现漏洞 24 个,14 个属于未知漏洞.部分未知漏洞已经提交给厂商并得到确认,剩余的未知漏洞则利用真实设备
或通过固件仿真的方式进行了验证.
在表 7 中,以 Honeywell 摄像头固件中的 lighttpd 程序为例,其主要负责处理与 HTTP 协议相关的请求,在其
中发现的脆弱点数量为 0.借助 IDA Pro 工具对该程序进行逆向分析,发现程序中几乎没有使用 strcpy(⋅),
sprintf(⋅)等不安全函数,大部分的拷贝操作使用 memcpy(⋅)函数进行完成,并且对拷贝长度进行校验.通过对
stupid-ftpd 和 miniupnpd 程序进行逆向分析,发现其很可能是直接来源于开源软件,对脆弱点进行人工验证后没
有发现漏洞.