CN114741700B - 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 - Google Patents

基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 Download PDF

Info

Publication number
CN114741700B
CN114741700B CN202210309055.5A CN202210309055A CN114741700B CN 114741700 B CN114741700 B CN 114741700B CN 202210309055 A CN202210309055 A CN 202210309055A CN 114741700 B CN114741700 B CN 114741700B
Authority
CN
China
Prior art keywords
analysis
stain
availability
taint
variable
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202210309055.5A
Other languages
English (en)
Other versions
CN114741700A (zh
Inventor
袁会杰
魏强
武泽慧
王允超
王新蕾
周国淼
宗国笑
黄辉辉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Information Engineering University of PLA Strategic Support Force
Original Assignee
Information Engineering University of PLA Strategic Support Force
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Information Engineering University of PLA Strategic Support Force filed Critical Information Engineering University of PLA Strategic Support Force
Priority to CN202210309055.5A priority Critical patent/CN114741700B/zh
Publication of CN114741700A publication Critical patent/CN114741700A/zh
Application granted granted Critical
Publication of CN114741700B publication Critical patent/CN114741700B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/57Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
    • G06F21/577Assessing vulnerabilities and evaluating computer system security
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/366Software debugging using diagnostics
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3668Software testing
    • G06F11/3672Test management
    • G06F11/3688Test management for test execution, e.g. scheduling of test suites

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Security & Cryptography (AREA)
  • Quality & Reliability (AREA)
  • Software Systems (AREA)
  • Computing Systems (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开一种基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置,该方法包括:采用Pin对公共组件库的二进制程序进行动态二进制插桩;对面向公共组件库的模糊测试产生的Crash文件进行污点标记,采用正向污点分析对插桩后的二进制程序调用公共组件库的路径进行分析,采用反向污点分析对Crash文件到公共组件库的脆弱点位置进行分析,结合正向和反向污点分析进行信息提取;根据提取的信息设计可利用性分析规则,将可利用性分为直接可利用、可能可利用和不可利用,对公共组件库漏洞的可利用性进行评估。本发明能够快速提取公共组件库漏洞的脆弱点位置、执行路径等信息,对组件库漏洞在真实软件中的可利用性分析进行分类。

Description

基于符号化污点分析的公共组件库漏洞可利用性分析方法及 装置
技术领域
本发明属于网络安全技术领域,尤其涉及一种基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置。
背景技术
公共组件库是具有良好定义的接口的功能集合,各种独立程序都可以使用由开发人员开发的公共组件库的功能。这种特性的重用为计算机科学领域做出了贡献,因为它的实现时间和成本都很低,生产效率很高,据统计,使用开源组件库的软件占用软件市场的90%以上。然而在程序开发设计阶段,开发者经常忽略了公共组件库的漏洞审查,甚至有些公共组件库被信手拈来使用,从根本上缺乏了安全审计。如果某个公共组件库存在漏洞,那么,大量使用了该库的软件都将面临安全威胁。这种场景,在现实世界中已经有了血淋淋的证明:如OpenSSL中出现的心脏滴血漏洞(Heartbleed)、GNU Bash出现的破壳漏洞(Shellshock)、 Java中的反序列化漏洞(Deserialization)和Apache Log4j2中出现的远程代码执行(RCE)漏洞等,这些都是实际应用程序中,存在公共组件库或应用框架漏洞的典型案例。2013年OWASP将“使用有已知漏洞的组件”列为十大网络安全风险,2021年OWASP将其改名为“脆弱过时组件(Vulnerable and Outdated Component)”,排名第六。
针对公共组件库中可能存在的漏洞,工业界已经开发了一些漏洞检测工具,如OWASP DEPENDENCY CHECK、WHITESOURCE和SNYK等,但是这些工具只能检测已经存在的漏洞,无法对组件库进行漏洞挖掘。学术界利用模糊测试技术提出了面向公共组件库的漏洞挖掘方法和工具,包括LibFuzzer、FUDGE、 FuzzGen等。由于公共组件库无法直接运行,因此对其进行模糊测试时需要首先进行驱动程序的编写。LibFuzzer利用安全人员手工编写组件库的驱动程序进行模糊测试,FUDGE是第一个自动化生成驱动程序的工具,采用函数间的依赖关系和抽象语法树生成驱动程序,FuzzGen采用自定义的抽象依赖图,根据数据流分析合成驱动程序。
虽然模糊测试技术能够高效地产生Crash(程序异常或崩溃),但模糊测试技术存在盲目性,产生的Crash数量巨大,并不是所有的Crash都可以被攻击者用于发起攻击,相反地,成千上万的Crash只有极少数在真实软件中是可利用的,组件库中存在漏洞并不意味着应用程序一定会执行到存在漏洞的函数。Plate等人使用运行时监控(即动态可达性分析)来确定脆弱的函数是否被执行,并在 ECLIPSE STEADY中组合动态和静态可达性分析,判断漏洞可达性。微软开发的exploitable通过比较调用堆栈对应的散列值分类崩溃,进而分析崩溃上下文的语义信息,进行自动Crash分析和安全风险评估。
但是现有研究主要关注于真实软件的Crash可利用性分析,缺乏面向公共组件库漏洞在真实软件中的可利用性分析。另外一些组件库漏洞的现有防护措施采用更新公共组件库的版本来防止漏洞攻击,但是应用程序中的组件库之间可能存在交叉依赖关系,更新版本可能导致程序无法使用,因此针对公共组件库漏洞在真实软件中的可利用性研究仍是亟待解决的问题。
发明内容
本发明针对现有研究主要关注于真实软件的Crash可利用性分析,缺乏面向公共组件库漏洞在真实软件中的可利用性分析的问题,提出一种基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置(LibExp-T),能够快速提取公共组件库漏洞的脆弱点位置、执行路径和堆栈寄存器等信息,对组件库漏洞在真实软件中的可利用性分析进行分类,将可利用性分为直接可利用、可能可利用和不可利用三种。
本发明的工作流程主要分为三个阶段,包括二进制代码插桩、符号化污点分析和可利用性分析,其中符号化污点分析又分为正向污点分析和反向污点分析。首先采用Pin二进制插桩技术对二进制程序进行插桩,并采用正向污点分析对二进制程序调用组件库的路径进行分析,采用反向污点分析对Crash到组件库的脆弱点位置进行分析,结合正向和反向污点分析设计信息提取算法,根据执行路径和EIP等信息对可利用性进行评估。通过选取包含图像、音频、视频和字体等多个攻击面的公共组件库进行实验,实验结果表明LibExp-T可有效评估公共组件库漏洞在真实软件中的可利用性,为漏洞利用自动化生成技术提供数据支撑。
为了实现上述目的,本发明采用以下技术方案:
本发明一方面提出一种基于符号化污点分析的公共组件库漏洞可利用性分析方法,包括:
步骤1:采用Pin对公共组件库的二进制程序进行动态二进制插桩;
步骤2:对面向公共组件库的模糊测试产生的Crash文件进行污点标记,采用正向污点分析对插桩后的二进制程序调用公共组件库的路径进行分析,采用反向污点分析对Crash文件到公共组件库的脆弱点位置进行分析,结合正向和反向污点分析,对污点传播路径进行信息提取;
步骤3:根据步骤2中提取的信息设计可利用性分析规则,将可利用性分为直接可利用、可能可利用和不可利用三个等级,对公共组件库漏洞的可利用性进行评估。
进一步地,所述步骤2包括:
步骤2.1:污点标记;包括:
将Crash文件标记为污染源Source点,并将数据分配给寄存器或内存操作数,然后二进制程序通过插桩后执行并读取污点数据,如果执行过程中存在系统调用,则提取目标函数的寄存器和内存操作数数据,判断目标函数参数是否被污染,如果内存或寄存器数据被污染,则将其指向的数据标记为污点数据;如果内存或寄存器数据被非污点数据覆盖,则删除污点;
步骤2.2:污点传播;包括:
污点变量根据指令语义和敏感函数的传播约束在程序中进行传播,当程序执行时,首先判断指令操作数所在寄存器或内存地址是否被污染,如果污染则将其标记为污点并赋予标签,然后修改污点变量的相关属性并将污点变量加入到属性链表中;如果此时污染的寄存器或内存地址被无污染的数据覆盖,则删除污点标记,然后执行下一条指令;
通过模糊测试获取的Crash文件和崩溃信息标记Sink点,对于无效指令导致的崩溃,将EIP寄存器标记为Sink点;对于取消引用无效地址导致的崩溃,将通用寄存器标记为Sink点;在程序执行时,当识别到Sink点后对其进行污点标记并执行反向污点传播;
步骤2.3:信息提取;包括:
通过实时记录执行路径下的函数信息,并结合污点变量标签构建函数路径链表FP,函数路径链表FP包括执行次序FD、执行函数名FN、函数地址FA、栈基址SA,在程序执行过程中实时记录EIP/EBP的状态和程序崩溃或结束时函数到达位置。
进一步地,在污点标记过程中,每个污点变量用标签<ID,TS,TT,TL>表示,其中ID表示污点变量序号;TS表示污点变量的直接污染源,污点源的直接污染源为其自身;TT表示污点变量的内存污染情况,0表示无污染,否则表示污染; TL表示污点变量的属性链表,包括内存数据链表TL-Mem和寄存器数据链表 TL-Reg,污点变量的属性包括污点变量的地址Addr、大小Size、直接污点源的长度Len、变量的栈底指针EBP和指令指针EIP。
进一步地,所述步骤3包括:
将正向污点分析和反向污点分析获取的两个不同的执行信息进行对比,查看执行路径是否重合,判断组件库的Crash文件在二进制程序中是否可以到达脆弱点位置;然后分析EIP寄存器是否被覆盖,包括EIP/EBP是否为符号值,综合上述分析将分析结果分为直接可利用、可能可利用和不可利用三个等级。
进一步地,所述可利用性分析规则包括:
首先根据步骤2获取的信息提取污点变量的函数执行路径,然后将正向污点分析执行路径与反向污点分析执行路径进行对比,如果在程序崩溃时执行路径相同,则将该漏洞归类为直接可利用漏洞,路径不同时进行下一步EIP/EBP分析;如果程序执行结束而未发生崩溃,不论此时执行路径是否相同,都进行下一步 EIP/EBP分析;
当检测到EIP寄存器的值被污点变量的符号值覆盖时,表示该漏洞可能可利用,然后检查污点变量的属性标签,污点变量的最大安全范围为Addr-EBP,实际使用范围为Size,并且由直接污点源的长度Len控制,因此如果污点变量的 Len>Addr-EBP时,程序出现崩溃,此时查看当前函数内执行指令,如果是跳转指令或读写指令,则表示该漏洞为可能可利用,否则该漏洞为不可利用;
将信号中断崩溃、空指针、除零、访问无效地址和软件配置错误归类为不可利用。
本发明另一方面提出一种基于符号化污点分析的公共组件库漏洞可利用性分析装置,包括:
二进制插桩模块,用于采用Pin对公共组件库的二进制程序进行动态二进制插桩;
符号化污点分析模块,用于对面向公共组件库的模糊测试产生的Crash文件进行污点标记,采用正向污点分析对插桩后的二进制程序调用公共组件库的路径进行分析,采用反向污点分析对Crash文件到公共组件库的脆弱点位置进行分析,结合正向和反向污点分析,对污点传播路径进行信息提取;
可利用性分析模块,用于根据符号化污点分析模块中提取的信息设计可利用性分析规则,将可利用性分为直接可利用、可能可利用和不可利用三个等级,对公共组件库漏洞的可利用性进行评估。
进一步地,所述符号化污点分析模块具体用于:
步骤2.1:污点标记;包括:
将Crash文件标记为污染源Source点,并将数据分配给寄存器或内存操作数,然后二进制程序通过插桩后执行并读取污点数据,如果执行过程中存在系统调用,则提取目标函数的寄存器和内存操作数数据,判断目标函数参数是否被污染,如果内存或寄存器数据被污染,则将其指向的数据标记为污点数据;如果内存或寄存器数据被非污点数据覆盖,则删除污点;
步骤2.2:污点传播;包括:
污点变量根据指令语义和敏感函数的传播约束在程序中进行传播,当程序执行时,首先判断指令操作数所在寄存器或内存地址是否被污染,如果污染则将其标记为污点并赋予标签,然后修改污点变量的相关属性并将污点变量加入到属性链表中;如果此时污染的寄存器或内存地址被无污染的数据覆盖,则删除污点标记,然后执行下一条指令;
通过模糊测试获取的Crash文件和崩溃信息标记Sink点,对于无效指令导致的崩溃,将EIP寄存器标记为Sink点;对于取消引用无效地址导致的崩溃,将通用寄存器标记为Sink点;在程序执行时,当识别到Sink点后对其进行污点标记并执行反向污点传播;
步骤2.3:信息提取;包括:
通过实时记录执行路径下的函数信息,并结合污点变量标签构建函数路径链表FP,函数路径链表FP包括执行次序FD、执行函数名FN、函数地址FA、栈基址SA,在程序执行过程中实时记录EIP/EBP的状态和程序崩溃或结束时函数到达位置。
进一步地,在污点标记过程中,每个污点变量用标签<ID,TS,TT,TL>表示,其中ID表示污点变量序号;TS表示污点变量的直接污染源,污点源的直接污染源为其自身;TT表示污点变量的内存污染情况,0表示无污染,否则表示污染; TL表示污点变量的属性链表,包括内存数据链表TL-Mem和寄存器数据链表 TL-Reg,污点变量的属性包括污点变量的地址Addr、大小Size、直接污点源的长度Len、变量的栈底指针EBP和指令指针EIP。
进一步地,所述可利用性分析模块具体用于:
将正向污点分析和反向污点分析获取的两个不同的执行信息进行对比,查看执行路径是否重合,判断组件库的Crash文件在二进制程序中是否可以到达脆弱点位置;然后分析EIP寄存器是否被覆盖,包括EIP/EBP是否为符号值,综合上述分析将分析结果分为直接可利用、可能可利用和不可利用三个等级。
进一步地,所述可利用性分析规则包括:
首先根据符号化污点分析模块获取的信息提取污点变量的函数执行路径,然后将正向污点分析执行路径与反向污点分析执行路径进行对比,如果在程序崩溃时执行路径相同,则将该漏洞归类为直接可利用漏洞,路径不同时进行下一步 EIP/EBP分析;如果程序执行结束而未发生崩溃,不论此时执行路径是否相同,都进行下一步EIP/EBP分析;
当检测到EIP寄存器的值被污点变量的符号值覆盖时,表示该漏洞可能可利用,然后检查污点变量的属性标签,污点变量的最大安全范围为Addr-EBP,实际使用范围为Size,并且由直接污点源的长度Len控制,因此如果污点变量的 Len>Addr-EBP时,程序出现崩溃,此时查看当前函数内执行指令,如果是跳转指令或读写指令,则表示该漏洞为可能可利用,否则该漏洞为不可利用;
将信号中断崩溃、空指针、除零、访问无效地址和软件配置错误归类为不可利用。
与现有技术相比,本发明具有的有益效果:
1.本发明面向公共组件库漏洞在真实软件中的可利用性分析问题,提出一种基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置,不依赖于源代码,并利用二进制(消费者)程序提取执行路径、函数地址等信息,能够对漏洞脆弱点进行匹配。
2.本发明填补了漏洞自动化利用技术在分析公共组件库漏洞在真实软件中的可利用性分析的空缺,和其他技术相比能够发现更多的可利用性漏洞,并且不会带来更大的开销问题。
附图说明
图1为本发明实施例一种基于符号化污点分析的公共组件库漏洞可利用性分析方法的整体框架图;
图2为本发明实施例Pin二进制插桩基本结构图;
图3为本发明实施例符号化污点分析流程图;
图4为本发明实施例符号化污点传播信息提取算法图;
图5为本发明实施例一种基于符号化污点分析的公共组件库漏洞可利用性分析装置结构示意图。
具体实施方式
下面结合附图和具体的实施例对本发明做进一步的解释说明:
一种基于符号化污点分析的公共组件库漏洞可利用性分析方法具体实现过程描述如下:首先采用Pin二进制插桩技术对二进制程序进行插桩,并采用正向污点分析对二进制程序调用组件库的路径进行分析,采用反向污点分析对Crash 到组件库的脆弱点位置进行分析,结合正向和反向污点分析提取相关信息,设计可利用性评估规则,根据执行路径和EIP等信息将组件库漏洞的可利用性分为直接可利用、可能可利用和不可利用三个等级,实现对可利用性进行评估。整体框架如图1所示。
步骤S101:动态二进制插桩。
动态二进制插桩是指在不影响二进制程序正常运行的情况下将额外的插桩代码注入程序以收集运行时信息,常用的工具包括Pin、DynamoRIO、Dyninst、 Varlgrind等。如图2所示,Pin是Intel公司开发的一款二进制插桩工具,提供了指令、基本块和系统调用等多个层次的插桩分析,其中的Trace是轨迹层次的插桩机制,能够识别单一入口、多出口的指令轨迹块,具有高效易用的特点,因此本发明采用Pin进行动态二进制插桩。
本发明采用Pin的指令级插桩实现动态符号化污点分析,通过函数INS_AddInstrumentFunction()调用回调函数INS_InsertCall()在不影响程序正常执行的情况下将分析代码插入程序中,对NtReadFile等接受外部输入数据的函数进行插桩,并形成一个新的程序执行序列,为后续获取程序执行跟踪提供支撑。
步骤S102:动态符号化污点分析。
动态污点分析能够精确获取程序执行过程,主要包括污点标记、污点传播和污点检测策略,但是动态污点分析漏报率较高,并且资源消耗较大,因此本发明通过将污点数据和污点传播检测规则进行符号化,采用符号化污点分析方法减小性能开销和降低漏报率。符号化污点分析的整体流程如图3所示,首先对面向公共组件库的模糊测试产生的Crash文件进行污点标记,同时通过Pin将二进制程序进行插桩,然后运行程序并跟踪污点的传播路径,设计算法对污点传播路径进行信息(函数地址、执行路径和函数名称等)提取。
步骤S102.1:污点标记。
污点标记主要包括两部分:创建污点数据和对污点进行删除,创建污点数据首先对输入的数据进行污点标记,由于本发明的输入数据只有从模糊测试得到的 Crash文件,因此将Crash文件标记为污染源Source点,并将数据分配给寄存器或内存操作数。然后二进制程序通过插桩后执行并读取污点数据,如果执行过程中存在系统调用,则提取目标函数的寄存器和内存操作数数据,判断目标函数参数是否被污染,如果内存或寄存器数据被污染,则将其指向的数据标记为污点数据;如果内存或寄存器数据被非污点数据覆盖,则删除污点。
在污点标记过程中,每个污点变量用标签<ID,TS,TT,TL>表示,其中ID 表示污点变量序号;TS表示污点变量的直接污染源,污点源的直接污染源为其自身;TT表示污点变量的内存污染情况,0表示无污染,否则表示污染;TL表示污点变量的属性链表,包括内存数据链表TL-Mem和寄存器数据链表TL-Reg,污点变量的属性包括污点变量的地址Addr、大小Size、直接污点源的长度Len、变量的栈底指针EBP和指令指针EIP。
步骤S102.2:污点传播。
污点变量根据指令语义和敏感函数的传播约束在程序中进行传播,当程序执行时,首先判断指令操作数所在寄存器或内存地址是否被污染,如果污染则将其标记为污点并赋予标签,然后修改污点变量的相关属性并将污点变量加入到属性链表中;如果此时污染的寄存器或内存地址被无污染的数据覆盖,则删除污点标记,然后执行下一条指令,如图4,算法1中第3-11行描述了污点传播过程。
由于程序崩溃主要有两种情况导致:执行无效指令或取消引用无效地址,因此本发明在进行反向污点分析时将通过模糊测试获取的Crash文件和崩溃信息标记Sink点。对于无效指令导致的崩溃代表EIP寄存器中存在无效值,因此本发明将EIP寄存器标记为Sink点;对于取消引用无效地址导致的崩溃代表通用寄存器保存了指向无效地址的值,因此将通用寄存器标记为Sink点。在程序执行时,当识别到Sink点后对其进行污点标记并执行反向污点传播,如图4,算法1 中第12-20行描述了反向污点传播过程。
步骤S102.3:信息提取。
为了获取程序的函数调用关系和堆栈信息,本发明通过实时记录执行路径下的函数信息,并结合污点变量标签构建函数路径链表FP,函数路径链表包括执行次序FD、执行函数名FN、函数地址FA、栈基址SA,在程序执行过程中实时记录EIP/EBP的状态和程序崩溃或结束时函数到达位置,如图4,算法1中所示。
具体方法为,使用全局变量count记录已经执行的函数总数,当执行一个新的函数时,则count++,此时判断函数列表是否为空,或者该函数与表头函数的堆栈关系。如果func_stack_start<FP_stack_start表明该函数是第一个执行的或者是被前面的函数调用的,将其添加进FP中,并将堆栈信息保存至S_Info中,并保存函数内指令的变量的属性列表,否则说明该函数的堆栈覆盖了前面函数的堆栈,则从FP中删除函数信息。
步骤S103:可利用性分析。
漏洞可利用的条件主要是能否进行控制流劫持,而劫持控制流必须满足:程序执行路径能够到达脆弱位置;/>EBP的值可控,且EIP寄存器指向的下一条指令能够跳转到可控的内存区域。此过程涉及到跳转指令和读写内存指令,因此本发明对公共组件库漏洞在真实软件中的可利用性分析首先将正向污点分析和反向污点分析获取的两个不同的执行信息进行对比,查看执行路径是否重合判断组件库的Crash文件在真实软件中是否可以到达脆弱点位置;然后分析EIP寄存器是否被覆盖,包括EIP/EBP是否为符号值,综合上述分析将分析结果分为直接可利用、可能可利用和不可利用三个等级。具体的分析规则如下。
(1)路径对比
首先根据步骤S102.3获取的信息提取污点变量的函数执行路径,然后将正向污点分析执行路径与反向污点分析执行路径进行对比,如果在程序崩溃时执行路径相同,则将该漏洞归类为直接可利用漏洞,路径不同时进行下一步分析;如果程序执行结束而未发生崩溃,不论此时执行路径是否相同,都进行下一步EIP /EBP分析。
(2)EIP/EBP分析
当检测到EIP寄存器的值被污点变量的符号值覆盖时,表示该漏洞可能可利用,然后检查污点变量的属性标签,包括污点变量的地址Addr、大小Size、直接污点源的长度Len、变量的栈底指针EBP和指令指针EIP。污点变量的最大安全范围为Addr-EBP,实际使用范围为Size,并且由Len控制,因此如果污点变量的Len>Addr-EBP时,程序出现崩溃,此时查看当前函数内执行指令,如果是跳转指令或读写指令,则表示该漏洞为可能可利用,否则该漏洞不可利用。
其中跳转指令指包括call、jmp、ret等指令,其能够改变程序控制流,当这些指令的EIP寄存器被污染时,即表明漏洞可利用。读写指令指mov指令,通过源或目的操作数完成读写指令,此时寄存器向内存单元写入间接获取控制流,尤其是当污点变量写入内存地址时表明可以将任意数据写入任意地址。另外本发明将信号中断崩溃、空指针、除零、访问无效地址和软件配置错误等归类为不可利用。
为验证本发明效果,进行如下实验:
本发明提出的基于符号化污点分析的公共组件库漏洞可利用性分析方法LibExp-T,并对其进行实验评估,首先对实验设置进行说明,然后对LibExp-T 的可利用性分析效果进行评估。
表1实验测试集
(a)实验设置
为测试公共组件库漏洞在真实软件中的可利用性的有效性,本发明在一台内存为64GB,CPU为64Intel(R)Xeon(R)CPU E7-4820 v2@2.00GHz,运行U buntu 18.04x64版本操作系统的服务器上搭建了测试环境。本发明开发了基于符号化污点分析的可利用性分析原型工具LibExp-T,为测试提出方法的有效性,选取了包含图像、音视频、字体渲染等多个漏洞攻击面的9个公共组件库进行测试,并对每个组件库的2个消费者程序(指使用公共组件库的程序)进行分析,选取的测试集如表1所示。
(b)可利用性分析
为评估LibExp-T的可利用性分析效果,本发明将LibExp-T与CRAX和RE X进行对比。由于CRAX和REX都是面向二进制程序的工具,因此本发明直接使用CRAX和REX对模糊测试生成的Crash文件和二进制程序进行分析,可利用性分析结果如表2所示。
表2可利用性分析结果
注:其中LibExp-T可利用性分析中D表示直接可利用,P表示可能可利用,N表示不可利用,CRAX和REX中E表示利用生成,N表示不可利用,/表示存在路径爆炸问题无法分析。
从表2中可以看出,由于自动化漏洞利用工具采用符号执行技术面临路径爆炸问题,在分析公共组件库漏洞在真实软件的可利用性时,针对的软件规模基本超过3M,特别是VLC Media Player软件源码为32M以上,现有的自动化利用工具大都无法进行漏洞利用。而LibExp-T采用符号化污点分析技术避免了此问题,在真实软件中都能够进行分析,并且可能利用的漏洞数量为33,占比39.3%,相比CRAX的10.6%和REX的25.8%有明显的提高,证明了LibExp-T在可利用性分析方面的有效性。
在上述实施例的基础上,如图5所示,本发明还提出一种基于符号化污点分析的公共组件库漏洞可利用性分析装置,包括:
二进制插桩模块,用于采用Pin对公共组件库的二进制程序进行动态二进制插桩;
符号化污点分析模块,用于对面向公共组件库的模糊测试产生的Crash文件进行污点标记,采用正向污点分析对插桩后的二进制程序调用公共组件库的路径进行分析,采用反向污点分析对Crash文件到公共组件库的脆弱点位置进行分析,结合正向和反向污点分析,对污点传播路径进行信息提取;
可利用性分析模块,用于根据符号化污点分析模块中提取的信息设计可利用性分析规则,将可利用性分为直接可利用、可能可利用和不可利用三个等级,对公共组件库漏洞的可利用性进行评估。
进一步地,所述符号化污点分析模块具体用于:
步骤2.1:污点标记;包括:
将Crash文件标记为污染源Source点,并将数据分配给寄存器或内存操作数,然后二进制程序通过插桩后执行并读取污点数据,如果执行过程中存在系统调用,则提取目标函数的寄存器和内存操作数数据,判断目标函数参数是否被污染,如果内存或寄存器数据被污染,则将其指向的数据标记为污点数据;如果内存或寄存器数据被非污点数据覆盖,则删除污点;
步骤2.2:污点传播;包括:
污点变量根据指令语义和敏感函数的传播约束在程序中进行传播,当程序执行时,首先判断指令操作数所在寄存器或内存地址是否被污染,如果污染则将其标记为污点并赋予标签,然后修改污点变量的相关属性并将污点变量加入到属性链表中;如果此时污染的寄存器或内存地址被无污染的数据覆盖,则删除污点标记,然后执行下一条指令;
通过模糊测试获取的Crash文件和崩溃信息标记Sink点,对于无效指令导致的崩溃,将EIP寄存器标记为Sink点;对于取消引用无效地址导致的崩溃,将通用寄存器标记为Sink点;在程序执行时,当识别到Sink点后对其进行污点标记并执行反向污点传播;
步骤2.3:信息提取;包括:
通过实时记录执行路径下的函数信息,并结合污点变量标签构建函数路径链表FP,函数路径链表FP包括执行次序FD、执行函数名FN、函数地址FA、栈基址SA,在程序执行过程中实时记录EIP/EBP的状态和程序崩溃或结束时函数到达位置。
进一步地,在污点标记过程中,每个污点变量用标签<ID,TS,TT,TL>表示,其中ID表示污点变量序号;TS表示污点变量的直接污染源,污点源的直接污染源为其自身;TT表示污点变量的内存污染情况,0表示无污染,否则表示污染; TL表示污点变量的属性链表,包括内存数据链表TL-Mem和寄存器数据链表 TL-Reg,污点变量的属性包括污点变量的地址Addr、大小Size、直接污点源的长度Len、变量的栈底指针EBP和指令指针EIP。
进一步地,所述可利用性分析模块具体用于:
将正向污点分析和反向污点分析获取的两个不同的执行信息进行对比,查看执行路径是否重合,判断组件库的Crash文件在二进制程序中是否可以到达脆弱点位置;然后分析EIP寄存器是否被覆盖,包括EIP/EBP是否为符号值,综合上述分析将分析结果分为直接可利用、可能可利用和不可利用三个等级。
进一步地,所述可利用性分析规则包括:
首先根据符号化污点分析模块获取的信息提取污点变量的函数执行路径,然后将正向污点分析执行路径与反向污点分析执行路径进行对比,如果在程序崩溃时执行路径相同,则将该漏洞归类为直接可利用漏洞,路径不同时进行下一步 EIP/EBP分析;如果程序执行结束而未发生崩溃,不论此时执行路径是否相同,都进行下一步EIP/EBP分析;
当检测到EIP寄存器的值被污点变量的符号值覆盖时,表示该漏洞可能可利用,然后检查污点变量的属性标签,污点变量的最大安全范围为Addr-EBP,实际使用范围为Size,并且由直接污点源的长度Len控制,因此如果污点变量的 Len>Addr-EBP时,程序出现崩溃,此时查看当前函数内执行指令,如果是跳转指令或读写指令,则表示该漏洞为可能可利用,否则该漏洞为不可利用;
将信号中断崩溃、空指针、除零、访问无效地址和软件配置错误归类为不可利用。
综上,本发明面向公共组件库漏洞在真实软件中的可利用性分析问题,提出一种基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置,不依赖于源代码,并利用二进制(消费者)程序提取执行路径、函数地址等信息,能够对漏洞脆弱点进行匹配。本发明填补了漏洞自动化利用技术在分析公共组件库漏洞在真实软件中的可利用性分析的空缺,和其他技术相比能够发现更多的可利用性漏洞,并且不会带来更大的开销问题。
以上所示仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

Claims (8)

1.一种基于符号化污点分析的公共组件库漏洞可利用性分析方法,其特征在于,包括:
步骤1:采用二进制插桩工具Pin对公共组件库的二进制程序进行动态二进制插桩;
步骤2:对面向公共组件库的模糊测试产生的Crash文件进行污点标记,采用正向污点分析对插桩后的二进制程序调用公共组件库的路径进行分析,采用反向污点分析对Crash文件到公共组件库的脆弱点位置进行分析,结合正向和反向污点分析,对污点传播路径进行信息提取;
步骤3:根据步骤2中提取的信息设计可利用性分析规则,将可利用性分为直接可利用、可能可利用和不可利用三个等级,对公共组件库漏洞的可利用性进行评估;
所述步骤2包括:
步骤2.1:污点标记;包括:
将Crash文件标记为污染源Source点,并将数据分配给寄存器或内存操作数,然后二进制程序通过插桩后执行并读取污点数据,如果执行过程中存在系统调用,则提取目标函数的寄存器和内存操作数数据,判断目标函数参数是否被污染,如果内存或寄存器数据被污染,则将其指向的数据标记为污点数据;如果内存或寄存器数据被非污点数据覆盖,则删除污点;
步骤2.2:污点传播;包括:
污点变量根据指令语义和敏感函数的传播约束在程序中进行传播,当程序执行时,首先判断指令操作数所在寄存器或内存地址是否被污染,如果污染则将其标记为污点并赋予标签,然后修改污点变量的相关属性并将污点变量加入到属性链表中;如果此时污染的寄存器或内存地址被无污染的数据覆盖,则删除污点标记,然后执行下一条指令;
通过模糊测试获取的Crash文件和崩溃信息标记Sink点,对于无效指令导致的崩溃,将EIP寄存器标记为Sink点;对于取消引用无效地址导致的崩溃,将通用寄存器标记为Sink点;在程序执行时,当识别到Sink点后对其进行污点标记并执行反向污点传播;
步骤2.3:信息提取;包括:
通过实时记录执行路径下的函数信息,并结合污点变量标签构建函数路径链表FP,函数路径链表FP包括执行次序FD、执行函数名FN、函数地址FA、栈基址SA,在程序执行过程中实时记录EIP/EBP的状态和程序崩溃或结束时函数到达位置。
2.根据权利要求1所述的基于符号化污点分析的公共组件库漏洞可利用性分析方法,其特征在于,在污点标记过程中,每个污点变量用标签<ID, TS, TT, TL>表示,其中ID表示污点变量序号;TS表示污点变量的直接污染源,污点源的直接污染源为其自身;TT表示污点变量的内存污染情况,0表示无污染,否则表示污染;TL表示污点变量的属性链表,包括内存数据链表TL-Mem和寄存器数据链表TL-Reg,污点变量的属性包括污点变量的地址Addr、大小Size、直接污点源的长度Len、变量的栈底指针EBP和指令指针EIP。
3.根据权利要求1所述的基于符号化污点分析的公共组件库漏洞可利用性分析方法,其特征在于,所述步骤3包括:
将正向污点分析和反向污点分析获取的两个不同的执行信息进行对比,查看执行路径是否重合,判断组件库的Crash文件在二进制程序中是否可以到达脆弱点位置;然后分析EIP寄存器是否被覆盖,包括EIP/EBP是否为符号值,综合上述分析将分析结果分为直接可利用、可能可利用和不可利用三个等级。
4.根据权利要求1所述的基于符号化污点分析的公共组件库漏洞可利用性分析方法,其特征在于,所述可利用性分析规则包括:
首先根据步骤2获取的信息提取污点变量的函数执行路径,然后将正向污点分析执行路径与反向污点分析执行路径进行对比,如果在程序崩溃时执行路径相同,则将该漏洞归类为直接可利用漏洞,路径不同时进行下一步EIP/EBP分析;如果程序执行结束而未发生崩溃,不论此时执行路径是否相同,都进行下一步EIP/EBP分析;
当检测到EIP寄存器的值被污点变量的符号值覆盖时,表示该漏洞可能可利用,然后检查污点变量的属性标签,污点变量的最大安全范围为Addr-EBP,实际使用范围为Size,并且由直接污点源的长度Len控制,因此如果污点变量的Len>Addr-EBP时,程序出现崩溃,此时查看当前函数内执行指令,如果是跳转指令或读写指令,则表示该漏洞为可能可利用,否则该漏洞为不可利用;
将信号中断崩溃、空指针、除零、访问无效地址和软件配置错误归类为不可利用。
5.一种基于符号化污点分析的公共组件库漏洞可利用性分析装置,其特征在于,包括:
二进制插桩模块,用于采用二进制插桩工具Pin对公共组件库的二进制程序进行动态二进制插桩;
符号化污点分析模块,用于对面向公共组件库的模糊测试产生的Crash文件进行污点标记,采用正向污点分析对插桩后的二进制程序调用公共组件库的路径进行分析,采用反向污点分析对Crash文件到公共组件库的脆弱点位置进行分析,结合正向和反向污点分析,对污点传播路径进行信息提取;
可利用性分析模块,用于根据符号化污点分析模块中提取的信息设计可利用性分析规则,将可利用性分为直接可利用、可能可利用和不可利用三个等级,对公共组件库漏洞的可利用性进行评估;
所述符号化污点分析模块具体用于:
步骤2.1:污点标记;包括:
将Crash文件标记为污染源Source点,并将数据分配给寄存器或内存操作数,然后二进制程序通过插桩后执行并读取污点数据,如果执行过程中存在系统调用,则提取目标函数的寄存器和内存操作数数据,判断目标函数参数是否被污染,如果内存或寄存器数据被污染,则将其指向的数据标记为污点数据;如果内存或寄存器数据被非污点数据覆盖,则删除污点;
步骤2.2:污点传播;包括:
污点变量根据指令语义和敏感函数的传播约束在程序中进行传播,当程序执行时,首先判断指令操作数所在寄存器或内存地址是否被污染,如果污染则将其标记为污点并赋予标签,然后修改污点变量的相关属性并将污点变量加入到属性链表中;如果此时污染的寄存器或内存地址被无污染的数据覆盖,则删除污点标记,然后执行下一条指令;
通过模糊测试获取的Crash文件和崩溃信息标记Sink点,对于无效指令导致的崩溃,将EIP寄存器标记为Sink点;对于取消引用无效地址导致的崩溃,将通用寄存器标记为Sink点;在程序执行时,当识别到Sink点后对其进行污点标记并执行反向污点传播;
步骤2.3:信息提取;包括:
通过实时记录执行路径下的函数信息,并结合污点变量标签构建函数路径链表FP,函数路径链表FP包括执行次序FD、执行函数名FN、函数地址FA、栈基址SA,在程序执行过程中实时记录EIP/EBP的状态和程序崩溃或结束时函数到达位置。
6.根据权利要求5所述的基于符号化污点分析的公共组件库漏洞可利用性分析装置,其特征在于,在污点标记过程中,每个污点变量用标签<ID, TS, TT, TL>表示,其中ID表示污点变量序号;TS表示污点变量的直接污染源,污点源的直接污染源为其自身;TT表示污点变量的内存污染情况,0表示无污染,否则表示污染;TL表示污点变量的属性链表,包括内存数据链表TL-Mem和寄存器数据链表TL-Reg,污点变量的属性包括污点变量的地址Addr、大小Size、直接污点源的长度Len、变量的栈底指针EBP和指令指针EIP。
7.根据权利要求5所述的基于符号化污点分析的公共组件库漏洞可利用性分析装置,其特征在于,所述可利用性分析模块具体用于:
将正向污点分析和反向污点分析获取的两个不同的执行信息进行对比,查看执行路径是否重合,判断组件库的Crash文件在二进制程序中是否可以到达脆弱点位置;然后分析EIP寄存器是否被覆盖,包括EIP/EBP是否为符号值,综合上述分析将分析结果分为直接可利用、可能可利用和不可利用三个等级。
8.根据权利要求5所述的基于符号化污点分析的公共组件库漏洞可利用性分析装置,其特征在于,所述可利用性分析规则包括:
首先根据符号化污点分析模块获取的信息提取污点变量的函数执行路径,然后将正向污点分析执行路径与反向污点分析执行路径进行对比,如果在程序崩溃时执行路径相同,则将该漏洞归类为直接可利用漏洞,路径不同时进行下一步EIP/EBP分析;如果程序执行结束而未发生崩溃,不论此时执行路径是否相同,都进行下一步EIP/EBP分析;
当检测到EIP寄存器的值被污点变量的符号值覆盖时,表示该漏洞可能可利用,然后检查污点变量的属性标签,污点变量的最大安全范围为Addr-EBP,实际使用范围为Size,并且由直接污点源的长度Len控制,因此如果污点变量的Len>Addr-EBP时,程序出现崩溃,此时查看当前函数内执行指令,如果是跳转指令或读写指令,则表示该漏洞为可能可利用,否则该漏洞为不可利用;
将信号中断崩溃、空指针、除零、访问无效地址和软件配置错误归类为不可利用。
CN202210309055.5A 2022-03-28 2022-03-28 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 Active CN114741700B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202210309055.5A CN114741700B (zh) 2022-03-28 2022-03-28 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202210309055.5A CN114741700B (zh) 2022-03-28 2022-03-28 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置

Publications (2)

Publication Number Publication Date
CN114741700A CN114741700A (zh) 2022-07-12
CN114741700B true CN114741700B (zh) 2024-05-03

Family

ID=82276155

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202210309055.5A Active CN114741700B (zh) 2022-03-28 2022-03-28 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置

Country Status (1)

Country Link
CN (1) CN114741700B (zh)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115168871B (zh) * 2022-08-03 2023-06-13 中国电子科技集团公司信息科学研究院 一种攻击利用组件的自动生成方法和装置

Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103440201A (zh) * 2013-09-05 2013-12-11 北京邮电大学 动态污点分析装置及其在文件格式逆向解析中的应用
CN104598383A (zh) * 2015-02-06 2015-05-06 中国科学院软件研究所 一种基于模式的动态漏洞挖掘集成系统和方法
CN106446688A (zh) * 2016-11-09 2017-02-22 中国科学院软件研究所 一种基于dcr的动态漏洞挖掘方法及系统
CN107193732A (zh) * 2017-05-12 2017-09-22 北京理工大学 一种基于路径比对的校验函数定位方法
CN107729747A (zh) * 2017-11-10 2018-02-23 中国科学院软件研究所 一种面向二进制程序的堆溢出检测方法
WO2018086292A1 (zh) * 2016-11-14 2018-05-17 平安科技(深圳)有限公司 应用软件安全漏洞检测方法、系统、设备及存储介质
CN109002721A (zh) * 2018-07-12 2018-12-14 南方电网科学研究院有限责任公司 一种信息安全漏洞的挖掘分析方法
CN110196815A (zh) * 2019-07-26 2019-09-03 中国人民解放军国防科技大学 一种软件模糊测试方法
CN110941552A (zh) * 2019-11-20 2020-03-31 广州大学 一种基于动态污点分析的内存分析方法及装置
CN113268427A (zh) * 2021-06-15 2021-08-17 中国电子科技网络信息安全有限公司 一种针对二进制程序的崩溃分析方法及系统

Patent Citations (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103440201A (zh) * 2013-09-05 2013-12-11 北京邮电大学 动态污点分析装置及其在文件格式逆向解析中的应用
CN104598383A (zh) * 2015-02-06 2015-05-06 中国科学院软件研究所 一种基于模式的动态漏洞挖掘集成系统和方法
CN106446688A (zh) * 2016-11-09 2017-02-22 中国科学院软件研究所 一种基于dcr的动态漏洞挖掘方法及系统
WO2018086292A1 (zh) * 2016-11-14 2018-05-17 平安科技(深圳)有限公司 应用软件安全漏洞检测方法、系统、设备及存储介质
CN107193732A (zh) * 2017-05-12 2017-09-22 北京理工大学 一种基于路径比对的校验函数定位方法
CN107729747A (zh) * 2017-11-10 2018-02-23 中国科学院软件研究所 一种面向二进制程序的堆溢出检测方法
CN109002721A (zh) * 2018-07-12 2018-12-14 南方电网科学研究院有限责任公司 一种信息安全漏洞的挖掘分析方法
CN110196815A (zh) * 2019-07-26 2019-09-03 中国人民解放军国防科技大学 一种软件模糊测试方法
CN110941552A (zh) * 2019-11-20 2020-03-31 广州大学 一种基于动态污点分析的内存分析方法及装置
CN113268427A (zh) * 2021-06-15 2021-08-17 中国电子科技网络信息安全有限公司 一种针对二进制程序的崩溃分析方法及系统

Non-Patent Citations (6)

* Cited by examiner, † Cited by third party
Title
Exploitability Analysis of Public Component Library Vulnerabilities Based on Taint Analysis;Huijie Yuan 等;2022 7th International Conference on Intelligent Computing and Signal Processing(ICSP);20220524;1066-1072 *
Tainting-Assisted and Context-Migrated Symbolic Execution of Android Framework for Vulnerability Discovery and Exploit Generation;Lannan Luo 等;IEEE Transactions on Mobile Computing;20190820;第19卷(第12期);2946-2964 *
基于动态污点分析的栈溢出Crash判定技术;张婧 等;计算机工程;20170712;第44卷(第04期);168-173+180 *
基于符号执行的Unlink攻击检测方法;黄宁 等;华南理工大学学报(自然科学版);20180815;第46卷(第08期);81-87 *
软件与系统漏洞分析与发现技术研究构想和成果展望;饶志宏 等;工程科学与技术;20180119;第50卷(第01期);9-21 *
面向漏洞类型的Crash分类研究;代培武 等;计算机工程与应用;20190820;第56卷(第13期);124-130 *

Also Published As

Publication number Publication date
CN114741700A (zh) 2022-07-12

Similar Documents

Publication Publication Date Title
Carmony et al. Extract Me If You Can: Abusing PDF Parsers in Malware Detectors.
Huang et al. Crax: Software crash analysis for automatic exploit generation by modeling attacks as symbolic continuations
CN109583200B (zh) 一种基于动态污点传播的程序异常分析方法
US8316448B2 (en) Automatic filter generation and generalization
CN101853200B (zh) 一种高效动态软件漏洞挖掘方法
CN112733150B (zh) 一种基于脆弱性分析的固件未知漏洞检测方法
CN111832026B (zh) 一种漏洞利用定位方法、系统、装置及介质
Li et al. A novel approach for software vulnerability classification
CN110941552A (zh) 一种基于动态污点分析的内存分析方法及装置
CN112181833A (zh) 一种智能化模糊测试方法、装置及系统
KR101979329B1 (ko) 바이너리의 취약점을 유발하는 입력데이터 위치 추적 방법 및 그 장치
CN114741700B (zh) 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置
CN101458630B (zh) 一种基于硬件模拟器的自修改代码识别方法
US11868465B2 (en) Binary image stack cookie protection
Gkortzis et al. A double-edged sword? Software reuse and potential security vulnerabilities
Gritti et al. Heapster: Analyzing the security of dynamic allocators for monolithic firmware images
Wang et al. Tunter: assessing exploitability of vulnerabilities with taint-guided exploitable states exploration
US20230141948A1 (en) Analysis and Testing of Embedded Code
CN115795489A (zh) 一种基于硬件级进程跟踪的软件漏洞静态分析方法及装置
US20220335135A1 (en) Vulnerability analysis and reporting for embedded systems
US20230107164A1 (en) System and method for vulnerability detection in computer code
Cai et al. A smart fuzzing approach for integer overflow detection
US11886589B2 (en) Process wrapping method for evading anti-analysis of native codes, recording medium and device for performing the method
Liu et al. Detecting Exploit Primitives Automatically for Heap Vulnerabilities on Binary Programs
WO2024079794A1 (ja) 解析機能付与装置、解析機能付与方法および解析機能付与プログラム

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant