CN117556431B - 一种混合软件漏洞分析方法和系统 - Google Patents
一种混合软件漏洞分析方法和系统 Download PDFInfo
- Publication number
- CN117556431B CN117556431B CN202410047057.0A CN202410047057A CN117556431B CN 117556431 B CN117556431 B CN 117556431B CN 202410047057 A CN202410047057 A CN 202410047057A CN 117556431 B CN117556431 B CN 117556431B
- Authority
- CN
- China
- Prior art keywords
- vulnerability
- code
- software
- codes
- vfg
- 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
Links
- 238000000034 method Methods 0.000 title claims abstract description 44
- 238000002513 implantation Methods 0.000 claims abstract description 18
- 230000008569 process Effects 0.000 claims description 16
- 238000012038 vulnerability analysis Methods 0.000 claims description 12
- 238000005206 flow analysis Methods 0.000 claims description 10
- 238000000605 extraction Methods 0.000 claims description 8
- 230000006837 decompression Effects 0.000 claims description 4
- 230000006835 compression Effects 0.000 claims description 3
- 238000007906 compression Methods 0.000 claims description 3
- 238000004458 analytical method Methods 0.000 abstract description 34
- 230000003068 static effect Effects 0.000 abstract description 15
- 238000005516 engineering process Methods 0.000 abstract description 9
- 238000001514 detection method Methods 0.000 abstract description 8
- 230000003993 interaction Effects 0.000 abstract description 4
- 230000007547 defect Effects 0.000 abstract description 3
- 238000012545 processing Methods 0.000 description 12
- 238000002347 injection Methods 0.000 description 7
- 239000007924 injection Substances 0.000 description 7
- 238000010586 diagram Methods 0.000 description 6
- 230000006870 function Effects 0.000 description 6
- 238000004891 communication Methods 0.000 description 4
- 238000001914 filtration Methods 0.000 description 4
- 238000011160 research Methods 0.000 description 4
- 238000009825 accumulation Methods 0.000 description 3
- 238000004364 calculation method Methods 0.000 description 3
- 230000008878 coupling Effects 0.000 description 3
- 238000010168 coupling process Methods 0.000 description 3
- 238000005859 coupling reaction Methods 0.000 description 3
- 239000000203 mixture Substances 0.000 description 3
- 239000000243 solution Substances 0.000 description 3
- 230000001960 triggered effect Effects 0.000 description 3
- 239000011800 void material Substances 0.000 description 3
- 238000004422 calculation algorithm Methods 0.000 description 2
- 238000010276 construction Methods 0.000 description 2
- 230000014509 gene expression Effects 0.000 description 2
- 238000010801 machine learning Methods 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 238000012546 transfer Methods 0.000 description 2
- 238000012935 Averaging Methods 0.000 description 1
- 206010033799 Paralysis Diseases 0.000 description 1
- 230000008901 benefit Effects 0.000 description 1
- 229910002056 binary alloy Inorganic materials 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000001010 compromised effect Effects 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 238000013136 deep learning model Methods 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 238000004880 explosion Methods 0.000 description 1
- 238000012905 input function Methods 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 230000004044 response Effects 0.000 description 1
- 230000008054 signal transmission Effects 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 238000000844 transformation Methods 0.000 description 1
- 238000012795 verification Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/50—Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
- G06F21/57—Certifying or maintaining trusted computer platforms, e.g. secure boots or power-downs, version controls, system software checks, secure updates or assessing vulnerabilities
- G06F21/577—Assessing vulnerabilities and evaluating computer system security
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2221/00—Indexing scheme relating to security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F2221/03—Indexing scheme relating to G06F21/50, monitoring users, programs or devices to maintain the integrity of platforms
- G06F2221/033—Test or assess software
Landscapes
- Engineering & Computer Science (AREA)
- Computer Hardware Design (AREA)
- Computer Security & Cryptography (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明涉及静态代码分析技术,具体涉及一种混合软件漏洞分析方法。本发明提供的方法包括:基于混合软件确定统一中间表示IR;基于统一中间表示IR构造数据流表示模型VFG;基于数据流表示模型VFG定位潜在漏洞的植入点和触发点;通过流追踪的方式对漏洞进行分析;混合软件至少包含两种以上的编程语言或者两种以上的代码形式。本发明通过建立统一的中间表示模型,实现对多种编程语言、多种形式代码混合的复杂软件的检测,尤其对于多模块交互的场景,能够弥补传统检测方式的不足,提升漏洞检测的能力,发现软件系统中的深层次问题。
Description
技术领域
本发明涉及静态代码分析技术,具体涉及一种基于中间表示的源代码和二进制代码混合软件漏洞分析方法。
背景技术
随着软件规模的增加和复杂度的提高,软件系统的安全问题也愈发受到关注,软件中的安全漏洞可能会导致信息泄漏、拒绝服务、系统瘫痪等严重后果。为了解决这一问题,静态代码分析技术成为了一种重要的漏洞检测方法。
静态代码分析技术是一种不依赖于实际执行代码的分析方法,可以在不运行程序的情况下对代码进行分析,以发现其中的缺陷和漏洞。目前,静态代码分析技术已经广泛应用于软件开发和安全领域,例如:源代码安全扫描、二进制代码反汇编、污点分析、数据流分析、控制流分析、符号执行等技术。
然而,在混合软件中,不同的编程语言、不同的代码形式(源代码、库文件和二进制)、不同的执行环境(JVM、Python解释器、C++库等)之间的交互和通信增加了混合软件分析的复杂度和难度,导致静态代码分析技术在混合软件中的应用存在一定困难和挑战。因此,研究混合软件的静态代码分析技术对于提高软件安全性和可靠性具有重要意义。
对于混合软件的定义,本领域认为一般涵盖两种情形:
1.多种编程语言的混合,如软件内部同时包含了Java、C++、Python等多种语言的代码;
2.多种形式代码的混合,如软件内部包括源代码、库文件和二进制等多种形式的代码。
一些研究人员已经尝试解决这些问题,例如基于符号执行的技术可以对源代码和二进制进行分析,同时可以处理不同编程语言和代码形式之间的交互和通信,但是符号执行的路径爆炸问题导致它在混合软件分析中的应用受到了限制。另外,一些研究人员也提出了基于机器学习的相关技术,例如使用深度学习模型对源代码和二进制进行分析,但是由于机器学习模型的黑盒特性,使得它们难以对分析结果进行解释和调试,同时也无法保证分析结果的正确性,难以保证研究成果的实用性。
目前,对于混合软件的静态代码分析技术仍处于研究阶段,需要进一步深入研究和探索,以提高分析的精度和效率。而且,传统的静态分析方法往往只能针对单一的编程语言或代码形式进行分析,难以针对混合软件进行全面的漏洞分析。
发明内容
本发明至少一个方面和优点将在下面的描述中部分地被阐述,或者可以从描述中显而易见,或者可以通过实践本公开的主题来获取。
为了实现对于混合软件全面、深入的漏洞分析,本文提出了一种基于中间表示的混合软件漏洞分析方法,通过静态代码分析技术,能够在不执行代码的情况下,对多种编程语言、多种形式代码统一建模并进行漏洞分析。
本发明的目的是提供一种针对源代码和二进制代码混合软件的漏洞分析方法。对混合软件中的多种编程语言、多种形式代码建立统一的中间表示,然后在中间表示的基础上建立数据流分析模型,进而通过流追踪,发现软件中的安全漏洞。
根据本发明的第一个方面,一种混合软件漏洞分析方法,包括:
基于混合软件确定统一中间表示IR;
基于统一中间表示IR构造数据流表示模型VFG;
基于数据流表示模型VFG定位潜在漏洞的植入点和触发点;
通过流追踪的方式对漏洞进行分析;
所述混合软件至少包含两种以上的编程语言或者两种以上的代码形式。
根据本发明的一个实施例,统一中间表示的IR构建过程包括:
基于被测软件中待分析的代码获得漏洞分析的目标代码集合,所述待分析的代码至少包括源代码、压缩包、库文件或二进制文件;
对目标代码集合进行代码提取,得到至少包含源代码或伪代码的待分析文件集;
基于抽象语法树构建统一中间表示。
根据本发明的一个实施例,所述代码提取的操作还包括:
对压缩包、库文件或二进制文件进行包含反编译和/或解压缩,获取源代码和/或伪代码。
根据本发明的一个实施例,抽象语法树AST基于对目标代码集合的控制流分析获得。
根据本发明的一个实施例,通过流追踪的方式对漏洞进行分析包括:
在潜在漏洞的植入点和触发点之间进行路径搜索,确定是否存在可行路径;
在存在可行路径时,基于可行路径中是否存在完全中断漏洞的节点,确定是否存在漏洞。
根据本发明的一个实施例,通过流追踪的方式对漏洞进行分析包括:
在潜在漏洞的植入点和触发点之间进行路径搜索,确定是否存在可行路径;
在存在可行路径时,基于可行路径中存在的中断漏洞的节点,确定漏洞的类型。
根据本发明的第二个方面,本发明提供了一种混合软件漏洞分析系统,包括:
统一中间表示IR获取单元,用于基于混合软件确定统一中间表示IR;
数据流表示模型VFG获取单元,用于基于统一中间表示IR构造数据流表示模型VFG;
漏洞分析单元,用于基于数据流表示模型VFG定位潜在漏洞的植入点和触发点,以及通过流追踪的方式对漏洞进行分析;
所述混合软件至少包含两种以上的编程语言或者两种以上的代码形式。
本发明通过建立统一的中间表示模型,实现对多种编程语言、多种形式代码混合的复杂软件的检测,尤其对于多模块交互的场景,能够弥补传统检测方式的不足,提升漏洞检测的能力,发现软件系统中的深层次问题。
附图说明
图1是本发明一实施例混合软件漏洞分析方法的整体流程图。
图2是本发明一实施例对多种编程语言、多种形式代码构建的中间表示的示例图。
图3是对一段包含“命令注入”漏洞构建的值流模型VFG的示意图。
图4是对一段修复后的包含“命令注入”漏洞构建的值流模型VFG的示意图。
图5是一个混合软件常见结构的示意图。
图6是本发明一实施例中java代码对应的IR模型。
图7是本发明一实施例中python代码对应的IR模型。
图8是本发明一实施例中类C代码对应的IR模型。
图9是本发明一实施例中对混合软件建立的VFG模型。
具体实施方式
现在将参照若干示例性实施例来论述本公开的内容。应当理解,论述了这些实施例仅是为了使得本领域普通技术人员能够更好地理解且因此实现本公开的内容,而不是暗示对本公开的范围的任何限制。
首先,请参考图1-7,根据本发明的一个实施例,一种混合软件漏洞分析方法,包括:
基于混合软件确定统一中间表示IR;
基于统一中间表示IR构造数据流表示模型VFG;
基于数据流表示模型VFG定位潜在漏洞的植入点和触发点;
通过流追踪的方式对漏洞进行分析;
混合软件至少包含两种以上的编程语言或者两种以上的代码形式。
统一中间表示为通过编译器或解释器,将用户提供的源代码、伪代码、基于源代码提取的逻辑或者基于伪代码提供的逻辑进行转换,得到以单个统一语言呈现的计算机程序。
通过上述的方式可以将混合程序转换为统一中间表示,并根据流追踪的方式实现对于漏洞的分析。
在本发明的部分实施例中,统一中间表示提供了单个统一的语言将当前使用的所有或者部分处理器确定为指令的执行目标。
根据本发明的一个实施例,统一中间表示的IR构建过程包括:
基于被测软件中待分析的代码获得漏洞分析的目标代码集合,待分析的代码至少包括源代码、压缩包、库文件或二进制文件;
对目标代码集合进行代码提取,得到至少包含源代码或伪代码的待分析文件集;
基于抽象语法树构建统一中间表示。
通过上述的方式可以实现对于被测软件所包含的程序执行逻辑的提取,并得到源代码或者伪代码的形式。在本发明的部分实施例内,所使用的伪代码为伪C代码。
根据本发明的一个实施例,代码提取的操作还包括:
对压缩包、库文件或二进制文件进行包含反编译和/或解压缩,获取源代码和/或伪代码。
例如,对于jar文件,可以获得其内包含的class文件,并对其进行反编译以获得java源代码;其代码为混淆后的代码时,可以对其进行可读化处理。当处理的库文件为lib或so时,可以将其反编译为类C代码。
根据本发明的一个实施例,抽象语法树AST基于对目标代码集合的控制流分析获得。
根据本发明的一个实施例,通过流追踪的方式对漏洞进行分析包括:
在潜在漏洞的植入点和触发点之间进行路径搜索,确定是否存在可行路径;
在存在可行路径时,基于可行路径中是否存在完全中断漏洞的节点,确定是否存在漏洞。
根据本发明的一个实施例,通过流追踪的方式对漏洞进行分析包括:
在潜在漏洞的植入点和触发点之间进行路径搜索,确定是否存在可行路径;
在存在可行路径时,基于可行路径中存在的中断漏洞的节点,确定漏洞的类型。
在本发明一个实施例内,混合代码分析的方法包括:
获取被测软件中待分析的代码,根据软件系统中的文件名后缀来确定文件类型,并决定是否纳入分析范围。对于源代码将获取后缀名为“.java”、“.py”、“.cpp”、“.c”、“.cxx”、“.h”等为后缀的文件;对于库文件将获取后缀名为“.jar”、“.egg”、“.tar.gz”等为后缀的文件;对于二进制文件,将获取后缀名为“.exe”、“.dll”、“.so”等为后缀的文件。
对得到的目标代码进行预处理,对源代码可不做处理;对于软件中的库文件,需要进行反编译或解压缩,如“.jar”文件进行反编译生成java源代码,“.egg”文件可进行解压缩生成python源代码;对于二进制文件,如“.exe”文件需要通过反编译、反汇编工具进行处理,生成类C代码。经过此步骤,所有的分析对象都将被转化为源代码或类C代码的形式。
对获得的源代码和类C代码首先经过词法分析、语法分析生成抽象语法树AST,然后进行控制流分析得到程序语句的执行流程,且因为不同语言之间对于同一逻辑的表示存在差异,这里将需要将不同编程语言源代码和类C代码转换到统一的中间表示IR上。
在建立的IR的基础上进行数据流分析,并生成数据流表示模型VFG(Value FlowGraph),用于表示软件系统中的数据流向。通过统一的IR,使得VFG能够表示不同编程语言、不同形式代码之间的关联关系,从而保证了数据流模型的完整性。
在构建的VFG的基础上,进行软件漏洞分析。首先在VFG中定位漏洞的植入点和触发点,然后通过流追踪(即从植入点到触发点之间的路径搜索),检查二者之间是否存在可行路径,进而检查路径中是否存在过滤点(即对漏洞的检查和保护),最终判断漏洞是否可能被触发。
对检测到的可能被触发的漏洞进行汇总,作为发现的软件漏洞结果。
实施例1
本实施例用于阐述对于混合软件建立统一IR的原因及计算过程,具体请参考图2-4。
不同编程语言、不同形式代码对于同一段编程逻辑的表示存在差异,为了做到跨语言、跨形式分析,需要将代码映射到统一的模型上,即中间表示IR。下面以一段“对数组求平均值”的代码为例,对IR的构建逻辑进行阐述。
1.Java代码的实现
public static double average(int[] nums) {
int total = 0;
for (int i = 0; i < nums.length; i++) {
total += nums[i];
}
return total / nums.length;
}
2.Python代码实现
def calculate average(arr):
total = @for i in range(len(arr)):
total += arr[i]
return total / len(arr)
3.二进制文件反编译、反汇编得到的类C代码
ulonglong _Z7averagePii(longlong param_1,int param_2){
int local_10;
int local_c;
local_c = 0;
for (local_10 = 0; local_10 < param_2; local_10 = local_10 + 1){
local_c= local_c + *(int *)(param_1 + (longlong)local 10 *4);
}
return (longlong)local_c / (longlong)param_2 & @xffffffff;
}
通过上述样本,可以发现不同语言、不同形式的代码对于同一段计算逻辑的实现存在差异,为了对混合软件进行分析,就要消除这种差异,建立统一的模型表达。首先要通过词法分析、语法分析,生成抽象语法树AST;然后在AST的基础上进行控制流分析,并将不同的语言所表示的逻辑,映射到统一的中间表示IR上;最后将得到对于能够兼容不同语言、不同形式代码的统一化模型。
上述“对数组求平均值”程序最终得到的统一表示模型如下图所示:
模型中的点表示程序语句,有向边表示语句间的执行顺序。利用上图所示的IR模型,可以表示java、python和类C代码对于程序逻辑的实现,其中的点代表程序语句,其中的有向边代表程序语句执行的顺序转换:
1.“total = 0”,定义变量total,用于存储数组内所有数据的加和;
2.“count = len(array)| param”,定义变量count用于表示数组的长度,count的值将来自对数组长度的计算或输入函数的参数;
3.“i = 0”表示循环迭代变量的初始化;
4.“i < count”表示循环迭代条件,当条件成立将进入到左分支,条件不成立将进入到右分支,其中左分支为循环内的语句序列;
5.“t = array[i]”表示对数组内部元素的获取;
6.“total = total + t”表示对数组内部元素的累加,并记录到total变量中;
7.“i++”表示循环迭代变量的累加;
8.“res = total / len(array)”表示用数组元素之和除以数组长度,求得平均值;
9.“return res”返回结果。
在目前的相关领域中,在静态代码分析的过程中,缺少对于不同编程语言、不同类型代码进行统一分析的方法。本文提出的上述方法通过建立统一的中间表示模型,根据代码逻辑对不同编程语言、不同类型代码进行归并,消除各样本中语法表示上的差异,从而能够对混合软件中的运算逻辑进行完整、统一的描述,保证分析过程的兼容性和分析结果的全面性。
实施例2
本实施例用于阐述VFG中对于数据流的表示,以及在漏洞分析中的应用。
VFG是一种经典的数据流表示模型,通过流图的形式,表示程序中的数据流向,对于污点追踪、漏洞发现能够提供有力的支撑。本文所使用的VFG,因为是基于统一的中间表示构建,所以同样具有跨语言、跨类型分析的特性,这里以一段存在命令注入[6]漏洞的Java代码为例,对VFG的特性进行阐述。
public static void main(String[] args) throws IOException {
String cmd = "ping -c 3 " + args[0];
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
// other code
}
在上述代码中,用户可以输入一个IP地址作为参数,然后程序会执行一个ping命令,将结果输出到控制台。然而,由于程序没有对用户输入进行任何验证或过滤,攻击者可以通过构造特定的IP地址参数来执行任意系统命令,从而导致命令注入漏洞。为了实现对于该漏洞的扫描,对该段代码构建VFG并进行分析,所得到的模型结果如下图所示。
在VFG中的点代表程序语句,边代表数值的传递关系。通过在VFG中进行搜索,发现args结点表示从外部输入的数据,这里记为source;发现rt.exec(cmd)结点表示执行系统指令,这里记为sink;在图中搜索source到sink之间是否存在可行路径,发现存在路径[args->args[0]->cmd=“ping -c 3 ”+args[0]->rt.exec(cmd)],则可得出结论,该段代码存在命令执行漏洞,这也是静态代码分析过程中漏洞检测的流程。
修复该段代码中的漏洞,修复后的代码如下:
public static void main(String[] args) {
String input = args[0];
if (input.matches("~[a-zA-Z0-9]+$")) {
String cmd = "ping -c 3 " + input;
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(cmd);
//other code
}
}
这里使用了正则表达式来过滤掉任何包含特殊字符的输入,只允许输入字母和数字。如果输入不符合要求,则输出错误信息。这样可以有效地防止命令注入攻击。修复后的VFG如下:
再次通过在VFG中进行搜索,发现args结点表示从外部输入数据,这里记为source;发现rt.exec(cmd)结点表示执行系统指令,这里记为sink;在途中搜索source到sink之间是否存在可行路径,因为执行路径中存在漏洞过滤点matches(^[a-zA-Z0-9]+$),导致漏洞路径中断,则可判定不存在命令执行漏洞。
实施例3
本实施例用于阐述混合软件的构成。
下面描述一个常见的混合软件系统:
1.前端部分:使用Java实现Web接口,用于接收用户输入。可以使用Java Web框架(如Spring、Struts等)实现Web应用程序,通过HTTP协议接收用户请求,将用户请求的参数传递给后端处理模块。
2.后端部分:使用Python实现数据处理模块,接收Java传递的参数,进行数据处理。可以使用Python的科学计算库(如NumPy、SciPy等)实现数据处理的相关算法。
3.系统指令部分:使用C++实现生成的二进制文件,执行相关的系统指令。可以使用C++的系统编程库(如POSIX、Win32等)实现系统指令的调用。
上图既表示软件系统的执行流程,也表示外部数据的传输过程。在编程语言的维度,该系统中包括java、python、C++三种语言;在代码形式的维度上,该系统中包括源代码、库文件和二进制三种类型。该系统中的漏洞整体路径组成也是相对复杂的,在实施例4将举出一个在混合软件系统中的漏洞示例。
实施例4
假设在一个混合软件系统中,Java Web接口接收一个名为“input”的参数,用于指定需要执行的系统指令。那么,如果这个参数没有得到合适的限制,那么就有可能受到命令注入攻击。例如,恶意用户可能会在“input”参数中构造一个包含特殊字符的字符串,以尝试执行其他命令或绕过系统的安全检查。例如,以下是一个恶意的“input”参数:
input=ls; rm -rf /
在这个例子中,恶意用户在“input”参数中使用了分号(;)来分隔两个系统指令:首先是一个正常的“ls”命令,然后是一个危险的“rm -rf /”命令,该命令会删除系统中的所有文件和目录。如果这个参数在python数据处理的过程中没有被有效过滤,并被传递给C++二进制文件,而C++二进制文件也没有对参数进行恰当的处理,那么就有可能受到命令注入攻击,导致系统数据被删除或泄露。
为了进行软件漏洞分析,要先获取代码作为分析对象。这里仍以实施例3中所描述的混合软件系统为例,对于web服务部分,将获取jar文件,进行反汇编生成java代码;对于数据处理部分,将获取python代码文件;对于系统调用部分,将获取二进制文件并进行反汇编、反编译生成类C代码文件。上述代码将作为后续工作的分析目标。
下面将对应具体的代码进行处理。
1.Java代码示例
protected void doPost(HttpServletRequest request,HttpServletResponseresponse){
String input = request.getParameter("input");
try {
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec("python process input.py " + input);
// other code
} catch (IOException e) {
e.printStackTrace();
// other code
}
这段java代码实现实现了一个web接口,会接收外部传入的数据“input”,然后调用python脚本“process_input.py”,并把数据“input”作为参数传入到python脚本中。这段代码在真实环境中,可能是由jar文件反编译而来的;或者由含有源代码的文件提取获得。
2.Python代码示例
def process_input(input_str):
input_str = input str.lower()
p = subprocess.Popen(['./binary', input_str],stdout=subprocess.PIPE)
output,- = p.communicate()
return output.decode( 'utf-8' )
这段python代码中接收外部传入的数据“input_str”,将其所有字母转化为小写,然后调用“Popen”函数启动二进制程序“binary”,并将数据“input_str”作为参数传入。这里为了突出漏洞相关的逻辑,对真实的数据处理流程进行了简化,仅保留了大小写转换。
3.二进制进行反编译、反汇编得到的类C代码
int cdecl main(Int _Argc,char ** Argv,char**Env){
char * Command;
undefined local_48 [44];
int local_1c;
__main();
ZNSt7 cxx1112basic_stringIcSt11char_traitsIcESaIcEEC1Ev(local48);
for (local 1c = 1; local_1c < _Argc; local_1c = local_1c + 1) {
ZNSt7_cxx1112basic_stringIcSt11char-traitsIcESaIcEEpLEPKc(local_48,
Argv[local_1c]);
ZNSt7_cxx1112basic_stringIcst11char_traitsIcESaIcEEpLEPKc(local_48,
6DAT-140004001);
_Command = (char*)
_ZNKSt7_cxx1112basic_stringIcSt11char_traitsIcESaIcEE5c_strEv(local_48);
system(_Command);
_ZNSt7_cxx1112basic_stringIcSt11char_traitsIcESaIcEED1Ev(local_48);
return 0;
}
这段类C代码是通过对二进制程序“bianry”反编译、反汇编获得,其中会接收外部传入的数据“argv”,并通过累加的方式连接到本地变量“_Command”中,然后调用库函数“system”,执行“_Command”中的指令。同样,这里为了突出漏洞相关的逻辑,简化了底层的系统调用操作。
以上三段代码中,模拟了混合软件的整体调用流程,其中也包含了软件漏洞的完整路径。
首先对三段代码进行控制流分析,建立IR模型,然后在IR模型上建立VFG,表示混合软件的数值传递,构建的VFG模型如下:
最后在VFG模型上进行流追踪,分析过程参考实施例2中的相关步骤,定位到的漏洞植入点为“request”,是外部数据的输入点,记为source;定位到漏洞的触发点为“system(_Command)”,是系统调用的执行点,记为sink;继而搜索二者之间的执行路径,发现可行路径[request->…->input_str->…->_Argv->…->system(_Command)],且路径中不包含对于漏洞的过滤点,所以可以判定该混合软件中存在命令执行漏洞。
在这个实施例中,漏洞的整个执行路径贯穿了整个软件系统,从前端的web接口,经过中间的数据处理脚本,最终在二进制代码文件被触发。本文提出的分析方法,通过建立统一的中间表示模型,解决了不同编程语言、不同类型代码之间无法同时进行分析的问题,对混合软件整体构建数据流模型VFG并进行流追踪,实现对于混合软件的漏洞分析。
本发明的另外一个实施例提供一种混合软件漏洞分析系统,包括:
统一中间表示IR获取单元,用于基于混合软件确定统一中间表示IR;
数据流表示模型VFG获取单元,用于基于统一中间表示IR构造数据流表示模型VFG;
漏洞分析单元,用于基于数据流表示模型VFG定位潜在漏洞的植入点和触发点,以及通过流追踪的方式对漏洞进行分析;
混合软件至少包含两种以上的编程语言或者两种以上的代码形式。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的模块及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置和设备的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个模块或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或模块的间接耦合或通信连接,可以是电性,机械或其它的形式。
作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理模块,即可以位于一个地方,或者也可以分布到多个网络模块上。可以根据实际的需要选择其中的部分或者全部模块来实现本发明实施例方案的目的。
另外,在本发明实施例中的各功能模块可以集成在一个处理模块中,也可以是各个模块单独物理存在,也可以两个或两个以上模块集成在一个模块中。
功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例节能信号发送/接收的方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上描述仅为本申请的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本申请中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本申请中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。
应理解,本发明的发明内容及实施例中各步骤的序号的大小并不绝对意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。出于示例和描述的目的,已经给出了本公开实施的前述说明。前述说明并非是穷举性的也并非要将本公开限制到所公开的确切形式,根据上述教导还可能存在各种变形和修改,或者是可能从本公开的实践中得到各种变形和修改。选择和描述这些实施例是为了说明本公开的原理及其实际应用,以使得本领域的技术人员能够以适合于构思的特定用途来以各种实施方式和各种修改而利用本公开。
Claims (6)
1.一种混合软件漏洞分析方法,其特征在于,包括:
基于混合软件确定统一中间表示IR;
基于统一中间表示IR构造数据流表示模型VFG;
基于数据流表示模型VFG定位潜在漏洞的植入点和触发点;
通过流追踪的方式对漏洞进行分析;
所述混合软件至少包含两种以上的编程语言或者两种以上的代码形式;
其中,通过流追踪的方式对漏洞进行分析包括:
在潜在漏洞的植入点和触发点之间进行路径搜索,确定是否存在可行路径;
在存在可行路径时,基于可行路径中存在的中断漏洞的节点,确定漏洞的类型。
2.如权利要求1所述的一种混合软件漏洞分析方法,其特征在于,统一中间表示的IR构建过程包括:
基于被测软件中待分析的代码获得漏洞分析的目标代码集合,所述待分析的代码至少包括源代码、压缩包、库文件或二进制文件;
对目标代码集合进行代码提取,得到至少包含源代码或伪代码的待分析文件集;
基于抽象语法树构建统一中间表示。
3.如权利要求2所述的一种混合软件漏洞分析方法,其特征在于,所述代码提取的操作还包括:
对压缩包、库文件或二进制文件进行包含反编译和/或解压缩,获取源代码和/或伪代码。
4.如权利要求2所述的一种混合软件漏洞分析方法,其特征在于,抽象语法树AST基于对目标代码集合的控制流分析获得。
5.如权利要求1所述的一种混合软件漏洞分析方法,其特征在于,通过流追踪的方式对漏洞进行分析包括:
在潜在漏洞的植入点和触发点之间进行路径搜索,确定是否存在可行路径;
在存在可行路径时,基于可行路径中是否存在完全中断漏洞的节点,确定是否存在漏洞。
6.一种混合软件漏洞分析系统,其特征在于,包括:
统一中间表示IR获取单元,用于基于混合软件确定统一中间表示IR;
数据流表示模型VFG获取单元,用于基于统一中间表示IR构造数据流表示模型VFG;
漏洞分析单元,用于基于数据流表示模型VFG定位潜在漏洞的植入点和触发点,以及通过流追踪的方式对漏洞进行分析;
所述混合软件至少包含两种以上的编程语言或者两种以上的代码形式;
其中,通过流追踪的方式对漏洞进行分析包括:
在潜在漏洞的植入点和触发点之间进行路径搜索,确定是否存在可行路径;
在存在可行路径时,基于可行路径中存在的中断漏洞的节点,确定漏洞的类型。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410047057.0A CN117556431B (zh) | 2024-01-12 | 2024-01-12 | 一种混合软件漏洞分析方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410047057.0A CN117556431B (zh) | 2024-01-12 | 2024-01-12 | 一种混合软件漏洞分析方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN117556431A CN117556431A (zh) | 2024-02-13 |
CN117556431B true CN117556431B (zh) | 2024-06-11 |
Family
ID=89823723
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410047057.0A Active CN117556431B (zh) | 2024-01-12 | 2024-01-12 | 一种混合软件漏洞分析方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN117556431B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN118211220A (zh) * | 2024-03-25 | 2024-06-18 | 中国人民解放军61660部队 | 一种基于污点追踪和约束求解的软件后门检测方法 |
CN118211221A (zh) * | 2024-03-25 | 2024-06-18 | 中国人民解放军61660部队 | 一种基于中间表示的多编程语言软件后门检测方法 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101661543A (zh) * | 2008-08-28 | 2010-03-03 | 西门子(中国)有限公司 | 软件源代码安全漏洞的检测方法及检测装置 |
CN109857641A (zh) * | 2018-12-29 | 2019-06-07 | 北京奇安信科技有限公司 | 对程序源文件进行缺陷检测的方法及装置 |
CN112163218A (zh) * | 2020-08-13 | 2021-01-01 | 中国人民解放军战略支援部队信息工程大学 | 一种基于代码注入的反漏洞挖掘方法及装置 |
CN113468525A (zh) * | 2021-05-24 | 2021-10-01 | 中国科学院信息工程研究所 | 针对二进制程序的相似漏洞检测方法及装置 |
CN114912110A (zh) * | 2022-03-21 | 2022-08-16 | 中国科学院信息工程研究所 | 一种Node.js代码安全检测方法及系统 |
CN114911711A (zh) * | 2022-06-14 | 2022-08-16 | 南方电网科学研究院有限责任公司 | 一种代码缺陷分析方法、装置、电子设备及存储介质 |
CN117349187A (zh) * | 2023-12-05 | 2024-01-05 | 北京北大软件工程股份有限公司 | 一种基于模型持久化的交互式漏洞分析方法和系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9852737B2 (en) * | 2014-05-16 | 2017-12-26 | Qualcomm Incorporated | Coding vectors decomposed from higher-order ambisonics audio signals |
-
2024
- 2024-01-12 CN CN202410047057.0A patent/CN117556431B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101661543A (zh) * | 2008-08-28 | 2010-03-03 | 西门子(中国)有限公司 | 软件源代码安全漏洞的检测方法及检测装置 |
CN109857641A (zh) * | 2018-12-29 | 2019-06-07 | 北京奇安信科技有限公司 | 对程序源文件进行缺陷检测的方法及装置 |
CN112163218A (zh) * | 2020-08-13 | 2021-01-01 | 中国人民解放军战略支援部队信息工程大学 | 一种基于代码注入的反漏洞挖掘方法及装置 |
CN113468525A (zh) * | 2021-05-24 | 2021-10-01 | 中国科学院信息工程研究所 | 针对二进制程序的相似漏洞检测方法及装置 |
CN114912110A (zh) * | 2022-03-21 | 2022-08-16 | 中国科学院信息工程研究所 | 一种Node.js代码安全检测方法及系统 |
CN114911711A (zh) * | 2022-06-14 | 2022-08-16 | 南方电网科学研究院有限责任公司 | 一种代码缺陷分析方法、装置、电子设备及存储介质 |
CN117349187A (zh) * | 2023-12-05 | 2024-01-05 | 北京北大软件工程股份有限公司 | 一种基于模型持久化的交互式漏洞分析方法和系统 |
Also Published As
Publication number | Publication date |
---|---|
CN117556431A (zh) | 2024-02-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN117556431B (zh) | 一种混合软件漏洞分析方法和系统 | |
Martin et al. | Finding application errors and security flaws using PQL: a program query language | |
Lu et al. | Chex: statically vetting android apps for component hijacking vulnerabilities | |
JP4789933B2 (ja) | セキュアーソフトウェアを開発し、テストし、監視するための装置および方法 | |
CN101661543B (zh) | 软件源代码安全漏洞的检测方法及检测装置 | |
Mohammadi et al. | Detecting cross-site scripting vulnerabilities through automated unit testing | |
Liao et al. | SmartDagger: a bytecode-based static analysis approach for detecting cross-contract vulnerability | |
Qin et al. | Nsfuzz: Towards efficient and state-aware network service fuzzing | |
Ďurfina et al. | PsybOt malware: A step-by-step decompilation case study | |
Shcherbakov et al. | Serialdetector: Principled and practical exploration of object injection vulnerabilities for the web | |
Luo et al. | Bleem: Packet sequence oriented fuzzing for protocol implementations | |
Zhang et al. | Ripple: Reflection analysis for android apps in incomplete information environments | |
Pérez et al. | Lapse+ static analysis security software: Vulnerabilities detection in java ee applications | |
Chen et al. | Automatic privacy leakage detection for massive android apps via a novel hybrid approach | |
Kim et al. | Reuse-oriented reverse engineering of functional components from x86 binaries | |
CN115098863A (zh) | 一种基于静态与动态分析的智能合约重入漏洞检测方法 | |
Kim et al. | FIRM-COV: high-coverage greybox fuzzing for IoT firmware via optimized process emulation | |
Jacob et al. | Malware behavioral detection by attribute-automata using abstraction from platform and language | |
Kang et al. | Scaling javascript abstract interpretation to detect and exploit node. js taint-style vulnerability | |
Ablahd | Using python to detect web application vulnerability | |
KR20210045122A (ko) | 기호 실행을 사용하는 소프트웨어 테스트 입력 생성 장치 및 방법 | |
Azad et al. | {AnimateDead}: Debloating web applications using concolic execution | |
Huang et al. | DONAPI: Malicious NPM Packages Detector using Behavior Sequence Knowledge Mapping | |
Costin | Lua code: security overview and practical approaches to static analysis | |
Chen et al. | Efficient Detection of Java Deserialization Gadget Chains via Bottom-up Gadget Search and Dataflow-aided Payload Construction |
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 | ||
GR01 | Patent grant |