CN116167058A - 一种基于代码疫苗的运行时漏洞分析方法及装置 - Google Patents
一种基于代码疫苗的运行时漏洞分析方法及装置 Download PDFInfo
- Publication number
- CN116167058A CN116167058A CN202310440050.0A CN202310440050A CN116167058A CN 116167058 A CN116167058 A CN 116167058A CN 202310440050 A CN202310440050 A CN 202310440050A CN 116167058 A CN116167058 A CN 116167058A
- Authority
- CN
- China
- Prior art keywords
- propagation
- function
- stain
- event
- source
- 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.)
- Granted
Links
Images
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
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy 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
本申请提供一种基于代码疫苗的运行时漏洞分析方法及装置,包括:解析请求信息,对所述请求参数进行污点源标记和污点传播标记;监控操作函数,判断是否为污点源事件;若是,则创建污点源事件结构体,并去除操作函数的返回值的污点源标记;监控传播函数,判断是否为污点传播事件;若是,则创建污点传播事件结构体,并对传播函数的返回值进行污点传播标记;监控风险函数,判断是否为污点汇聚事件;若是,则创建污点汇聚事件结构体;根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。实施该方法能够通过污点传播链路溯源解决漏洞修复的如何定位代码问题和漏洞成因分析的追踪污点传播问题。
Description
技术领域
本申请涉及代码安全领域,具体而言,涉及一种基于代码疫苗的运行时漏洞分析方法及装置。
背景技术
现有漏洞挖掘技术主要分为两类。一类为黑盒测试,将整个软件***作为一个黑盒子对待,用户从黑盒的一端提供数据输入,另一端产生输出结果,通过观察软件***是否出现异常或者发生崩溃来确定是否存在软件漏洞。但其对程序内部结构不了解,导致无法覆盖所有的代码执行路径。同时在测试过程中会产生大量脏数据、脏操作,且在数据包加密、带签名等场景下无法构造数据包,导致黑盒测试无法使用。第二类为白盒测试,通过对软件源代码进行代码审计的方式来寻找软件漏洞。但其需要对应用程序的源代码进行深度分析,消耗的时间成本高,且由于该技术分析的是模拟程序运行时的数据,导致其漏洞误报率较高。而且在win32下的绝大多数软件是不开源的,这限制了白盒测试的使用。
相关技术中,代码安全解决方案是基于语法规则将接收到的连接请求添加污染标志位;根据污染保持函数传递污染标志位;通过污染风险函数判断处理结果是否存在污染数据,实现在动态过程中进行漏洞检测。但是上述方案仅仅能提供漏洞检测的告警结果,无法对漏洞告警提供准确的漏洞源代码位置定位,更加无法对传播路径进行溯源和污染源的有效确定,不便于告警后的漏洞处置,如漏洞代码修复和漏洞成因分析。
代码疫苗技术是通过像疫苗一样将代码安全能力注入到应用服务器内部,在内部清晰看到解析后的流量,感知应用运行过程的情境上下文。能实现运行时诊断应用自身存在的漏洞位置和缺陷成因,基于此能实现自主检测和响应,积极防御外部危险。
发明内容
有鉴于此,本申请实施例的目的在于提供一种基于代码疫苗的运行时漏洞分析方法及装置,可以为漏洞告警时提供准确的漏洞源代码位置定位,同时对传播路径进行有效溯源和污染源的有效确定,便于告警后的漏洞代码修复和漏洞成因分析。
本申请实施例第一方面提供了一种基于代码疫苗的运行时漏洞分析方法,包括:
解析请求信息,所述请求信息包括:请求参数、url和请求方法;
对所述请求参数进行污点源标记和污点传播标记;
监控opcode对应的操作函数,判断是否为污点源事件;若是,则创建污点源事件结构体,并去除操作函数的返回值的污点源标记;
监控传播函数,判断是否为污点传播事件;若是,则创建污点传播事件结构体,并对传播函数的返回值进行污点传播标记;
监控opcode对应的风险函数,判断是否为污点汇聚事件;若是,则创建污点汇聚事件结构体;
根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。
在上述实现过程中,该基于代码疫苗的运行时漏洞分析方法。通过解析请求信息,对请求参数进行污染源标记和污染传播标记,再通过运行时监控opcode对应的操作函数,判断污点源事件及创建污点源事件结构体,并去除操作函数的返回值的污点源标记;监控传播函数,判断污点传播事件及创建污点传播事件结构体,并对传播函数的返回值进行污点传播标记;监控opcode对应的风险函数,判断污点汇聚事件及创建污点汇聚事件结构体。最后根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。从而,该方法除了常规的污点传播标记,还进行污点源标记,用于区别不同污点源,便于污点回溯。具体是通过标记污点源信息,由于污点传播过程中最开始的来源不同,通过污点源标记回溯参数来确定来源。通过双重标记,相对于现有的漏洞检测方案,除了可以进行漏洞判定,还可以快速定位漏洞源代码位置。另外,通过污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建的污点传播链路,回溯整个污点传播过程,进而便于分析漏洞产生的原因。
可选地,所述解析请求信息之前,包括:在php扩展的模块初始化阶段对zend引擎的opcode预插桩第一探针,对php内部函数预插桩第二探针。
可选地,所述解析请求信息包括:将所述请求信息存放到第一zval结构体的预定义变量数组中,在php扩展的请求初始化阶段通过所述第一探针解析存放在php全局变量数组中的请求信息,得到请求参数、url和请求方法。
可选地,所述对所述请求参数进行污点源标记和污点传播标记包括:对所述预定义变量数组中的string类型进行污点源标记和污点传播标记。
在上述实现过程中,基于php开发中使用请求参数通常通过预定义变量数组获取array、object类型之间的操作,不会影响字符串的污点标记位。因此污点源标记和污点传播标记就是对这些数组中的所有string类型进行标记,后续只需要针对string类型进行污点传播分析,保证污点传播的有效性,提高传播路径的溯源效率。
可选地,所述请求参数进行污点源标记和污点传播标记之后,包括:将所述请求参数的第一zval结构体地址和请求参数的信息保存到污点传播表中,所述请求参数的信息包括请求参数的类型和请求参数的名称;
所述创建污点源事件结构体之后,包括:将所述操作函数的返回值的第二zval结构体地址和对应的所述污点源事件结构体保存到污点传播表中;
所述创建污点传播事件结构体之后,包括:将所述传播函数的返回值的第三zval结构体地址和对应的所述污点传播事件结构体保存到污点传播表中;
所述污点汇聚事件结构体包括:将所述风险函数的参数的第四zval结构体地址和对应的所述污点汇聚事件结构体保存到污点传播表中。
可选地,所述监控opcode对应的操作函数,判断是否为污点源事件包括:通过所述第一探针监控opcode对应的操作函数,获取操作函数的参数和返回值,判断所述操作函数的返回值是否为string类型,且是否存在污点源标记。
可选地,所述监控传播函数,判断是否为污点传播事件包括:通过所述第一探针或第二探针监控传播函数,获取传播函数的参数和返回值,判断传播函数的参数是否为string类型,且是否存在污点传播标记。
可选地,所述通过所述第一探针或第二探针监控传播函数包括:通过所述第一探针监控opcode对应的操作函数,所述操作函数包括用于字符串连接的第一传播函数;或,通过所述第二探针监控php内部函数,所述php内部函数包括用于字符串操作的第二传播函数;
可选地,所述监控opcode对应的风险函数,判断是否为污点汇聚事件包括:通过所述第一探针监控opcode对应的风险函数,获取风险函数的参数,判断风险函数的参数是否为string类型,且是否存在污点传播标记。
可选地,所述污点源事件结构体包括:污点源参数信息、污点事件类型、调用栈信息、操作函数名称、操作函数参数、操作函数返回值和堆栈跟踪信息;获取所述污点源参数信息包括:通过操作函数的参数查询所述污点传播表中对应的请求参数,将对应的请求参数的类型作为污点源参数的类型,将对应的请求参数的名称作为污点源参数的名称。
可选地,所述污点传播事件结构体包括:污点事件类型、调用栈信息、传播函数名称、传播函数参数、传播函数返回值、堆栈跟踪信息和传播父事件信息;获取所述传播父事件信息包括:通过传播函数的参数查询所述污点传播表中对应的操作函数的返回值,再通过所述操作函数的返回值获取对应的第二zval结构体地址及对应的污点源事件结构体。
可选地,所述污点汇聚事件结构体包括:污点事件类型、调用栈信息、风险函数名称、风险函数参数、风险函数返回值、堆栈跟踪信息和汇聚父事件信息;获取所述汇聚父事件信息包括:通过风险函数的参数查询所述污点传播表中对应的传播函数的返回值,再通过传播函数的返回值获取对应的第三zval结构体地址及对应的污点传播事件结构体。
可选地,所述根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路包括:查询并获取风险函数的参数在所述污点传播表中对应的污点汇聚事件结构体;通过获取到的污点汇聚事件结构体中的汇聚父事件信息在所述污点传播表中查询并获取对应的污点传播事件结构体;再通过获取到的污点传播事件结构体中的传播父事件信息在所述污点传播表查询并获取对应的污点源事件结构体;将依次查询并获取到的污点源事件结构体中的污点源参数信息、调用栈信息、操作函数名称、操作函数的参数、操作函数的返回值及堆栈跟踪信息,以及污点传播事件结构体中的调用栈信息、传播函数名称、传播函数的参数、传播函数的返回值及堆栈跟踪信息,以及污点汇聚事件结构体中的调用栈信息、风险函数名称、风险函数的参数、风险函数的返回值及堆栈跟踪信息,依次连接生成污点传播链路。
可选的,所述堆栈跟踪信息包括:当前调用栈的第一行。
本申请实施例第二方面提供了一种基于代码疫苗的运行时漏洞分析装置,包括:
解析模块,用于解析请求信息,所述请求信息包括:请求参数、url和请求方法;
标记模块,用于对所述请求参数进行污点源标记和污点传播标记,还用于判断为污点源事件后,去除操作函数的返回值的污点源标记,还用于判断为污点传播事件后,对传播函数的返回值进行污点传播标记;
第一监控模块,用于监控opcode对应的操作函数,判断是否为污点源事件;若是,则创建污点源事件结构体;
第二监控模块,用于监控传播函数,判断是否为污点传播事件;若是,则创建污点传播事件结构体;
第三监控模块,用于监控opcode对应的风险函数,判断是否为污点汇聚事件;若是,则创建污点汇聚事件结构体;
构建模块,用于根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。
本申请实施例第三方面提供了一种电子设备,所述电子设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器运行所述计算机程序时,执行本申请实施例第一方面中的任一实现方式的步骤。
本申请实施例第四方面提供了一种可读存储介质,所述可读取存储介质中存储有计算机程序,所述计算机程序在处理器上运行时,执行本申请实施例第一方面中的任一实现方式的步骤。
本申请实施例第五方面提供了一种计算机程序产品,所述计算机程序产品在计算机上运行时,执行如第一方面中的任一实现方式的步骤。
本申请实施例提供的上述技术方案与现有技术相比具有如下优点:通过解析请求信息;对所述请求参数进行污点源标记和污点传播标记;使得除了获取污染传播轨迹外,还记录污染源的信息。监控opcode对应的操作函数,创建污点源事件结构体,并去除操作函数的返回值的污点源标记;监控传播函数,创建污点传播事件结构体,并对传播函数的返回值进行污点传播标记;监控opcode对应的风险函数,创建污点汇聚事件结构体;根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。从而,可以为漏洞告警时提供准确的漏洞源代码位置定位,对传播路径进行有效溯源和污染源的有效确定,通过构建污点传播链路解决漏洞如何修复的定位代码问题和分析漏洞形成原因的污点如何传播的问题。
应当理解,发明内容部分中所描述的内容并非旨在限定本公开的实施例的关键或重要特征,亦非用于限制本公开的范围。本公开的其它特征将通过以下的描述变得容易理解。
附图说明
为了更清楚地说明本申请实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本申请的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
图1为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析方法的流程示意图;
图2为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析方法的变量传播及溯源示意图;
图3为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析方法的另一种变量传播及溯源示意图;
图4为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析方法的污点线性传播示意图;
图5为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析方法的污点非线性传播示意图;
图6为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析装置的结构示意图;
图7为本申请实施例提供的一种电子设备的结构示意图。
具体实施方式
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。在本申请的描述中,术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。显而易见地,下面所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请实施例的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请实施例保护的范围。
实施例一:
请参阅图1,图1为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析方法的流程示意图。其中,方法包括以下步骤:
S100:在关键函数预插桩(hook)探针,解析请求信息之前,在php扩展的模块初始化阶段对zend引擎的opcode预插桩第一探针,对php内部函数预插桩第二探针。污点传播分析需要监控各个敏感函数的调用,具体是通过 hook opcode(通过第一探针)和hook内部函数(通过第二探针)。
需要说明的是,php的扩展运行实例都会经过以下四个过程:
模块初始化Module init(MINIT)阶段:在所有请求到达前发生,例如启动Apache服务器,php解释器随之启动,相关的各个模块(Redis、Mysql等)的MINIT方法被调用,仅被调用一次。请求初始化Request init(RINIT)阶段:每个请求到达时都被触发。SAPI层将控制权交由php层,php初始化本次请求执行脚本所需的环境变量,函数列表等,调用所有模块的RINIT函数。请求结束Request shutdown(RSHUTDOWN)阶段:每个请求结束,php就会自动清理程序,顺序调用各个模块的RSHUTDOWN方法,清除程序运行期间的符号表。模块结束Module shutdown(MSHUTDOWN)阶段:所有请求处理完毕后,SAPI也关闭了(即服务器关闭),PHP调用各个模块的MSHUTDOWN方法释放内存。
本申请中预插桩探针也是一个php扩展,在扩展中完成了这四个阶段的注册。在MINIT 阶段完成插桩(hook),日志、心跳通信等模块的启动,心跳进程与服务端连接后,可下发各种配置命令,例如是否启用探针。
需要说明的是,php是解释型语言,代码被翻译为中间字节码由zend引擎解析执行。php把中间字节码称之为opcode,每个opcode对应zend引擎底层的一个处理函数,zend引擎最终执行这个处理函数。opcode预插桩第一探针需要对几种opcode类型进行插桩hook,后续可以自行添加对插桩的敏感函数。
对php运行时的污点传播溯源需要对opcode进行预插桩探针,因为在php中,当接收请求,即使用到请求参数user时,实际上用到了一个操作函数opcode(ZEND_FETCH_DIM_R)从数组$_POST中读取变量,即从数组$_POST中取得了元素user的字符串变量值admin,因此通过插桩该opcode,可以追踪污点源标记的传播过程,知道污点源是如何进一步传播的。
另外,为了追踪部分传播函数(例如ZEND_CONCAT是代表字符串连接)涉及到opcode,需要对该opcode进行预插桩探针,进而实现追踪污点传播标记的传播过程。
另外,为了追踪一些风险(汇聚点)函数,比如xss攻击利用(ZEND_ECHO)文件包含、命令执行(ZEND_INCLUDE_OR_EVAL)的相关函数是与opcode有关的,直接对opcode预插桩探针实现上述函数的监控。
另外,一些风险(汇聚点)函数也是用对opcode进行预插桩探针的方式,不过具体方式不同。如下:
当被污染的变量作为参数被传入风险函数,当风险函数被调用时,根据函数调用的方式不同,例如直接调用或者通过函数名,调用php中的风险函数调用都是由三个zendopcode(ZEND_INCLUDE_OR_EVAL/ZEND_DO_FCALL/ZEND_DO_FCALL_BY_NAME)中某一个来进行的。通过zend引擎内置函数zend_set_user_opcode_handler对这三个zend opcode预插桩探针,从而监控风险函数调用,就能获取调用的风险函数和参数,主要是针对汇聚点(sink)函数。如命令执行相关函数 exec、Sql注入相关的mysqli、query等。
预插桩第一探针是在模块初始化(MINIT)阶段实现,在初始化阶段预加载探针。
在php扩展的模块初始化阶段对zend引擎的opcode预插桩第一探针,具体是通过自定义函数替换zend引擎内置函数(如opcode handler)的函数指针,如通过自定义函数替换内置函数表的中的函数指针对象。替换完函数指针后,当zend引擎执行到该opcode时,会查询该表找到对应的替换之后的内置函数指针并执行,即完成插桩。对opcode进行插桩从而改变代码的运行结构转而执行自定义函数。替换内置函数后便可以自定义函数调用前后的操作,如获取参数、阻断攻击等。
在php内核中,当某个函数通过这三个zend opcode调用时,zend引擎会在函数表中查找函数,然后返回一个zend_function类型的指针。预插桩探针后,zend引擎会在函数表中搜索该函数,返回一个zend_function指针,然后判断zend_function结构体中的type,由于handler已被上述插桩方法替换为自定义函数,则调用被修改的handler,通过调用zend_execute来执行自定义函数包含的zend_op_array。
上述,实现在php扩展的模块初始化阶段对zend引擎的opcode预插桩第一探针。本发明通过预插桩第一探针监控操作函数、部分传播函数来实现污点源事件和污点传播事件的跟踪,通过预插桩第一探针监听风险函数运行时的三个opcode来实现污点汇聚事件的跟踪。
对php内部函数预插桩第二探针,php内部函数包括部分传播函数。具体是通过自定义函数替换php内部函数在全局函数表中的函数指针,如通过封装php内部函数的handler,在php内部函数中增加自定义前置函数和自定义后置函数,如在php内部函数前增加自定义前置函数,在php内部函数后增加自定义后置函数,自定义函数=自定义前置函数+原内部函数+自定义后置函数。
如通过修改zend_internal_function的handler来预插桩php中的内部函数,handler指向的函数用C或者C++编写,可以直接执行。通过修改php内部函数结构体中函数指针,替换全局变量结构体的函数表中特定传播函数对应的函数指针。待完成检测函数的操作后再调用原来的处理函数即可完成预插桩探针。
本申请污点传播溯源分析使用对php内部函数(部分传播函数)预插桩第二探针;
其中部分传播函数主要是涉及字符串操作的函数(污点源标记和污点传播标记是标记在string字符串结构体上的),包括字符串转换类函数、字符串查找类函数、字符串编码类函数、字符串加密类函数、字符串比较类函数等。S101:解析请求信息,请求信息包括:请求参数、url和请求方法。
在本实施例中,将请求信息存放到第一zval结构体的预定义变量数组中;在php扩展的请求初始化阶段通过第一探针解析存放在预定义变量数组中的请求信息,得到请求参数、url和请求方法。
在php中,当接收请求,即使用到请求参数user时,实际上用到了一个操作函数opcode(ZEND_FETCH_DIM_R)从如预定义变量数组$_POST中读取变量,即从如预定义变量数组数组$_POST中取得了元素user的字符串变量值admin,因此通过预插桩在opcode的第一探针解析请求信息。
S102:对请求参数进行污点源标记和污点传播标记;
在本实施例中,对预定义变量数组中的string类型进行污点源标记和污点传播标记。
在本实施例中,对预定义变量数组中的string类型分别进行污点源标记和污点传播标记是通过string类型对应zval结构体中u.v.flags字段未被使用的第一字节位进行污点源标记;通过string类型对应zval结构体中u.v.flags字段未被使用的第二字节位进行污点传播标记。
在每个请求到达时触发请求初始化Request init(RINIT),通过预插桩第一探针做以下处理:
1、对请求信息的进行处理,获取参数、url、请求方法等信息,在污点标记,上报漏洞时需要用到。
2、对请求参数进行污染标记。包括污点源标记和污点传播标记。
在php中,全局变量都保存在一个HashTable类型的符号表symbol_table中,包括预定义变量$GLOBALS、$_COOKIE、 $_GET、$_POST等。
从HashTable里面获取到请求参数,具体是通过将包括请求参数的请求信息存放在预定义变量数组中。
例如这样一个网址参数:index.php?data=1a2b3c可以使用$parameter = $_GET("data");获取参数。最后$ parameter的结果就是1a2b3c。
$_REQUEST使用方法是相同的。$_REQUEST默认情况下包含了$_GET,$_POST和 $_COOKIE的数组。
在初始化(RINIT)阶段,我们首先将预定义变量$_SERVER、$_GET、$_POST、$_REQUEST、$_COOKIE、$_SESSION、$_FILES、$_ENV、$GLOBALS等数组中的值(只针对string类型进行污点标记)进行污点源标记和污点传播标记。
在php中,使用请求参数通常通过预定义变量获取array、object类型之间的操作(如复制、赋值),不会影响字符串(string)的污点标记位。因此污点源标记和污点传播标记就是对这些预定义变量数组中的所有字符串进行污点标记,后续针对字符串类型进行污点传播分析。
具体是基于在php实现内部,所有变量使用同一种数据结构(变量结构体zval)来保存,而这个结构同时表示php中的各种数据类型。它不仅仅包含变量的值,也包含变量的类型。在php中,存在8种变量类型,可以分为三类。标量类型(如boolean、integer、float(double)、string),复合类型(array、 object),特殊类型(resource、NULL)。
这里使用了两个标记位,一个是用于污点源标记(用于区别和定位污点源,便于污点传播的回溯),另一个用于污点传播标记。具体是对预定义变量数组中的所有字符串的zval结构体中u.v.flags字段未被使用的第一字节位进行污点源标记,如字节位从0修改为1。未被使用的第二字节位进行污点传播标记,如字节位从0修改为1。
污点源标记用于区别不同污点源,标记污点的来源信息,由于最开始的来源不同,污点源标记用于回溯参数确定污染来源,例如确定污点源参数类型POST/GET/COOKIE等,确定污点源参数名称user /name/pwd,确定url、请求方法等信息。
作为一种可选的实施方式,将请求参数的第一zval结构体地址和请求参数的信息保存到污点传播表中,请求参数的信息包括请求参数的类型和请求参数的名称;
将进行污点源标记和污点传播标记后的请求参数(即污点源参数)的 zval结构体地址与参数的信息(标注参数来源POST、GET,如标注为GET_user,又如url、请求方法)保存到污点传播表(如map结构)中,在创建污点源事件结构体时中需要用到。如下:
std::map<long, std::string>p_param; // 参数指针:参数
S103:监控opcode对应的操作函数,判断是否为污点源事件;若判断为污点源事件,则创建污点源事件结构体;
本实施例中,通过第一探针监控opcode对应的操作函数,获取操作函数的参数和返回值,判断操作函数的返回值是否为string类型,且是否存在污点源标记。如果操作函数的返回值为string类型,且存在污点源标记,则判断为污点源事件,创建污点源事件结构体。
具体通过插桩替换后的第一探针中自定义的opcode handler(handler为opcode对应的实际操作函数),zend引擎对每个opcode的工作方式是完全相同的,都有一个handler的函数指针,指向操作函数的地址,包含了执行opcode对应的代码,参数为opcode所需的操作数、符号表、操作数栈等,执行完成后,会返回一个结果result(返回值),有时也会附加一段信息extended_value。在第一探针的handler中我们可以获取到opcode监控的操作函数的操作指令,获取到的参数字符串。如从zend_execute_data结构体中获取到opline字段:struct _zend_op类型,当前执行的中间代码,获取到操作函数opline的参数和返回值result。
进行污点源分析:通过判断该返回值result是否为string类型,且是否为污点源(即是否存在污点源标记),实际上,当前存在两个污点标记位,分别为污点源标记和污点传播标记。
作为一种可选的实施方式,污点源事件结构体包括污点源参数信息、污点事件类型、调用栈信息、操作函数名称、操作函数的参数、操作函数的返回值和堆栈跟踪信息;获取污点源参数信息可以通过操作函数的参数查询污点传播表中对应的请求参数,将对应的请求参数的类型作为污点源参数的类型,将对应的请求参数的名称作为污点源参数的名称。
本实施例中,通过操作函数的参数查询污点传播表中对应的请求参数,是比较操作函数的参数的hash和污点传播表中请求参数的hash。
如果为污点源,则创建一个污点源事件结构体并保存,
污点源事件结构体中包括:污点源参数信息包括污点源参数的类型和污点源参数的名称,由于在污点源标记时,我们已经在污点传播表中保存了进行污点源标记的请求参数的第一zval结构体地址和参数的信息,因此在创建污点源事件结构体时,通过操作函数的参数查询污点传播表中对应的请求参数,将对应的请求参数的类型作为污点源参数的类型,将对应的请求参数的名称作为污点源参数的名称,从而获取到污点源参数的类型和污点源参数的名称。
污点源事件结构体中包括:污点事件类型,如当前污点事件结构体的类型为污点源事件。
污点源事件结构体中包括:调用栈信息,如调用栈第一行,从php函数入参信息结构体中获取调用栈信息。
污点源事件结构体中包括:操作函数名称,事先知道预插桩哪个操作函数,所以操作函数名称预先手动写入。
污点源事件结构体中包括:操作函数的参数,通过第一探针获取。
污点源事件结构体中包括:操作函数的返回值,通过第一探针获取。
污点源事件结构体中包括:堆栈跟踪信息,
通过调用zend 引擎函数获取。
由于获取堆栈跟踪信息是会耗费一定性能,为避免性能消耗的情况下,作为一种可选的实施方式,只获取当前调用栈第一行。
作为一种可选的实施方式,当创建完污点源事件结构体后,将操作函数的返回值的第二zval结构体地址和对应的污点源事件结构体保存到污点传播表中;如下:
std::map<long, taint_event*>taint_events;//key为操作函数的返回值内存指针
作为一种可选的实施方式,若判断为污点源事件,去除操作函数的返回值的污点源标记。
当创建完污点源事件结构体后,需要去除该污点源的污点源标记(因为当前污点源是有两个标记,一个是污点源标记,另一个是污点传播标记),去除污点源标记的原因是实际上后续传播事件或汇聚事件不应被认定为污点源,所以需要去除污点源标记,具体方法是:对当前操作函数的返回值的第二zval结构体中u.v.flags字段的污点源标记去除,如将被污点源标记的第一字节位从1修改为0。
实际上,污点事件分3种,污点源事件,污点传播事件,污点触发(汇聚)事件。对应的污点事件结构体也包括污点源事件结构体,污点传播事件结构体,污点汇聚事件结构体。通过污点事件结构体便于回溯整个污点传播过程。
S104:监控传播函数,判断是否为污点传播事件;若是,则创建污点传播事件结构体,并对传播函数的返回值进行污点传播标记;
本实施例中,通过第一探针或第二探针监控传播函数,获取传播函数的参数和返回值,判断传播函数的参数是否为string类型,且是否存在污点传播标记。如果传播函数的参数为string类型,且存在污点传播标记,判断为污点传播事件,创建污点传播事件结构体。
作为一种可选的实施方式,通过第一探针监控opcode对应的操作函数,操作函数包括用于字符串连接的第一传播函数;用于字符串连接的第一传播函数如ZEND_CONCAT。
作为一种可选的实施方式,通过第二探针监控php内部函数,php内部函数包括用于字符串操作的第二传播函数;
本实施例中,在预插桩探针的传播函数(通过第一探针插桩opcode和通过第二探针插桩内部函数)中进行:具体是判断传播函数的参数是否为string类型且是否被污点标记(存在污点传播标记)。如果都满足,则对传播函数的返回值result进行污点传播标记,这样就完成污染传播过程。对传播函数的返回值result进行污点传播标记具体是:对当前传播函数的返回值的第三zval结构体中u.v.flags字段的未被使用的字节位进行污点传播标记,如字节位从0修改为1。
作为一种可选的实施方式,污点传播事件结构体包括:污点事件类型、调用栈信息、传播函数名称、传播函数的参数、传播函数的返回值、堆栈跟踪信息和传播父事件信息;
创建一个污点传播事件结构体并保存,如下:
污点传播事件结构体中包括:事件结构体类型,如当前污点事件结构体的类型为污点传播事件。
污点传播事件结构体中包括:调用栈信息,如调用栈第一行,
从zend 引擎函数结构体中获取调用栈信息。
污点传播事件结构体中包括:传播函数名称,事先知道预插桩哪个传播函数,所以传播函数名称预先手动写入。
污点传播事件结构体中包括:传播函数的参数, 通过第一探针或第二探针获取。
污点传播事件结构体中包括:传播函数的返回值,通过第一探针或第二探针获取。
污点传播事件结构体中包括:堆栈跟踪信息,
通过调用zend 引擎函数获取。
由于获取堆栈跟踪信息是会耗费一定性能,为避免性能消耗的情况下,作为一种可选的实施方式,只获取当前调用栈第一行。
污点传播事件结构体中包括:传播父事件信息,父事件可能是污点源事件和污点传播事件。
作为一种可选的实施方式,请参阅图3,图3为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析方法的一种变量传播及溯源示意图,获取传播父事件信息是通过传播函数的参数查询污点传播表中对应的操作函数的返回值,再通过操作函数的返回值获取对应的第二zval结构体地址及对应的污点源事件结构体。
本实施例中,通过传播函数的参数查询污点传播表中对应的操作函数的返回值,具体是比较传播函数的参数的hash和污点传播表中操作函数的返回值的hash。
作为一种可选的实施方式,请参阅图2,图2为本申请实施例提供的一种基于代码疫苗的运行时漏洞分析方法的一种变量传播及溯源示意图,获取传播父事件信息是通过传播函数的参数查询污点传播表中对应的传播函数的返回值,再通过对应的传播函数的返回值获取对应的第三zval结构体地址及对应的污点传播事件结构体。
本实施例中,通过传播函数的参数查询查询污点传播表中对应的传播函数的返回值,具体是比较传播函数的参数的hash和污点传播表中传播函数的返回值的hash。
本实施例中,请参阅图4、图5,污点传播事件结构体的传播父事件信息可以存在多个,即一个污点传播事件结构体的父事件可能是多个污点源事件或多个污点传播事件。通过污点传播事件结构体中的多个传播父事件信息获取到多个污点源事件结构体,或多个污点传播事件结构体,或多个污点源事件结构体和污点传播事件结构体的组合。
由于实际的污点传播过程是非线性的复杂传播路径,如一个污点传播事件也可能来源于多个污点源事件或多个污点传播事件。如图5中所示,污点传播事件e1来源于污点源事件c1和污点源事件d1,污点传播事件d1来源于污点传播事件c1和污点传播事件e1。为了能对污点源进行区分和回溯。本申请除了常规的污点传播标记,还进行污点源标记,用于区别不同污点源,便于污点回溯。通过标记污点源信息,由于污点传播过程中最开始的来源不同,通过污点源标记回溯参数来确定来源。通过双重标记,除了能快速定位漏洞源代码位置。结合污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建的污点传播链路,回溯整个污点传播过程,进而呈现复杂污点传播过程中的传播路径,进而有利于分析漏洞产生的原因。
作为一种可选的实施方式,当创建完污点传播事件结构体后,将传播函数的参数的第三zval结构体地址和对应的污点传播事件结构体保存到污点传播表中;如下:
std::map<long, taint_event*>taint_events;//key为传播函数的返回值内存指针
S105:监控opcode对应的风险函数,判断是否为污点汇聚事件;若是,则创建污点汇聚事件结构体;
本实施例中,通过第一探针监控opcode对应的风险函数,获取风险函数的参数,判断风险函数的参数是否为string类型,且是否存在污点传播标记。如果风险函数的返回值为string类型,且存在污点传播标记,判断为污点汇聚事件,创建污点汇聚事件结构体。
作为一种可选的实施方式,污点汇聚事件结构体包括:污点事件类型、调用栈信息、风险函数名称、风险函数的参数、风险函数的返回值、堆栈跟踪信息和汇聚父事件信息;
创建一个污点汇聚事件结构体并保存, 污点汇聚事件结构体中包括:污点事件结构体的类型,如当前污点事件结构体的类型为污点汇聚事件。
污点汇聚事件结构体中包括:调用栈信息,如调用栈第一行,从php函数入参信息结构体中获取调用栈信息。
污点汇聚事件结构体中包括:风险函数名称,事先知道预插桩哪个风险函数,所以风险函数名称预先手动写入。
污点汇聚事件结构体中包括:风险函数的参数, 通过第一探针或第二探针获取。
污点汇聚事件结构体中包括:风险函数的返回值,通过第一探针或第二探针获取。
污点汇聚事件结构体中包括:堆栈跟踪信息,
通过调用zend 引擎函数获取。
由于获取堆栈跟踪信息是会耗费一定性能,为避免性能消耗的情况下,作为一种可选的实施方式,只获取当前调用栈第一行。
污点汇聚事件结构体中包括:汇聚父事件信息,父事件包括污点传播事件。
作为一种可选的实施方式,获取汇聚父事件信息包括:通过风险函数的参数查询污点传播表中对应的传播函数的返回值,再通过传播函数的返回值获取对应的第三zval结构体地址及对应的污点传播事件结构体。
本实施例中,通过风险函数的参数查询污点传播表中对应的传播函数的返回值,是比较风险函数的参数的hash和污点传播表中传播函数的返回值的hash。
作为一种可选的实施方式,将风险函数的参数的第四zval结构体地址和对应的污点汇聚事件结构体保存到污点传播表中。
本实施例中,请参阅图4、图5,污点汇聚事件结构体的汇聚父事件信息可以存在多个,即污点汇聚事件结构体的父事件可能是多个污点传播事件。即污点汇聚事件结构体的父事件可能是多个污点传播事件。通过污点汇聚事件结构体中的多个汇聚父事件信息获取到多个污点传播事件结构体。
由于实际的污点传播过程是非线性的复杂传播路径,如一个污点汇聚事件可能来源于多个污点传播事件,如图5中所示,污点汇聚事件a1来源于污点传播事件b1和污点传播事件d1。一个污点传播事件也可能来源于多个污点源事件,如图5中所示,污点传播事件e1来源于污点源事件c1和污点源事件d1。本申请通过污点源事件结构体中的污点源信息记录不同污点源的信息,便于回溯确定污点源。又通过建立的污点传播表及污点传播事件结构体中的传播父事件和污点汇聚事件结构体中的汇聚父事件,依次回溯每一个事件的上文信息,构建完整的网状污点传播链路,回溯整个污点传播过程,进而便于分析漏洞产生的原因。
作为一种可选的实施方式,当判断为污点汇聚事件,则判断存在漏洞,向服务端发送漏洞信息。
S106:根据污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。
本实施例中,查询并获取风险函数的参数在污点传播表中对应的污点汇聚事件结构体;通过获取到的污点汇聚事件结构体中的汇聚父事件信息在污点传播表中查询并获取对应的污点传播事件结构体;再通过获取到的污点传播事件结构体中的传播父事件信息在污点传播表查询并获取对应的污点源事件结构体;
将依次查询并获取到的污点源事件结构体中的污点源参数信息、调用栈信息、操作函数名称、操作函数的参数、操作函数的返回值及堆栈跟踪信息,以及污点传播事件结构体中的调用栈信息、传播函数名称、传播函数的参数、传播函数的返回值及堆栈跟踪信息,以及污点汇聚事件结构体中的调用栈信息、风险函数名称、风险函数的参数、风险函数的返回值及堆栈跟踪信息,依次连接生成污点传播链路。
作为一种可选的实施方式,请参阅图2至图5,构建污点传播链路,回溯整个污点传播过程,通过污点传播表中的污点事件结构体完成,获取涉及到的污点事件结构体,从污点源事件结构体—污点传播事件结构体—污点汇聚事件结构体的每一步的函数名称、参数、返回值、调用栈、堆栈跟踪等信息,以及污点源参数信息。能够在漏洞修复时定位到精确的每一步的函数及调用栈代码位置、堆栈跟踪信息,而且可以追溯到污点源信息。可以为漏洞告警时提供准确的漏洞源代码位置定位,便于进行更加精准的漏洞修复,进而提升漏洞修复效率。
作为一种可选的实施方式,涉及多条污点传播链路的聚合,能够将分别溯源的链路组合,根据相同污点事件结构体合并(溯源的过程就是聚合的过程,如一个污点传播事件来源于两个污点源事件,在溯源的时候,实质上是对污点传播事件进行聚合的过程),生成聚合污点传播链路。向服务端发送漏洞的聚合污点传播链路,便于进行漏洞成因分析。
实施例二:
请参阅图6,图6为本申请实施例提供的基于代码疫苗的运行时漏洞分析装置的结构示意图,该装置400包括:
解析模块401,用于解析请求信息,请求信息包括:请求参数、url和请求方法;
标记模块402,用于对请求参数进行污点源标记和污点传播标记,还用于判断为污点源事件后,去除操作函数的返回值的污点源标记,还用于判断为污点传播事件后,对传播函数的返回值进行污点传播标记;
第一监控模块403,用于监控opcode对应的操作函数,判断是否为污点源事件;若是,则创建污点源事件结构体;
第二监控模块404,用于监控传播函数,判断是否为污点传播事件;若是,则创建污点传播事件结构体;
第三监控模块405,用于监控opcode对应的风险函数,判断是否为污点汇聚事件;若是,则创建污点汇聚事件结构体;
构建模块406,用于根据污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。
上述基于代码疫苗的运行时漏洞分析装置的详细描述,请参见上述实施例中相关方法步骤的描述。
实施例三:
请参阅图7,图7为本申请实施例提供的一种电子设备的结构示意图,该电子设备500包括:存储器510和处理器520,存储器510和处理器520通过总线530连接,存储器510存储有计算机程序,处理器520读取并运行计算机程序时,以使电子设备500可执行上述的实施例中方法的全部或部分流程,以实现基于代码疫苗的运行时漏洞分析。
应当理解是,该电子设备可以是个人电脑(Personal Computer,PC)、平板电脑、智能手机等具有逻辑计算功能的电子设备。
本申请实施例还提供了一种可读存储介质,可读取存储介质中存储有计算机程序,计算机程序在处理器上运行时,执行基于代码疫苗的运行时漏洞分析方法中的步骤。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置和方法,也可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,附图中的流程图和框图显示了根据本申请的多个实施例的装置、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现方式中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的***来实现,或者可以用专用硬件与计算机指令的组合来实现。
另外,在本申请各个实施例中的各功能模块可以集成在一起形成一个独立的部分,也可以是各个模块单独存在,也可以两个或两个以上模块集成形成一个独立的部分。
所述功能如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本申请的实施例而已,并不用于限制本申请的保护范围,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应所述以权利要求的保护范围为准。
需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
Claims (17)
1.一种基于代码疫苗的运行时漏洞分析方法,其特征在于,所述方法包括:
解析请求信息,所述请求信息包括:请求参数、url和请求方法;
对所述请求参数进行污点源标记和污点传播标记;
监控opcode对应的操作函数,判断是否为污点源事件;
若是,则创建污点源事件结构体,并去除操作函数的返回值的污点源标记;
监控传播函数,判断是否为污点传播事件;
若是,则创建污点传播事件结构体,并对传播函数的返回值进行污点传播标记;
监控opcode对应的风险函数,判断是否为污点汇聚事件;
若是,则创建污点汇聚事件结构体;
根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。
2.根据权利要求1所述的方法,其特征在于,所述解析请求信息之前,包括:
在php扩展的模块初始化阶段对zend引擎的opcode预插桩第一探针,对php内部函数预插桩第二探针。
3.根据权利要求2所述的方法,其特征在于,所述解析请求信息包括:
将所述请求信息存放到第一zval结构体的预定义变量数组中;
在php扩展的请求初始化阶段通过所述第一探针解析存放在预定义变量数组中的请求信息,得到请求参数、url和请求方法。
4.根据权利要求3所述的方法,其特征在于,所述对所述请求参数进行污点源标记和污点传播标记,包括:
对所述预定义变量数组中的string类型进行污点源标记和污点传播标记。
5.根据权利要求1所述的方法,其特征在于,所述请求参数进行污点源标记和污点传播标记之后,包括:
将所述请求参数的第一zval结构体地址和请求参数的信息保存到污点传播表中,所述请求参数的信息包括请求参数的类型和请求参数的名称;
所述创建污点源事件结构体之后,包括:将所述操作函数的返回值的第二zval结构体地址和对应的所述污点源事件结构体保存到污点传播表中;
所述创建污点传播事件结构体之后,包括:将所述传播函数的返回值的第三zval结构体地址和对应的所述污点传播事件结构体保存到污点传播表中;
所述污点汇聚事件结构体包括:将所述风险函数的参数的第四zval结构体地址和对应的所述污点汇聚事件结构体保存到污点传播表中。
6.根据权利要求2所述的方法,其特征在于,所述监控opcode对应的操作函数,判断是否为污点源事件包括:
通过所述第一探针监控opcode对应的操作函数,获取操作函数的参数和返回值,判断所述操作函数的返回值是否为string类型,且是否存在污点源标记。
7.根据权利要求2所述的方法,其特征在于,所述监控传播函数,判断是否为污点传播事件包括:
通过所述第一探针或第二探针监控传播函数,获取传播函数的参数和返回值,判断传播函数的参数是否为string类型,且是否存在污点传播标记。
8.根据权利要求7所述的方法,其特征在于,所述通过所述第一探针或第二探针监控传播函数包括:
通过所述第一探针监控opcode对应的操作函数,所述操作函数包括用于字符串连接的第一传播函数;
或,
通过所述第二探针监控php内部函数,所述php内部函数包括用于字符串操作的第二传播函数。
9.根据权利要求2所述的方法,其特征在于,所述监控opcode对应的风险函数,判断是否为污点汇聚事件包括:
通过所述第一探针监控opcode对应的风险函数,获取风险函数的参数,判断风险函数的参数是否为string类型,且是否存在污点传播标记。
10.根据权利要求5所述的方法,其特征在于,所述污点源事件结构体包括:
污点源参数信息、污点事件类型、调用栈信息、操作函数名称、操作函数的参数、操作函数的返回值和堆栈跟踪信息;
获取所述污点源参数信息,包括:
通过操作函数的参数查询所述污点传播表中对应的请求参数,将对应的请求参数的类型作为污点源参数的类型,将对应的请求参数的名称作为污点源参数的名称。
11.根据权利要求10所述的方法,其特征在于,所述污点传播事件结构体包括:
污点事件类型、调用栈信息、传播函数名称、传播函数的参数、传播函数的返回值、堆栈跟踪信息和传播父事件信息;
获取所述传播父事件信息,包括:
通过传播函数的参数查询所述污点传播表中对应的操作函数的返回值,再通过所述操作函数的返回值获取对应的第二zval结构体地址及对应的污点源事件结构体。
12.根据权利要求11所述的方法,其特征在于,所述污点汇聚事件结构体包括:
污点事件类型、调用栈信息、风险函数名称、风险函数的参数、风险函数的返回值、堆栈跟踪信息和汇聚父事件信息;
获取所述汇聚父事件信息,包括:
通过风险函数的参数查询所述污点传播表中对应的传播函数的返回值,再通过传播函数的返回值获取对应的第三zval结构体地址及对应的污点传播事件结构体。
13.根据权利要求12所述的方法,其特征在于,所述根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路包括:
查询并获取风险函数的参数在所述污点传播表中对应的污点汇聚事件结构体;通过获取到的污点汇聚事件结构体中的汇聚父事件信息在所述污点传播表中查询并获取对应的污点传播事件结构体;再通过获取到的污点传播事件结构体中的传播父事件信息在所述污点传播表查询并获取对应的污点源事件结构体;
将依次查询并获取到的污点源事件结构体中的污点源参数信息、调用栈信息、操作函数名称、操作函数的参数、操作函数的返回值及堆栈跟踪信息,以及污点传播事件结构体中的调用栈信息、传播函数名称、传播函数的参数、传播函数的返回值及堆栈跟踪信息,以及污点汇聚事件结构体中的调用栈信息、风险函数名称、风险函数的参数、风险函数的返回值及堆栈跟踪信息,依次连接生成污点传播链路。
14.根据权利要求10-13任一项所述的方法,其特征在于,所述堆栈跟踪信息包括:当前调用栈的第一行。
15.一种基于代码疫苗的运行时漏洞分析装置,其特征在于,包括:
解析模块,用于解析请求信息,所述请求信息包括:请求参数、url和请求方法;
标记模块,用于对所述请求参数进行污点源标记和污点传播标记,还用于判断为污点源事件后,去除操作函数的返回值的污点源标记,还用于判断为污点传播事件后,对传播函数的返回值进行污点传播标记;
第一监控模块,用于监控opcode对应的操作函数,判断是否为污点源事件;若是,则创建污点源事件结构体;
第二监控模块,用于监控传播函数,判断是否为污点传播事件;若是,则创建污点传播事件结构体;
第三监控模块,用于监控opcode对应的风险函数,判断是否为污点汇聚事件;若是,则创建污点汇聚事件结构体;
构建模块,用于根据所述污点源事件结构体、污点传播事件结构体和污点汇聚事件结构体构建污点传播链路。
16.一种电子设备,其特征在于,所述电子设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器运行所述计算机程序时执行权利要求1至13中任一项所述的方法。
17.一种可读存储介质,其特征在于,所述可读存储介质中存储有计算机程序,所述计算机程序在处理器上运行时执行权利要求1至13中任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310440050.0A CN116167058B (zh) | 2023-04-23 | 2023-04-23 | 一种基于代码疫苗的运行时漏洞分析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310440050.0A CN116167058B (zh) | 2023-04-23 | 2023-04-23 | 一种基于代码疫苗的运行时漏洞分析方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN116167058A true CN116167058A (zh) | 2023-05-26 |
CN116167058B CN116167058B (zh) | 2023-06-30 |
Family
ID=86422250
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310440050.0A Active CN116167058B (zh) | 2023-04-23 | 2023-04-23 | 一种基于代码疫苗的运行时漏洞分析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116167058B (zh) |
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116775040A (zh) * | 2023-08-16 | 2023-09-19 | 北京安普诺信息技术有限公司 | 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法 |
CN116842531A (zh) * | 2023-08-28 | 2023-10-03 | 北京安普诺信息技术有限公司 | 基于代码疫苗的漏洞实时验证方法、装置、设备及介质 |
CN117009955A (zh) * | 2023-09-26 | 2023-11-07 | 北京安普诺信息技术有限公司 | 基于代码疫苗的iast、rasp探针控制方法及装置 |
CN117150514A (zh) * | 2023-10-30 | 2023-12-01 | 北京安普诺信息技术有限公司 | 基于代码疫苗iast探针的漏洞主动验证方法及装置 |
CN117272331A (zh) * | 2023-11-23 | 2023-12-22 | 北京安普诺信息技术有限公司 | 基于代码疫苗的跨线程漏洞分析方法、装置、设备及介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111859375A (zh) * | 2020-07-20 | 2020-10-30 | 百度在线网络技术(北京)有限公司 | 漏洞检测方法、装置、电子设备及存储介质 |
WO2021243740A1 (zh) * | 2020-06-02 | 2021-12-09 | 浙江大学 | 一种基于以太坊虚拟机的代码插桩框架*** |
CN114386045A (zh) * | 2021-12-24 | 2022-04-22 | 深圳开源互联网安全技术有限公司 | 一种Web应用程序漏洞检测方法、装置及存储介质 |
CN115827610A (zh) * | 2022-11-21 | 2023-03-21 | 杭州默安科技有限公司 | 一种有效负荷的检测方法及装置 |
-
2023
- 2023-04-23 CN CN202310440050.0A patent/CN116167058B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021243740A1 (zh) * | 2020-06-02 | 2021-12-09 | 浙江大学 | 一种基于以太坊虚拟机的代码插桩框架*** |
CN111859375A (zh) * | 2020-07-20 | 2020-10-30 | 百度在线网络技术(北京)有限公司 | 漏洞检测方法、装置、电子设备及存储介质 |
CN114386045A (zh) * | 2021-12-24 | 2022-04-22 | 深圳开源互联网安全技术有限公司 | 一种Web应用程序漏洞检测方法、装置及存储介质 |
CN115827610A (zh) * | 2022-11-21 | 2023-03-21 | 杭州默安科技有限公司 | 一种有效负荷的检测方法及装置 |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116775040A (zh) * | 2023-08-16 | 2023-09-19 | 北京安普诺信息技术有限公司 | 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法 |
CN116775040B (zh) * | 2023-08-16 | 2023-11-17 | 北京安普诺信息技术有限公司 | 实现代码疫苗的插桩方法及基于代码疫苗的应用测试方法 |
CN116842531A (zh) * | 2023-08-28 | 2023-10-03 | 北京安普诺信息技术有限公司 | 基于代码疫苗的漏洞实时验证方法、装置、设备及介质 |
CN116842531B (zh) * | 2023-08-28 | 2023-11-03 | 北京安普诺信息技术有限公司 | 基于代码疫苗的漏洞实时验证方法、装置、设备及介质 |
CN117009955A (zh) * | 2023-09-26 | 2023-11-07 | 北京安普诺信息技术有限公司 | 基于代码疫苗的iast、rasp探针控制方法及装置 |
CN117009955B (zh) * | 2023-09-26 | 2024-01-09 | 北京安普诺信息技术有限公司 | 基于代码疫苗的iast、rasp探针控制方法及装置 |
CN117150514A (zh) * | 2023-10-30 | 2023-12-01 | 北京安普诺信息技术有限公司 | 基于代码疫苗iast探针的漏洞主动验证方法及装置 |
CN117150514B (zh) * | 2023-10-30 | 2024-02-02 | 北京安普诺信息技术有限公司 | 基于代码疫苗iast探针的漏洞主动验证方法及装置 |
CN117272331A (zh) * | 2023-11-23 | 2023-12-22 | 北京安普诺信息技术有限公司 | 基于代码疫苗的跨线程漏洞分析方法、装置、设备及介质 |
CN117272331B (zh) * | 2023-11-23 | 2024-02-02 | 北京安普诺信息技术有限公司 | 基于代码疫苗的跨线程漏洞分析方法、装置、设备及介质 |
Also Published As
Publication number | Publication date |
---|---|
CN116167058B (zh) | 2023-06-30 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN116167058B (zh) | 一种基于代码疫苗的运行时漏洞分析方法及装置 | |
US11087002B2 (en) | Using the same query language for static and dynamic application security testing tools | |
Xue et al. | Malton: Towards {On-Device}{Non-Invasive} Mobile Malware Analysis for {ART} | |
US9715593B2 (en) | Software vulnerabilities detection system and methods | |
KR101904911B1 (ko) | 하이브리드 퍼징 기반 보안 취약점 자동 탐색 방법 및 그 장치 | |
CN103699480B (zh) | 一种基于java的web动态安全漏洞检测方法 | |
Jueckstock et al. | Visiblev8: In-browser monitoring of javascript in the wild | |
Carmony et al. | Extract Me If You Can: Abusing PDF Parsers in Malware Detectors. | |
Pradel et al. | EventBreak: Analyzing the responsiveness of user interfaces through performance-guided test generation | |
Mateos et al. | Detecting WSDL bad practices in code–first Web Services | |
Zhang et al. | Condysta: Context-aware dynamic supplement to static taint analysis | |
Gauthier et al. | AFFOGATO: runtime detection of injection attacks for node. js | |
Wei et al. | State-sensitive points-to analysis for the dynamic behavior of JavaScript objects | |
CN113497809A (zh) | 基于控制流和数据流分析的mips架构漏洞挖掘方法 | |
CN111859380A (zh) | Android App漏洞的零误报检测方法 | |
CN112131122A (zh) | 一种源代码缺陷检测工具误报评估方法及装置 | |
CN102034045A (zh) | 低计算机***资源开销的软件漏洞检测*** | |
US11314856B2 (en) | Generating rule-based access control policies using a bytecode instrumentation system | |
Hassanshahi et al. | Gelato: Feedback-driven and guided security analysis of client-side web applications | |
Kang et al. | Astraea: Towards an effective and usable application permission system for SDN | |
Al Kassar et al. | Testability Tarpits: the Impact of Code Patterns on the Security Testing of Web Applications. | |
US8949421B2 (en) | Techniques for discovering database connectivity leaks | |
CN114741700B (zh) | 基于符号化污点分析的公共组件库漏洞可利用性分析方法及装置 | |
Laranjeiro et al. | Protecting database centric web services against SQL/XPath injection attacks | |
Wu et al. | Crafting intents to detect icc vulnerabilities of android apps |
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 |