CN116595533A - 一种针对Java Web应用的注入型漏洞检测方法及系统 - Google Patents

一种针对Java Web应用的注入型漏洞检测方法及系统 Download PDF

Info

Publication number
CN116595533A
CN116595533A CN202310312434.4A CN202310312434A CN116595533A CN 116595533 A CN116595533 A CN 116595533A CN 202310312434 A CN202310312434 A CN 202310312434A CN 116595533 A CN116595533 A CN 116595533A
Authority
CN
China
Prior art keywords
call
function
class
stain
edge
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.)
Pending
Application number
CN202310312434.4A
Other languages
English (en)
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.)
Institute of Information Engineering of CAS
Original Assignee
Institute of Information Engineering of CAS
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 Institute of Information Engineering of CAS filed Critical Institute of Information Engineering of CAS
Priority to CN202310312434.4A priority Critical patent/CN116595533A/zh
Publication of CN116595533A publication Critical patent/CN116595533A/zh
Pending legal-status Critical Current

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
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

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)
  • Debugging And Monitoring (AREA)

Abstract

本发明公开一种针对Java Web应用的注入型漏洞检测方法及系统,涉及计算机网络安全领域,为提高Java Web应用的安全性对其进行注入型漏洞检测,为安全分析人员和SDLC环节中的测试人员提供漏洞检测服务,本发明通过对注入型漏洞产生原理进行建模,构建了先验知识规则库,来对类方法进行标记。通过广度优先的污点分析算法对Source方法进行分析,构建局部函数调用图,并将函数调用时的污点传播信息存储到该图中。根据图中的污点传播信息进行分支路径的剪枝操作,最后通过深度遍历局部函数调用图来输出注入型漏洞调用链。此方式极大地提高了漏洞分析的效率以及漏洞的检出率。

Description

一种针对Java Web应用的注入型漏洞检测方法及系统
技术领域
本发明涉及计算机网络安全领域,是针对Java Web应用的注入型漏洞检测系统,更具体地,是一种基于代码属性图的注入型漏洞检测方法及系统。
背景技术
随着网络技术的飞速发展,Web应用在社会各个行业都有着广泛的应用,无论是企业业务系统、教育行业的各种应用系统等专业软件,还有如今火爆的短视频平台、外卖平台、网购平台等都使用了Web应用。Java一度被称为是应用最广泛的编程语言,广泛应用于Web应用的服务端编程。JetBrains公司2021年度统计报告指出,在我国,Java语言是使用最广泛的编程语言。在web应用开发方面,Java作为服务端编程语言,由于它跨一次编译随处运行的跨平台特性,更是受到不少开发者的青睐。根据360网络空间测绘引擎的统计数据可知,Java Web应用广泛存在于网络空间中,其中我国共有528,364个网站使用Java进行开发。
随着Web应用广泛使用,越来越多的安全问题也随之出现。Forrester公司的2021年度《应用安全现状报告》指出虽然近年来人们对应用程序的依赖稳步增强,但Web应用始终是最常见的外部攻击对象,其次才是软件程序。同年,开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)公布了最新的OWASP Top 10漏洞名单,该漏洞名单记录了目前应用程序中危害最严重的10个安全漏洞。从2017年至2021年,注入型漏洞一直位于OWASP Top 10的前列。尤此可见,注入型漏洞一直是Web应用程序内存在的严重安全问题。
用户与Web应用之间的信息交互是通过外部应用程序接口(API,ApplicationProgramming Interface)实现的,对应功能的API通过解析用户的输入来执行相应的操作,并将数据返回给用户。如果用户输入的数据未经清理,或者清理不彻底的话,最终会导致恶意数据流向某些敏感函数(例如数据库操作函数、代码执行函数、命令执行函数、文件读取/写入函数等),从而破坏系统的安全性。此类程序缺陷被称为注入型漏洞。常见的注入型漏洞有:SQL注入、命令注入、代码注入、表达式注入、对象注入等。应用中的注入型漏洞往往会造成严重的安全问题,例如2021年12月10日国家互联网应急中心公布的Log4j2远程代码执行漏洞,该漏洞影响了Github上60644个开源项目发布的321094个软件,我国各个行业也受到了波及。
如何发现并解决Web应用中存在的注入型风险是现在安全行业面临的严峻问题。Forrester公司的年度《应用安全现状报告》提出应将安全构建到系统发展生命周期(SDLC,System Development Life Cycle)中,并且将自动化应用安全测试集成到DevOps环节中,以此来在应用上线前发现并解决应用存在的风险问题。因此,本发明期望在深入分析注入型漏洞的产生原理的基础上,提出一个通用的注入型Java Web漏洞检测方法,设计一个面向Java Web应用的注入型漏洞检测框架,为安全分析人员和SDLC环节中的测试人员提供漏洞检测服务,从而保障Web应用的安全性。
发明内容
针对上述问题,本发明提出了一种针对于Java Web应用的注入型漏洞检测方法与系统。本发明利用注入型漏洞的污点传播路径特征,在代码属性图的基础上进行污点分析,检测已知和未知的注入型漏洞。
为达到上述目的,本发明采取的技术方案是:
一种针对Java Web应用的注入型漏洞检测方法,包括以下步骤:
1)对Java Web应用程序包解析为Jimple中间表示形式,提取类对象之间的继承关系和接口实现关系以及类方法之间的别名关系,并对类方法Source、Sink和无关函数进行标记,根据提取的关系和标记的函数构建类关系图;
2)针对类关系图,以Source函数为起始节点进行广度优先的污点分析,根据语句类型、被调用函数的返回值类型、函数类型进行污点传播,并将函数调用间的污点传播信息存储到Call边中;该Call边由调用函数指向被调用函数和与其具有别名关系的函数,并且针对被指向的函数继续进行污点分析,直到分析完全部函数,最终构建出局部函数调用图;
3)污点分析结束后,获取局部函数调用图中所有的Sink节点,并针对Sink节点进行建栈操作,然后基于栈结构进行调用链挖掘;在调用链挖掘过程中,使用Sink节点中记录的初始污点信息以及指向Sink节点的Call边中记录的污点传播信息进行剪枝操作,获得可控的Call边和该Call边中起始节点的污点参数信息;根据起始节点的污点参数信息继续向后追溯,获取指向起始节点的可控Call边,并继续向后追溯,直到追溯到Source节点为止,然后输出挖掘的调用链即注入型漏洞信息。
优选地,步骤1)在对类方法进行标记之前,构建先验知识规则库,其包括Source规则、Sink规则和剪枝规则;根据Source规则标记Source函数,根据Sink规则标记Sink函数,根据剪枝规则标记无关函数。
优选地,步骤1)中提取类对象之间的接口实现关系和继承关系的步骤包括:
获取JavaWeb应用程序内所有的SootClass对象;
解析SootClass对象,获取类的属性信息、父类信息、接口信息并存储到ClassReference类对象中;
根据ClassReference类对象的父类信息、接口信息依次提取继承关系和接口实现关系。
优选地,步骤1)中提取类方法之间的别名关系的步骤包括:通过目标方法签名在父类中递归式搜索同名方法,确定类方法之间的别名关系。
优选地,步骤1)中构建类关系图的步骤包括:
对SootClass对象中存储的所有SootMethod对象逐个提取代码语义信息,将信息存储到MethodReference类对象中,构建ClassReference类对象与MethodReference类对象之间的Has边;
根据提取的继承关系在两个类之间建立Extend边;
根据提取的接口实现关系在两个类对象之间建立Extend边;
根据类方法之间的别名关系,在两个方法之间建立Alias边;
由上述的Has边、Extend边、Alias边构建类关系图。
优选地,步骤1)中在标记完成后,将Source函数存储到WorkList列表中,然后在步骤2)中以WorkList列表中的Source函数为起始节点进行广度优先的污点分析,对Source节点进行数据流分析。
优选地,步骤2)中根据语句类型进行污点传播的步骤包括:
对于代码片段中的语句,首先判断该语句的类型;
如果语句是非调用类型,则直接通过分析表达式运算进行污点传播,记录污点参数的污点来源信息;
如果语句是调用类型,则判断参数中是否存在污点参数,若不存在污点参数,则继续分析下条语句。
优选地,步骤2)中根据被调用函数的返回值类型、函数类型进行污点传播的步骤包括:
对于调用类型的语句,如果参数中存在污点参数且函数不为Sink函数和过滤函数,则根据被调用函数的返回值类型以及函数类型进行污点传播;
如果返回值类型为字符串、类对象、字节数组类型,则引入新污点;
如果返回值为其他类型,则不引入新污点。
优选地,步骤2)中将函数调用间的污点传播信息存储到Call边中的步骤包括:
判断被调用函数是否为无关函数,如果是无关函数则继续分析下一语句;
如果被调用函数不是无关函数且没有作为起始节点存在局部函数调用图的Call边中,则将调用函数与被调用函数和与被调用函数具有别名关系的函数建立Call边。
优选地,步骤3)中建栈操作的步骤包括:
获取指向Sink节点的Call边集合;
对pathStack、callStack、pollutedPositionStack栈结构进行初始化;
将Sink节点压入pathStack栈,将指向Sink节点的Call边集合压入callStack栈,将Sink节点中的初始污点信息压入pollutedPositionStack栈中,完成建栈操作。
优选地,步骤3)中基于栈结构进行调用链挖掘时,根据pathStack栈判断是否完成了当前Sink节点的调用链挖掘,若未完成,则继续进行调用链挖掘,否则继续分析下一个Sink节点。
优选地,步骤3)中基于栈结构进行调用链挖掘时,获取callStack栈中栈顶元素callNodes,如果callNodes为空集,则pathStack、callStack、pollutedPositionStack执行出栈操作,重新进行上步操作,否则继续进行当前Sink节点的调用链挖掘。
优选地,步骤3)中剪枝操作的步骤包括:获取callNodes集合中首个Call边,通过transferPollutedPosition函数根据pollutedPositionStack栈顶元素中存储的污点参数列表,提取出该Call边中起始节点的污点参数列表。
优选地,步骤3)中获取指向起始节点的可控Call边的步骤包括:
判断是否已经遍历到了首个Call边中的起始节点,若已经遍历到,则重新开始分析,否则继续进行调用链挖掘;
获取指向该Call边中起始节点的可控Call边集合,并将污点参数列表压入pollutedPositionStack栈,将该Call边中起始节点压入pathStack栈。
优选地,步骤3)中直到追溯到Source节点为止的步骤包括:判断是否遍历到了Source节点,若已遍历到,则将pathStack栈内存储的路径信息写入结果文件中,并执行出栈操作,重新开始分析;若未遍历到,则继续进行调用链挖掘。
一种针对Java Web应用的注入型漏洞检测系统,包括:
一类关系提取模块,用于对Java Web应用程序包解析为Jimple中间表示形式,提取类对象之间的继承关系和接口实现关系以及类方法之间的别名关系,并对类方法Source、Sink和无关函数进行标记,根据提取的关系和标记的函数构建类关系图;
一污点分析模块,用于针对类关系图,以Source函数为起始节点进行广度优先的污点分析,根据语句类型、被调用函数的返回值类型、函数类型进行污点传播,并将函数调用间的污点传播信息存储到Call边中;该Call边由调用函数指向被调用函数和与其具有别名关系的函数,并且针对被指向的函数继续进行污点分析,直到分析完全部函数,最终构建出局部函数调用图;
一调用链挖掘模块,用于在污点分析结束后,获取局部函数调用图中所有的Sink节点,并针对Sink节点进行建栈操作,然后基于栈结构进行调用链挖掘;在调用链挖掘过程中,使用Sink节点中记录的初始污点信息以及指向Sink节点的Call边中记录的污点传播信息进行剪枝操作,获得可控的Call边和该Call边中起始节点的污点参数信息;根据起始节点的污点参数信息继续向后追溯,获取指向起始节点的可控Call边,并继续向后追溯,直到追溯到Source节点为止,然后输出挖掘的调用链即注入型漏洞信息。
与现有的漏洞检测系统相比,本发明具有以下几点优势:
1、在前人对于代码属性图技术的研究基础上,优化了代码属性图构建方法,构建类关系图解决了Java多态的分析问题,利用污点分析算法构建局部函数调用图,表示污点数据在应用内部的可能流向,提高了漏洞的分析效率。
2、设计广度优先的污点分析算法,解决了路径深度爆炸的问题,并实现了多线程同步分析,提高了分析效率。
3、设计可扩展的漏洞检测规则库,支持分析更多种开发框架以及检测更多种注入型漏洞,用户可根据经验定制检测规则使得检测具有较高的准确率。
4、结合可控性分析技术利用利用函数调用间的污点传播信息对分支路径进行剪枝,这样更有利于针对于大规模Java Web应用的分析,进一步提升了结果的正确率和分析效率。
本发明的目的是为提高Java Web应用的安全性对其进行注入型漏洞检测,为安全分析人员和SDLC环节中的测试人员提供漏洞检测服务,保护企业的数据与财产安全。本发明的有意效果在于:通过对注入型漏洞产生原理进行建模,构建了先验知识规则库,来对类方法进行标记。通过广度优先的污点分析算法对Source方法进行分析,构建局部函数调用图,并将函数调用时的污点传播信息存储到该图中。根据图中的污点传播信息进行分支路径的剪枝操作,最后通过深度遍历局部函数调用图来输出注入型漏洞调用链。此方式极大地提高了漏洞分析的效率以及漏洞的检出率。
附图说明
图1是本发明一实施例中一种针对Java Web应用的注入型漏洞检测系统构成示意图。
图2是本发明一实施例中类关系模块分析流程图。
图3是本发明一实施例中污点分析模块分析流程图。
图4是实施例中调用链挖掘模块分析流程图。
图5是本发明中采用的代码属性图结构图。
图6是本发明中采用的可控性分析技术剪枝流程示意图。
具体实施方式
为了使本技术领域的人员更好地理解本发明实施例中的技术方案,并使本发明的目的、特征和优点能够更加明显易懂,下面结合附图和事例对本发明中技术核心作进一步详细的说明。
本实施提出一种针对Java Web应用的注入型漏洞检测方法,包括以下步骤:
1)利用静态分析框架Soot将输入的Java应用包解析为Jimple中间表示形式,Jimple是一种由Soot框架使用的Java字节码的中间表示形式。在将Java字节码转换为Jimple之后,程序分析工具可以更容易地分析Java程序的结构和行为。具体地,Jimple是一种类似于三地址代码的形式,每个语句只包含一个操作和两个操作数。这种简单的形式使得分析器更容易理解Java程序的结构和语义,并且可以更容易地对程序进行优化。
然后根据Java的语言特性,提取出类对象之间的继承关系和接口实现关系,以及类方法之间的别名关系,最终构建出类关系图;其中在Java中,类方法之间的别名关系指的是父类和多个子类方法共享相同的方法签名,这种别名关系也称为方法重写。当多个子类实现了父类中的某一方法,在运行时Java编译器会根据具体的对象类型来区分这些方法。在调用这些方法时,编译器会根据具体的对象类型来选择调用哪一个方法。因此,方法重写提供了一种简单而灵活的方式,导致能够使用相同的方法名称,使得代码更加简洁、易于阅读和维护。
在构建类关系图时,根据先验知识规则库中的规则集对特定的类方法进行标记,将Source方法存储到WorkList列表中。本方法根据注入型漏洞的产生原理以及目前主流Java Web框架的开发模式,归纳总结构建先验知识规则库,该先验知识规则库包括Source规则、Sink规则、剪枝规则等规则集。
2)以WorkList列表中的Source为起始节点进行广度优先的污点分析,在处理函数调用语句时会根据函数返回值进行污点传播,并将函数调用间的污点传播信息存储到Call边中;该Call边由调用函数指向被调用函数和与其具有别名关系的函数,并且被指向的函数也会被添加到WorkList列表中继续进行污点分析,直到WorkList列表为空,最终构建出局部函数调用图。
3)污点分析结束后,需要在局部函数调用图的基础上进行漏洞调用链挖掘;首先获取所有的Sink方法,然后利用Sink方法中记录的初始污点信息以及指向Sink方法的Call边中记录的污点传播信息进行剪枝操作,选取可控的Call边,并提取出Call边中起始节点的污点参数信息。随后根据起始节点的污点参数信息继续向后追溯,选取出指向起始节点的可控Call边;根据起始节点的污点参数信息继续向后追溯,直到追溯到Source方法为止,然后输出路径信息中存储的漏洞调用链。
为实现上述方法,本实施例提出一种针对Java Web应用的注入型漏洞检测系统,能够有效解决注入型Java Web漏洞检测困难的问题。图1所示为该系统的模块构成示意图,该系统分为三个模块,分别是类关系提取模块、污点分析模块和调用链挖掘模块。其中,类关系提取模块的主要功能为提取Java Web应用程序中类对象和类方法的代码语义信息,然后在代码语义信息的基础上构建类关系图为后续的污点分析模块提供必需的分析数据。污点分析模块实现了广度优先的污点分析算法,首先对WorkList列表中分析方法进行污点分析,通过污点分析技术追溯出污点数据在函数调用间的传播过程,然后将被调用函数添加到待分析的WorkList列表。WorkList列表为空时标志着污点分析结束,最终构建完成局部函数调用图。该图表示着污点数据在应用程序中的传播路径,存储着函数调用间的污点传播信息,用于后续的调用链挖掘模块进行后续的分析。调用链挖掘模块的主要功能为挖掘局部函数调用图内存在的注入型漏洞调用链,通过多重栈结构实现了对局部函数调用图的深度优先遍历,并结合可控性分析思想利用函数调用间的污点传播信息对分支路径进行剪枝,最后将检索出的注入型漏洞调用链存储到结果文件中。
如图2所示,类关系提取模块的具体处理流程包括以下步骤:
步骤110,本模块需要对应用程序内所有的SootClass对象进行逐一分析。在获取程序中某一类对象的SootClass对象后,本模块会首先调用对应的接口获取类内的属性信息、父类信息、接口信息并将其存储到ClassReference类对象中。然后本模块会对SootClass对象中存储的所有SootMethod对象逐个提取代码语义信息,将信息存储到MethodReference类对象中,并根据先验知识规则库中的规则集对方法进行类型标记。最后构建ClassReference类对象与MethodReference类对象之间的Has边。
步骤120,本模块需要对第一部分所构建的ClassReference类对象进行逐一分析。在获取ClassReference类对象后,本模块会首先根据类对象中存储的父类信息找到对应的ClassReference类对象,提取继承关系并在两个类之间建立Extend边。然后本模块会根据类对象中存储的接口信息找到对应的ClassReference类对象,提取接口实现关系并在两个类对象之间建立Extend边。最后本模块会根据Java语言的多态特性,通过目标方法签名在父类中递归式搜索同名方法,提取别名关系,然后对两个方法建立Alias边。其中,通过目标方法签名在父类中递归式搜索同名方法是确定类方法之间的别名关系的一种方法,该方法即为方法重写解析,即获取父类中某方法的所有子类实现。在程序开发中进行方法重写解析时,Java编译器会根据目标方法签名,沿着类继承层次结构向下查找,找到具有相同方法名称和参数列表的合适的子类方法。如果找到了这样的方法,则会调用该方法。这种方法重写解析的行为是由Java语言规范定义的,它保证了在不同的上下文中可使用相同的方法名称和参数列表,编译器能够正确地选择最合适的方法。
如图3所示,污点分析模块的具体处理流程包括以下步骤:
步骤210,该模块的输入为由Source函数组成的初始WorkList列表,在进行数据流分析之前,首先从WorkList中获取待分析的方法即Source函数,然后对该方法进行数据流分析。
步骤220,在数据流分析过程中处理代码片段中某行语句时,首先判断该语句的类型,如果是非调用类型则直接通过分析表达式运算进行污点传播,记录污点参数的污点来源信息。如果为调用类型,则判断参数中是否存在污点参数,若不存在污点参数则继续分析下条语句。
步骤230,如果参数中存在污点参数且函数不为Sink函数和过滤函数,则根据被调用函数的返回值类型以及函数类型进行污点传播,如果返回值类型为字符串、类对象、字节数组等类型,则引入新污点,如果返回值为其他类型则不引入新污点。然后继续判断被调用函数是否为无关函数,如果为无关函数则继续分析下一语句。如果不是无关函数且没有作为起始节点存在局部函数调用图的Call边中,则将调用函数与被调用函数和与被调用函数具有别名关系的函数建立Call边,并加入到局部函数调用图中,最后将被调用函数以及与被调用函数具有别名关系的函数添加到待处理的WorkList中。
如图4所示,调用链挖掘模块的具体处理流程包括以下步骤:
步骤310,首先获取局部函数调用图中所有Sink节点构成的集合,然后对集合中的Sink节点进行遍历分析。
步骤320,针对某一Sink节点进行调用链挖掘时,首先获取指向该Sink节点的Call边集合,然后对pathStack、callStack、pollutedPositionStack等栈结构进行初始化。随后将Sink节点压入pathStack栈,将指向该Sink节点的Call边集合压入callStack栈,将Sink节点中的初始污点信息压入pollutedPositionStack栈中,完成首次建栈操作。
步骤330,判断pathStack栈是否为空集,若为空集,则标志着此Sink节点的调用链挖掘过程结束,继续分析下一个Sink节点。若不为空集则进行调用链挖掘。
步骤340,首先获取callStack栈中栈顶元素,用callNodes表示。然后判断callNodes是否为空集,若为空集则三个栈结构进行出栈操作,然后重新从步骤330开始分析。若不为空集,则继续进行该Sink节点的调用链挖掘。
步骤350,首先获取callNodes集合中首个Call边,然后通过transferPollutedPosition函数根据pollutedPositionStack栈顶元素中存储的污点参数列表进行剪枝操作,提取出该Call边中起始节点的污点参数列表pp;该剪枝操作通过污点参数列表的判断,将不符合条件的路径从调用链中删除,从而减少调用链的长度,提高挖掘效率和准确率。
步骤360,判断pathStack栈中是否包含该Call边中的起始节点,若包含则删除callNodes集合中首个Call边,callStack栈执行出栈,再将callNodes重新入栈,更新callStack栈栈顶元素,然后重新从步骤330开始分析。若不包含则继续进行该Sink节点的调用链挖掘。
步骤370,首先通过getCallsByPollutedPosition函数根据污点参数列表pp获取指向该Call边中起始节点的可控Call边集合。然后将污点参数列表pp压入pollutedPositionStack栈,将该Call边中起始节点压入pathStack栈。随后移除callNodes集合中首个Call边,更新callStack栈顶元素,并将可控Call边集合压入callStack栈。
步骤380,最后判断pathStack栈顶元素是否为Source节点,若不为Source节点,则重新从步骤3开始分析。若为Source节点,则将pathStack栈内存储的路径信息写入结果文件中,然后执行三个栈结构的出栈操作,随后继续从步骤330开始分析。
如图5所示,本发明采用的代码属性图结构由类节点与方法节点构成,包括类关系图与局部函数调用图。其中类关系图用于表示类节点之间的继承关系和接口实现关系(Extend边)、类节点与方法节点之间的所属关系(Has边)、方法节点之间的别名关系(Alias边),局部函数调用图用于表示污点数据在方法节点之间的传播路径(Call边)。
如图6所示,可控性分析技术通过Call边中记录的污点传播信息对分支路径进行剪枝,首先需要对关键内容进行定义:
为了实现分支路径的剪枝操作,首先要清晰的界定函数调用时的可控参数位置,其中Obj、arg1、arg2等参数均可能为可控参数:
Obj.Func(arg1,arg2)(3-1)
接下来定义Call边中记录的污点传播信息列表P,该结构表示函数调用时被调用函数中污点参数的来源信息,以上述公式3-1为例,可以获得以下所示的污点传播信息列表:
[0,-2,0](3-2)
该污点传播信息列表P具有以下两层含义:
a)列表内元素表示的含义:表示对应位置的参数是否可控;若可控的话,该参数受调用函数的哪个参数影响。
b)列表下标表示的含义:标识对应的函数参数,P[0]表示Obj,P[1]表示arg1,P[2]表示arg2。
最后定义列表内数字表示的可控性信息:
-2:表示当前位置对应的参数不可控
-1-n:表示当前位置对应参数的污点来源信息,该参数受调用函数的污点传播信息列表P2[n+1]处参数影响。
若进行污点传播时,表达式的右值存在多个污点参数,会选取所有污点参数的污点来源信息,将其存储到一维数组中传播给左值的污点参数。最终的污点传播信息列表如如公式3-3所示,为一个二维数组。
[0],[-2],[0,1](3-3)
可控性分析技术剪枝流程如图6所示,Sink的初始污点信息为[0],根据污点传播信息列表的定义从MethodB指向Sink的Call边的污点信息列表[-2,0]中提取出MethodB对应的污点参数列表[0],该污点参数列表代表着指向该函数的Call边中所记录的污点传播信息列表中P[1]位置处的参数应为可控的。然后根据该列表记录的污点来源筛选指向MethodB的Call边,只要Call边的污点信息列表P[1]不为-2,即可将该Call边加入路径中,例如图中所示MethodA指向MethodB的Call边。
本发明中,Source函数、Sink函数亦可称为Source方法、Sink方法,在图中则为Source节点、Sink节点
最后所应说明的是,以上实施案例仅用以说明本发明的技术方案而非限制,尽管使用事例对本发明进行了详细说明,本领域的普通技术人员应当理解,可对本发明的技术方案进行修改或者等价替换,而不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求范围当中。

Claims (10)

1.一种针对Java Web应用的注入型漏洞检测方法,其特征在于,包括以下步骤:
1)对Java Web应用程序包解析为Jimple中间表示形式,提取类对象之间的继承关系和接口实现关系以及类方法之间的别名关系,并对类方法Source、Sink和无关函数进行标记,根据提取的关系和标记的函数构建类关系图;
2)针对类关系图,以Source函数为起始节点进行广度优先的污点分析,根据语句类型、被调用函数的返回值类型、函数类型进行污点传播,并将函数调用间的污点传播信息存储到Call边中;该Call边由调用函数指向被调用函数和与其具有别名关系的函数,并且针对被指向的函数继续进行污点分析,直到分析完全部函数,最终构建出局部函数调用图;
3)污点分析结束后,获取局部函数调用图中所有的Sink节点,并针对Sink节点进行建栈操作,然后基于栈结构进行调用链挖掘;在调用链挖掘过程中,使用Sink节点中记录的初始污点信息以及指向Sink节点的Call边中记录的污点传播信息进行剪枝操作,获得可控的Call边和该Call边中起始节点的污点参数信息;根据起始节点的污点参数信息继续向后追溯,获取指向起始节点的可控Call边,并继续向后追溯,直到追溯到Source节点为止,然后输出挖掘的调用链即注入型漏洞信息。
2.如权利要求1所述的方法,其特征在于,步骤1)在对类方法进行标记之前,构建先验知识规则库,其包括Source规则、Sink规则和剪枝规则;根据Source规则标记Source函数,根据Sink规则标记Sink函数,根据剪枝规则标记无关函数。
3.如权利要求1所述的方法,其特征在于,步骤1)中,
提取类对象之间的接口实现关系和继承关系的步骤包括:
获取JavaWeb应用程序内所有的SootClass对象;
解析SootClass对象,获取类的属性信息、父类信息、接口信息并存储到ClassReference类对象中;
根据ClassReference类对象的父类信息、接口信息依次提取继承关系和接口实现关系;和/或
提取类方法之间的别名关系的步骤包括:
通过目标方法签名在父类中递归式搜索同名方法,确定类方法之间的别名关系。
4.如权利要求3所述的方法,其特征在于,步骤1)中构建类关系图的步骤包括:
对SootClass对象中存储的所有SootMethod对象逐个提取代码语义信息,将信息存储到MethodReference类对象中,构建ClassReference类对象与MethodReference类对象之间的Has边;
根据提取的继承关系在两个类之间建立Extend边;
根据提取的接口实现关系在两个类对象之间建立Extend边;
根据类方法之间的别名关系,在两个方法之间建立Alias边;
由上述的Has边、Extend边、Alias边构建类关系图。
5.如权利要求1所述的方法,其特征在于,步骤1)中在标记完成后,将Source函数存储到WorkList列表中,然后在步骤2)中以WorkList列表中的Source函数为起始节点进行广度优先的污点分析,对Source节点进行数据流分析。
6.如权利要求1所述的方法,其特征在于,步骤2)中根据语句类型进行污点传播的步骤包括:
对于代码片段中的语句,首先判断该语句的类型;
如果语句是非调用类型,则直接通过分析表达式运算进行污点传播,记录污点参数的污点来源信息;
如果语句是调用类型,则判断参数中是否存在污点参数,若不存在污点参数,则继续分析下条语句。
7.如权利要求6所述的方法,其特征在于,步骤2)中,
根据被调用函数的返回值类型、函数类型进行污点传播的步骤包括:
对于调用类型的语句,如果参数中存在污点参数且函数不为Sink函数和过滤函数,则根据被调用函数的返回值类型以及函数类型进行污点传播;
如果返回值类型为字符串、类对象、字节数组类型,则引入新污点;
如果返回值为其他类型,则不引入新污点;和/或
将函数调用间的污点传播信息存储到Call边中的步骤包括:
判断被调用函数是否为无关函数,如果是无关函数则继续分析下一语句;
如果被调用函数不是无关函数且没有作为起始节点存在局部函数调用图的Call边中,则将调用函数与被调用函数和与被调用函数具有别名关系的函数建立Call边。
8.如权利要求1所述的方法,其特征在于,步骤3)中建栈操作的步骤包括:
获取指向Sink节点的Call边集合;
对pathStack、callStack、pollutedPositionStack栈结构进行初始化;
将Sink节点压入pathStack栈,将指向Sink节点的Call边集合压入callStack栈,将Sink节点中的初始污点信息压入pollutedPositionStack栈中,完成建栈操作。
9.如权利要求8所述的方法,其特征在于,步骤3)中,
基于栈结构进行调用链挖掘时,根据pathStack栈判断是否完成了当前Sink节点的调用链挖掘,若未完成,则继续进行调用链挖掘,否则继续分析下一个Sink节点;和/或
基于栈结构进行调用链挖掘时,获取callStack栈中栈顶元素callNodes,如果callNodes为空集,则pathStack、callStack、pollutedPositionStack执行出栈操作,重新进行上步操作,否则继续进行当前Sink节点的调用链挖掘;和/或
剪枝操作的步骤包括:获取callNodes集合中首个Call边,通过transferPollutedPosition函数根据pollutedPositionStack栈顶元素中存储的污点参数列表,提取出该Call边中起始节点的污点参数列表;和/或
获取指向起始节点的可控Call边的步骤包括:
判断是否已经遍历到了首个Call边中的起始节点,若已经遍历到,则重新开始分析,否则继续进行调用链挖掘;
获取指向该Call边中起始节点的可控Call边集合,并将污点参数列表压入pollutedPositionStack栈,将该Call边中起始节点压入pathStack栈;和/或
直到追溯到Source节点为止的步骤包括:判断是否遍历到了Source节点,若已遍历到,则将pathStack栈内存储的路径信息写入结果文件中,并执行出栈操作,重新开始分析;若未遍历到,则继续进行调用链挖掘。
10.一种针对Java Web应用的注入型漏洞检测系统,其特征在于,包括:
一类关系提取模块,用于对Java Web应用程序包解析为Jimple中间表示形式,提取类对象之间的继承关系和接口实现关系以及类方法之间的别名关系,并对类方法Source、Sink和无关函数进行标记,根据提取的关系和标记的函数构建类关系图;
一污点分析模块,用于针对类关系图,以Source函数为起始节点进行广度优先的污点分析,根据语句类型、被调用函数的返回值类型、函数类型进行污点传播,并将函数调用间的污点传播信息存储到Call边中;该Call边由调用函数指向被调用函数和与其具有别名关系的函数,并且针对被指向的函数继续进行污点分析,直到分析完全部函数,最终构建出局部函数调用图;
一调用链挖掘模块,用于在污点分析结束后,获取局部函数调用图中所有的Sink节点,并针对Sink节点进行建栈操作,然后基于栈结构进行调用链挖掘;在调用链挖掘过程中,使用Sink节点中记录的初始污点信息以及指向Sink节点的Call边中记录的污点传播信息进行剪枝操作,获得可控的Call边和该Call边中起始节点的污点参数信息;根据起始节点的污点参数信息继续向后追溯,获取指向起始节点的可控Call边,并继续向后追溯,直到追溯到Source节点为止,然后输出挖掘的调用链即注入型漏洞信息。
CN202310312434.4A 2023-03-28 2023-03-28 一种针对Java Web应用的注入型漏洞检测方法及系统 Pending CN116595533A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310312434.4A CN116595533A (zh) 2023-03-28 2023-03-28 一种针对Java Web应用的注入型漏洞检测方法及系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310312434.4A CN116595533A (zh) 2023-03-28 2023-03-28 一种针对Java Web应用的注入型漏洞检测方法及系统

Publications (1)

Publication Number Publication Date
CN116595533A true CN116595533A (zh) 2023-08-15

Family

ID=87594406

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310312434.4A Pending CN116595533A (zh) 2023-03-28 2023-03-28 一种针对Java Web应用的注入型漏洞检测方法及系统

Country Status (1)

Country Link
CN (1) CN116595533A (zh)

Similar Documents

Publication Publication Date Title
CN112100054B (zh) 一种面向数据管控的程序静态分析方法和系统
CN110737899B (zh) 一种基于机器学习的智能合约安全漏洞检测方法
Bernardi et al. Design pattern detection using a DSL‐driven graph matching approach
CN113360915B (zh) 基于源代码图表示学习的智能合约多漏洞检测方法及系统
JP5042315B2 (ja) ソースコード内のセキュリティ脆弱性の検出
JP4693044B2 (ja) ソースコード脆弱性検査装置
US8589888B2 (en) Demand-driven analysis of pointers for software program analysis and debugging
CN104636256A (zh) 一种内存访问异常的检测方法及装置
CN111400719A (zh) 基于开源组件版本识别的固件脆弱性判别方法及系统
CN113139192B (zh) 基于知识图谱的第三方库安全风险分析方法及系统
CN110059006B (zh) 代码审计方法及装置
CN106295346B (zh) 一种应用漏洞检测方法、装置及计算设备
CN112256271B (zh) 一种基于静态分析的区块链智能合约安全检测系统
CN107193742B (zh) 一种基于状态的路径敏感的符号化函数摘要算法
CN113254945A (zh) 基于污点分析的web漏洞静态检测方法、系统和介质
US8898649B2 (en) Application program analysis method, analysis system and recording medium for identifying a contributing factor for an invalid operation of an application program
CN115270131A (zh) 一种Java反序列化漏洞检测方法及系统
CN115022026A (zh) 一种区块链智能合约威胁检测装置及方法
CN111881300A (zh) 面向第三方库依赖的知识图谱构建方法及系统
CN114911711A (zh) 一种代码缺陷分析方法、装置、电子设备及存储介质
CN110162474B (zh) 一种基于抽象语法树的智能合约重入漏洞检测方法
CN115357898A (zh) 一种java组件的依赖分析方法、装置及介质
Rahimian et al. RESource: a framework for online matching of assembly with open source code
CN113204593A (zh) 一种基于大数据计算引擎的etl作业开发系统和计算机设备
CN116305131B (zh) 脚本静态去混淆方法及系统

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