APP下载

二进制程序函数漏洞同源性判别系统设计与实现

2022-10-17李嘉伟韩明璐

关键词:二进制漏洞可视化

陈 亮, 李嘉伟, 韩明璐

(1.国家计算机网络应急技术处理协调中心 北京分中心,北京 100055;2.北京理工大学 信息与电子学院,北京 100081)

随着信息技术水平的不断提高,互联网规模的不断扩大,应用程序向着多元化和复用化的趋势发展.截止至2022年,全球范围内90%以上的云服务器操作系统、80%以上的移动操作系统都是基于开源软件构造[1].在应用程序的开发过程中,人们可以利用开源代码和第三方资源库等构造出具有同源性的相似应用程序,这种同源性应用程序被部署在不同架构或操作系统下,能够显著提升开发效率,节省开发时间.

然而,代码复用行为可能会引发持续的安全问题,若某个公开资源库中存在漏洞或者某个开源程序被不法分子植入“后门”,那么大量使用了该资源库或开源软件的应用程序都将面临安全威胁,如2014年OpenSSL的Heartbleed漏洞,黑客利用该漏洞可以实时获取到很多https开头网址的用户登录账号和密码,据360网站安全检测平台对国内120万家经过授权的网站扫描,其中,有11 440个网站主机受该漏洞影响[2];2014年Bash命令行界面Shell中的Shellshock漏洞,该漏洞通过bash跳过计算机系统内部的屏蔽机制从而远程控制几乎所有系统,主要用于获取私人信息、获取服务器控制权甚至进行拒绝服务攻击[3].因此利用特征工程对漏洞二进制程序函数进行合理表征,将同源性判别技术运用到二进制程序函数漏洞的判别中,能够有效地快速检查系统是否存在已披露的安全漏洞.研究二进制程序函数漏洞同源性判别对于提高软件系统安全性,保障广大人民群众的财产和信息安全具有重要的理论意义和使用价值.

1 主流同源判别方法

为了应对二进制程序同源函数大数据量和跨架构的特点以及恶意混淆代码等不良操作,函数漏洞同源性判别任务的研究重点主要集中在充分提取函数控制流图特征和生成准确的高维特征向量,进而提高同源性判别效率和查全率,主要包括以下几种方法:

(1)引入深度学习领域技术优化图高维特征向量生成过程,提高嵌入速度.Xu等人[4]提出Gemini模型,基于Structure2vec的图嵌入神经网络将二进制程序函数属性控制流图转化为高维特征向量,同时搭建孪生网络测量两个高维特征向量间的余弦距离进行同源性判别,结果优于现有二进制程序函数同源性判别方法;Massarelli等人[5]提出自注意力神经网络二进制程序函数嵌入模型,不需要手动提取特征,可直接用于反汇编后的二进制程序函数,计算效率更高.

(2)丰富函数特征提取方法,多维度提取特征信息.Gao等人[6]提出构造语义标记流图方法,提取节点特征生成数值向量,将二进制程序函数的控制流和数据流整合,然后通过将数值向量输入深度神经网络模型,生成二进制程序函数的高维特征向量.计算漏洞函数和目标函数向量的余弦距离进行同源性判别,该方法的漏洞判别能力优于Gemini模型;Yu等人[7]提出双通道特征提取方法,用GAE模型来替代Structure2vec算法.结果表明在CVE漏洞函数库中对同样的漏洞函数进行判别时,该方法筛选出的排名前50的可疑函数中发现漏洞的准确度比同实验条件下Gemini的准确度高出了20%以上.

(3)充分学习二进制函数特征关联信息,摆脱专家知识依赖.Ding等人[8]针对代码混淆恶意操作,将词汇语义关系整合高维向量表示函数特征,能从噪声中识别函数关键部分,在代码混淆操作后识别OpenSSL数据集函数准确度达到96.1%;Hu等人[9]在前者基础上提出一种基于语义的混合方法,引入参考函数模拟每个目标函数执行过程,在过程中提取语义特征进行同源性判别,该方法在代码混淆下的准确率上优于Asm2vec模型.

(4)深入挖掘二进制函数内在特征.Pewny等人[10]不再使用传统特征表示方法,将二进制程序转化为中间表示,实现跨架构漏洞搜索功能,支持x86、ARM和MIPS三种不同架构.Liu等人[11]提出ɑdiff模型,直接对二进制函数代码进行特征向量嵌入,进一步减小跨架构函数编译差别,并且在准确性等性能上优于MULTI-MH和MULTI-k-MH模型.研究人员利用高维特征向量进行函数同源性判别的方法也都具备跨架构功能.

本文基于以上二进制程序函数漏洞同源性判别研究成果,设计并实现在线二进制程序函数漏洞同源性判别实验系统,支持上述主流同源判别方法,支持ELF格式的二进制文件上传、漏洞同源性判别、判别结果可视化展示和历史查询等功能.

2 系统总体设计

2.1 设计目标和功能需求

系统的设计目标是基于B/S架构设计在线二进制程序函数漏洞同源性判别实验系统.该系统能够自动从用户上传的二进制程序(ELF文件格式)中提取各函数特征,并与系统漏洞函数库中的已知漏洞函数进行同源性判别.最终,对判别结果进行可视化展示.系统的详细功能需求包括以下4项:

(1)文件上传.系统支持文件在线上传,并且对文件进行合规性检测.

(2)漏洞同源性判别.基于系统内置的漏洞函数库,对用户上传的ELF文件中的函数进行漏洞同源性判别,输出判别结果.

(3)可视化展示.系统支持1)对判别结果可视化展示,将二进制程序函数漏洞同源性判别的分析结果以表格和文本的形式进行展示;2)历史判别信息可视化展示,展示所有成功上传的ELF文件的详细判别结果.

(4)数据存储.存储系统运行过程中产生的所有数据,包括日志数据、ELF文件信息、判别结果信息.

性能需求描述如下:

(1)系统响应时间:对小于1 MB样本的单项分析时间不超过5 s,对2~5 MB样本的单项分析时间不超过10 s,对5~10 MB样本的单项分析时间不超过15 s,对10~20 MB样本的单项分析时间不超过25 s.

(2)系统并发性:系统TPS达到20以上,响应延迟不超过1 s.

(3)系统兼容性:系统在Chrome浏览器、Firefox浏览器、360浏览器和Microsoft Edge等浏览器上均能正常显示页面并实现系统功能.

2.2 技术路线和系统架构

二进制程序函数漏洞同源性判别实验系统原理图如图1所示.系统主要包括文件上传、漏洞同源性判别、数据存储以及可视化展示4个功能模块.系统首先对用户上传的文件进行合规性检测,若文件不通过检测,则需重新上传,若文件通过检测,则提取文件函数信息,并对函数进行同源性判别,然后,利用数据库存储ELF文件信息和判别结果,最后对判别结果进行可视化展示.

图1 漏洞同源性判别实验系统原理图Fig.1 Schematic diagram of function vulnerability homology discrimination experimental system

二进制程序函数漏洞同源性判别实验系统架构如图2所示.系统使用HTML作为前端框架,使用Django作为后端框架,使用Python编程语言编码,使用MySQL构建数据库进行数据存储,由服务端和客户端两部分组成.服务端存储了系统的核心资源,向用户提供函数漏洞同源性判别服务;客户端运行在用户设备上,用户通过浏览器访问系统页面,上传ELF文件进行漏洞同源性判别并查看系统返回的分析结果.

图2 函数漏洞同源性判别实验系统框架图Fig.2 Frame diagram of function vulnerability homology discrimination experimental system

二进制程序函数漏洞同源性判别实验系统由平台服务、核心算法和数据资源3层架构组成.平台服务为用户提供服务接口,分为可视化展示和用户服务,可视化展示包含判别结果可视化和历史判别信息可视化,用户服务包括ELF文件上传、函数漏洞同源性判别、历史查询和结果分析.核心算法包括函数属性提取,图嵌入生成和同源性判别.首先进行函数属性提取,利用IDA pro工具和IDA python接口生成函数属性控制流图,然后进行图嵌入生成,通过节点嵌入生成和节点序列特征提取生成属性控制流图高维特征向量,最后进行同源性判别,计算向量间的余弦距离判断是否为漏洞函数.数据资源层用于存储系统提供服务所需的数据资源,包括判别数据、漏洞数据和日志数据.

2.3 交互界面设计

二进制程序函数漏洞同源性判别实验系统的主界面的顶部为功能菜单栏,包括系统简介、漏洞同源性判别、历史查询.

二进制程序文件上传界面如图3所示.页面提供文件上传通道,点击上传按钮可从计算机中选择需要上传二进制文件,系统对符合要求的ELF文件进行漏洞同源性判别,并在页面下方输出判别结果,包括ID、文件名称、漏洞函数名称和漏洞编号.

图3 二进制程序文件上传界面Fig.3 Binary program file upload interface

若ELF文件中包含漏洞库中内置的漏洞函数(CVE-2015-1791),则显示该ELF文件的ID、名称、漏洞函数名称和漏洞编号.若ELF文件中不包含漏洞库中内置的漏洞函数,则在下方仅显示该ELF文件的ID和名称.

历史判别信息页面展示所有已成功输入的ELF文件判别信息.包括文件序号、ID、文件名称、漏洞函数名称和漏洞编号.

3 关键功能模块实现

3.1 文件上传模块

文件上传模块支持用户上传文件,检测用户上传的文件是否符合ELF文件格式要求,若不符合要求则给出报错,提示用户重新上传.文件上传模块的流程图如图4所示.

图4 文件上传模块流程图Fig.4 Flow chart of file upload module

首先,用户输入待判别文件.然后利用Python中libmagic库的magic模块读取文件头,判断文件类型,若读取的文件头不是ELF头(ELF header),则不予保存,并提示用户重新上传文件,若读取的文件头是ELF头,则将其存储在服务器上,结束上传流程.

3.2 漏洞同源性判别模块

漏洞同源性判别是系统的核心模块.目标是判断用户输入的ELF文件中是否包含二进制程序函数同源漏洞,模块输入是用户提交成功的ELF文件,输出是ELF文件漏洞同源性判别结果,处理过程是函数特征提取,图嵌入生成和同源性判别3个步骤.

1)函数特征提取环节,输入是用户提交成功的ELF文件,过程中借助IDA pro工具和IDA python接口对文件进行反汇编并提取节点属性,最终输出二进制程序函数属性控制流图.

2)图嵌入生成环节,输入是函数属性控制流图,过程对属性控制流图进行节点嵌入生成和节点序列特征提取,最后输出属性控制流图高维特征向量.

3)同源性判别环节,输入是属性控制流图高维特征向量,过程是将高维特征向量与漏洞函数库中的漏洞函数作计算分析,最后进行同源性判别.

模块的难点在于服务器利用IDA自动执行文件反汇编,提取文件控制流图.服务器和IDA同时循环查询本地特定的文件存储目录,服务器接收到ELF文件后,将其命名为“extract”,存储在特定的文件存储目录中,然后循环等待,查询文件存储目录中是否存在反汇编信息文件“information.txt”.IDA和服务器同时启动,利用IDA python插件循环等待,查询存储目录中是否存在“extract”文件,当检测到文件时,利用IDA反汇编,整理反汇编信息,并将信息存储在存储目录中,命名为“information.txt”,其次删除目录中的ELF文件,然后继续循环等待,查询是否有新的ELF文件传入.服务器检测到“information.txt”文件后,将文件信息存储在内存中,删除存储目录中的txt文件,进行后续处理.

3.3 数据存储

为实现漏洞同源性分析历史查询功能,系统需要存储已上传的ELF文件并记录已分析ELF文件的相关信息.系统将用户上传的ELF文件保存在服务器中,计算文件的SHA-256值作为文件的唯一标识.采用MySQL数据库记录所有用户上传过的历史ELF文件信息,包括文件名、文件SHA-256值、上传文件用户名、文件同源漏洞名和文件保存路径.

3.4 可视化展示模块

可视化展示模块提供二进制程序函数漏洞同源性判别分析结果以及历史查询功能.此模块接收后台传输返回的判别信息,并将结果展示在界面上.历史查询功能遍历ELF文件信息表中的ELF_NAME字段,显示所有符合的ELF文件的相关判别信息.

4 系统测试分析

4.1 测试目的和数据资源

本小节旨在测试二进制程序函数漏洞同源性判别实验系统的功能指标是否符合预期,并测试系统时间、并发性、兼容性等性能指标.测试中使用开源软件OpenSSLv1.0.1f中部分ELF文件作为测试用例.

4.2 测试环境

系统测试环境拓扑图如图5所示.

图5 系统测试环境配置图Fig.5 System test environment configuration diagram

测试过程中使用的硬件资源主要包括:Web服务器1台,10核CPU,64GB 内存,操作系统为Ubuntu20.04;PC机2台,双核CPU,8GB 内存,操作系统为Windows 10;路由器1台,100Mbps宽带.

测试过程使用的软件资源主要包括:IDA pro反汇编工具,Python 3.8 脚本语言环境,Django 4.0web框架,tensorflow-gpu2.8.0深度学习框架,NumPy1.22.3 Python数值运算扩展,MySQL数据库.

4.3 测试用例

为验证实验系统的功能和性能指标符合预期,设计了数据分析测试、兼容性测试以及并发性测试三类测试,如表1所示.

表1 系统验收指标、测试用例与估计用时Table 1 System acceptance indicators, test cases and estimated time

5 测试结果

5.1 数据分析测试

(1)测试说明

本测试属于功能测试和性能测试,旨在测试是否支持二进制程序函数漏洞同源性判别功能,测试系统的响应时间是否符合3.1节预期.

(2)测试条件

Web服务器、客户端PC和数据库启动,系统正常运行.测试中使用OpenSSL开源软件中的部分漏洞函数作为测试用例.为保证测试结果的完备性,分别选取大小为0~1、1~5、5~10、10~20 MB的二进制文件,每种样本大小的请求重复测试后,取平均响应时间作为测试结果.

(3)测试步骤

步骤1:启动二进制程序函数漏洞同源性判别实验系统.

步骤2:编写Python脚本向系统发起HTTP请求,选择需要分析的二进制文件大小分别为672 KB、3.48、9.24和11.36 MB.测试时,基于4种样本重复请求10次,取10次响应时间的平均值作为该样本的测试结果.

(4)预期结果

步骤2中,请求响应包含样本的判别结果.对672 KB样本的单项分析时间不超过5 s,对3.48 MB样本的单项分析时间不超过10 s,对9.24 MB样本的单项分析时间不超过15 s,对11.36 MB样本的单项分析时间不超过25 s.

(5)测试结果

对于漏洞同源性判别,672 KB样本的平均分析时间为4.1 s,3.48 MB样本的平均分析时间为8.2 s,9.24 MB样本的平均分析时间为14.4 s,11.36 MB样本的平均分析时间为23.2 s.

5.2 兼容性测试

(1)测试说明

该测试属于性能测试,旨在测试系统能否在主流浏览器上正常显示页面并实现页面功能.

(2)测试条件

测试中使用的浏览器及其版本包括:Firefox(99.0.1)、Chrome(99.0.4844.51)、Edge(99.0.1150.46).

(3)测试步骤

步骤1:启动二进制程序函数漏洞同源性判别实验系统.

步骤2:在PC客户端上分别使用Firefox浏览器(99.01版本)、Chrome浏览器(99.0.4844.51版本)和Edge浏览器(99.0.1150.46版本)访问系统,查看各页面是否能正常显示并实现功能.

(4)预期结果

通过PC客户端的各种浏览器访问系统均可以正常渲染页面,无缩放或显示异常.

(5)测试结果

页面测试符合预期,系统能够在主流浏览器上正常使用.

5.3 并发性测试

(1)测试说明

该测试属于性能测试,要求系统达到TPS为20时,响应延迟小于1 s.

(2)测试条件

测试中使用JMeter工具生成测试请求并记录测试结果.

(3)测试步骤

步骤1:启动二进制程序函数漏洞同源性判别实验系统.

步骤2:进入系统主界面,启动JMeter工具并创建新线程组,设置线程数为20,记录JMeter输出结果.

(4)预期结果

JMeter报告中,所有请求均能被服务器正常接收和处理,报告显示连接失败数为0,系统平均响应时延小于1 s.

(5)测试结果

JMeter报告中,所有请求均能被服务器正常接收和处理,报告显示连接失败数为0,系统平均响应时延为627 ms,并且能无故障运行达到60 min,具有良好的并发性.

5.4 测试结论和讨论

测试结果显示,二进制程序函数漏洞同源性判别实验系统满足3.1节提出的功能和性能指标,能够有效完成漏洞同源性判别任务,系统对于不同大小的文件均具有良好的处理能力,并且能在Firefox、Chrome、Edge等主流浏览器上正常显示页面并实现页面功能.当系统TPS达到20以上时,平均响应时延为627 ms,具有良好的兼容性和并发性.

6 小 结

本文设计并实现的在线二进制程序函数漏洞同源性判别实验系统,支持主流同源判别方法,支持ELF格式的二进制文件上传、漏洞同源性判别、判别结果可视化展示和历史查询等功能.利用开源软件OpenSSLv1.0.1f版本中部分ELF文件对系统的功能和性能指标进行测试验证,测试结果表明系统能够实现目标功能,在响应时间、兼容性和并发性上表现良好,具有一定的实用价值.

猜你喜欢

二进制漏洞可视化
漏洞
基于CiteSpace的足三里穴研究可视化分析
自然资源可视化决策系统
思维可视化
用二进制解一道高中数学联赛数论题
自然资源可视化决策系统
有用的二进制
有趣的进度
基于selenium的SQL注入漏洞检测方法
漏洞在哪儿