CN112926058B - 代码处理方法、污点分析方法和装置 - Google Patents

代码处理方法、污点分析方法和装置 Download PDF

Info

Publication number
CN112926058B
CN112926058B CN202110317801.0A CN202110317801A CN112926058B CN 112926058 B CN112926058 B CN 112926058B CN 202110317801 A CN202110317801 A CN 202110317801A CN 112926058 B CN112926058 B CN 112926058B
Authority
CN
China
Prior art keywords
code
statement
state
stain
dirty
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
CN202110317801.0A
Other languages
English (en)
Other versions
CN112926058A (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.)
Alipay Hangzhou Information Technology Co Ltd
Original Assignee
Alipay Hangzhou Information Technology Co Ltd
Filing date
Publication date
Application filed by Alipay Hangzhou Information Technology Co Ltd filed Critical Alipay Hangzhou Information Technology Co Ltd
Priority to CN202110317801.0A priority Critical patent/CN112926058B/zh
Publication of CN112926058A publication Critical patent/CN112926058A/zh
Application granted granted Critical
Publication of CN112926058B publication Critical patent/CN112926058B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Abstract

本说明书实施例提供了一种代码处理方法、污点分析方法和装置。根据该实施例的代码处理方法,首先判断当前加载的程序代码是否属于动态代码;如果当前加载的程序代码属于动态代码,那么识别该动态代码中的污点源;然后,将该动态代码中与污点源关联的变量的污点状态设置为污点;以及将动态代码中与污点源未关联的变量的污点状态设置为非污点;最后,针对该动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码。

Description

代码处理方法、污点分析方法和装置
技术领域
本说明书一个或多个实施例涉及软件技术领域,尤其涉及代码处理方法、污点分析方法和装置。
背景技术
数据流分析技术通过分析程序中数据传播的合法性以保证信息安全,是防止数据完整性和保密性被破坏的有效手段。污点分析技术是数据流分析技术的一种实践方法,该技术通过对系统中敏感数据进行标记,继而跟踪标记数据在程序中的传播,以检测系统安全问题。
现有技术中对程序代码进行污点分析的方案,污点分析结果不够准确。因此,希望提供一种更可靠的污点分析方案。
发明内容
本说明书一个或多个实施例描述了代码处理方法、污点分析方法和装置,以提高污点分析结果的准确性。
根据第一方面,提供了一种代码处理方法,包括:
判断当前加载的程序代码是否属于动态代码;该动态代码为在程序运行时从该程序对应的程序代码文件的外部加载到该程序中的代码;
如果是,识别所述动态代码中的污点源;
将所述动态代码中与所述污点源关联的变量的污点状态设置为污点;
将所述动态代码中与所述污点源未关联的变量的污点状态设置为非污点;
针对所述动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码;其中,所述污点状态计算语句用于根据该语句中引用的各变量的污点状态,计算该语句的污点状态。
在一个实施例中,
当一条语句中包括一个变量时,该语句的污点状态为该变量的污点状态;
当一条语句中包括至少两个变量时,该语句的污点状态为该语句最终计算出的变量的污点状态。
在一个实施例中,进一步包括:
获取所述程序包括的静态代码;该静态代码为所述程序对应的程序代码文件内部包括的代码;
识别所述静态代码中的污点源;
将所述静态代码中与该污点源关联的变量的污点状态设置为污点;
将所述静态代码中与该污点源未关联的变量的污点状态设置为非污点;
针对静态代码中的各语句,分别根据该语句中引用的各变量的污点状态,判断各语句的污点状态是否为污点,为污点状态为污点的静态代码中的各语句插入污点状态计算语句,得到代码重写后的静态代码。
在一个实施例中,在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之前,进一步包括:
生成污点使用链;
将污点源作为第一条语句加入该污点使用链;
依次判断静态代码中的每一条语句的污点状态,如果污点状态为污点,则将该语句串联在所述污点使用链中;
判断污点使用链中的最后一条语句是否为敏感操作语句;
如果是,则继续执行所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句,且
所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句,包括:在所述静态代码中,为污点使用链中包括的每一条语句分别插入污点状态计算语句,得到代码重写后的静态代码。
在一个实施例中,在程序运行之前,执行所述获取所述程序包括的静态代码直至所述得到代码重写后的静态代码的步骤。
在一个实施例中,在针对静态代码中的各语句,为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,进一步包括:为包括该静态代码的程序代码文件设置处理标识;
所述判断当前加载的程序代码是否属于动态代码,包括:
判断当前加载的程序代码文件是否设置有处理标识,如果否,则确定当前加载的程序代码文件中的程序代码属于动态代码。
在一个实施例中,所述静态代码为bytecode;
或者,
所述静态代码为:根据bytecode转换出的中间语言IR;则在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,并在得到代码重写后的静态代码之前,进一步包括:将插入有污点状态计算语句的静态代码由中间语言IR转换为bytecode。
在一个实施例中,所述根据该语句中引用的各变量的污点状态,计算该语句的污点状态包括:
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行无害处理操作,则该语句的污点状态为非污点;
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行非无害处理操作,则该语句的污点状态为污点;
如果该语句中引用的各变量中不包括污点状态为污点的变量,则该语句的污点状态为非污点。
第二方面,提供了一种污点分析方法,包括:
利用上述任一实施例所述的代码处理方法,得到代码重写后的动态代码;
运行代码重写后的动态代码;
当运行到一条敏感操作语句,且根据为该敏感操作语句插入的污点状态计算语句确定出该敏感操作语句的污点状态为污点时,输出告警信息。
第三方面,提供了一种代码处理装置,包括:
判断单元,被配置为判断当前加载的程序代码是否属于动态代码;该动态代码为在程序运行时从该程序对应的程序代码文件的外部加载到该程序中的代码;
第一识别单元,被配置为在当前加载的程序代码属于动态代码时,识别所述动态代码中的污点源;
第一污点状态设置单元,被配置为将所述动态代码中与所述污点源关联的变量的污点状态设置为污点;以及将所述动态代码中与所述污点源未关联的变量的污点状态设置为非污点;
第一插入单元,被配置为针对所述动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码;其中,所述污点状态计算语句用于根据该语句中引用的各变量的污点状态,计算该语句的污点状态。
在一个实施例中,当一条语句中包括一个变量时,该语句的污点状态为该变量的污点状态;
当一条语句中包括至少两个变量时,该语句的污点状态为该语句最终计算出的变量的污点状态。
在一个实施例中,进一步包括:
静态代码获取单元,被配置为获取所述程序包括的静态代码;该静态代码为所述程序对应的程序代码文件内部包括的代码;
第二识别单元,被配置为识别所述静态代码中的污点源;
第二污点状态设置单元,被配置为将所述静态代码中与该污点源关联的变量的污点状态设置为污点;以及将所述静态代码中与该污点源未关联的变量的污点状态设置为非污点;
第二插入单元,被配置为针对静态代码中的各语句,分别根据该语句中引用的各变量的污点状态,判断各语句的污点状态是否为污点,为污点状态为污点的静态代码中的各语句插入污点状态计算语句,得到代码重写后的静态代码。
在一个实施例中,进一步包括:
污点使用链生成单元,被配置为在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之前,生成污点使用链;将污点源作为第一条语句加入该污点使用链;依次判断静态代码中的每一条语句的污点状态,如果污点状态为污点,则将该语句串联在所述污点使用链中;判断污点使用链中的最后一条语句是否为敏感操作语句;如果是,则触发所述第二插入单元执行所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句,且
所述第二插入单元在执行所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句时被配置为:在所述静态代码中,为污点使用链中包括的每一条语句分别插入污点状态计算语句,得到代码重写后的静态代码。
在一个实施例中,所述静态代码获取单元、所述第二识别单元、所述第二污点状态设置单元以及所述第二插入单元所执行的操作,是在程序运行之前执行的。
在一个实施例中,进一步包括:处理标识设置单元,被配置为在针对静态代码中的各语句,为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,为包括该静态代码的程序代码文件设置处理标识;
所述判断单元,被配置为判断当前加载的程序代码文件是否设置有处理标识,如果否,则确定当前加载的程序代码文件中的程序代码属于动态代码。
在一个实施例中,所述静态代码为bytecode;
或者,
所述静态代码为:根据bytecode转换出的中间语言IR;
进一步包括:程序语言转换单元,被配置为在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,并在得到代码重写后的静态代码之前,将插入有污点状态计算语句的静态代码由中间语言IR转换为bytecode。
在一个实施例中,所述第一插入单元被配置为:在执行根据该语句中引用的各变量的污点状态,计算该语句的污点状态时:
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行无害处理操作,则该语句的污点状态为非污点;
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行非无害处理操作,则该语句的污点状态为污点;
如果该语句中引用的各变量中不包括污点状态为污点的变量,则该语句的污点状态为非污点。
第四方面,提供了一种污点分析装置,包括:
代码获取单元,被配置为利用上述任一所述的代码处理装置,得到代码重写后的动态代码;
程序运行单元,被配置为运行代码重写后的动态代码;当运行到一条敏感操作语句,且根据为该敏感操作语句插入的污点状态计算语句确定出该敏感操作语句的污点状态为污点时,输出告警信息。
根据第五方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行本说明书任一实施例所述的方法。
根据第六方面,提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现本说明书任一实施例所述的方法。
本说明书实施例提供的代码处理方法、污点分析方法和装置,在程序运行过程中针对当前加载的动态代码,查找出动态代码中的污点源,并将动态代码中与污点源关联的变量的污点状态设置为污点,将动态代码中与污点源未关联的变量的污点状态设置为非污点,针对动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码。在进行污点分析时,通过运行代码重写后的动态代码,当运行到一条敏感操作语句时,且根据为该敏感操作语句插入的污点状态计算语句确定出该敏感操作语句的污点状态为污点时,输出告警信息。考虑到程序运行过程中存在执行程序代码文件外部的动态代码的情况,在程序运行过程中将动态代码从该程序对应的程序代码文件的外部加载到该程序中之后,通过在加载的动态代码中插入污点状态计算语句,用于根据该语句中引入的各变量的污点状态,计算该语句的污点状态,以使程序运行代码重写后的动态代码,从而实现了对动态代码中污点分析,提高了污点分析结果的准确性。
附图说明
为了更清楚地说明本说明书实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本说明书的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本说明书一个实施例提供的方法所应用的场景示意图;
图2是本说明书一个实施例提供的代码处理方法的流程图;
图3是本说明书一个实施例中的污点源示例;
图4是本说明书一个实施例中bytecode程序代码示例;
图5是本说明书一个实施例中对图4中的程序代码进行处理后得到的代码重写后的程序代码示例;
图6是本说明书一个实施例中提供的静态代码处理方法的流程图;
图7是本说明书一个实施例中一段静态代码示例;
图8是本说明书一个实施例中提供的污点分析方法的流程图;
图9是本说明书一个实施例提供的一种代码处理装置的结构图;
图10是本说明书一个实施例提供的另一种代码处理装置的结构图;
图11是本说明书一个实施例提供的再一种代码处理装置的结构图;
图12是本说明书一个实施例提供的又一种代码处理装置的结构图;
图13是本说明书另一个实施例提供的一种代码处理装置的结构图;
图14是本说明书一个实施例提供的一种污点分析装置的结构图。
具体实施方式
下面结合附图,对本说明书提供的方案进行描述。
程序代码在设计过程中如果存在漏洞,会被攻击者利用这些漏洞窃取或篡改用户数据,从而造成用户数据的泄露。数据流分析技术通过分析程序中数据传播的合法性以保证信息安全,是防止数据完整性和保密性被破坏的有效手段。污点分析技术是数据流分析技术的一种实践方法,该技术通过对系统中敏感数据进行标记,继而跟踪标记数据在程序中的传播,以检测系统安全问题。现有技术中一般采用离线方式对程序代码进行污点分析,但是程序在运行过程中不仅会加载程序代码文件内部包括的代码,还会从程序代码文件的外部加载一部分代码,从程序代码文件的外部加载的这一部分代码在离线时不能直接获取到,而现有技术并未对从程序代码文件的外部加载的这部分代码进行污点分析,因此,现有技术在对程序代码进行污点分析时,污点分析结果不够准确。
考虑到攻击者会利用从程序代码文件的外部加载的这部分代码中漏洞窃取或篡改用户数据,因此,需要对从程序代码文件的外部加载的这部分代码进行污点分析,而这部分代码需要在程序运行过程中才能获取到,因此,需要在程序运行过程中对程序加载的这部分代码进行处理,以实现对从程序代码文件的外部加载的这部分代码进行污点分析。
为了便于理解本说明书提供的方案,现对本说明书中涉及的名词进行解释。
静态代码:属于程序中固有的一部分代码,例如业务逻辑代码、框架代码等,对于静态代码能够在离线状态下获取到。
动态代码:不属于程序中固有的一部分代码,是程序在运行过程中动态加载到程序中并执行的,例如利用反射、反序列化等机制触发动态加载的代码,或者利用Java Agent动态注入进来的代码。
污点源(source):代表直接引入不受信任的数据或者隐私数据到系统中。
敏感操作(sink):代表直接产生安全敏感操作或者泄露隐私数据到外界的操作。
无害处理(sanitizer):代表通过数据加密或者移除危害操作等手段使数据传播不在对程序的数据安全产生危害。
下面描述以上构思的具体实现方式。
为了方便对本说明书的理解,首先对本说明书所应用的场景进行描述。如图1中所示,在应用系统中安装有应用软件,应用软件的程序在运行过程中会加载并执行静态代码和动态代码。为了保证系统安全,在静态代码和动态代码执行的同时实现污点分析,以分析程序中由污点源引入的数据是否能够不经无害处理,而直接传播到敏感操作,如果不能,说明系统中数据是安全的,否则,就说明产生了隐私数据泄露的问题。
下面描述该代码处理方法的具体实现过程。
图2示出根据一个实施例的代码处理方法的流程图。可以理解,该方法可以通过任何具有计算、处理能力的装置、设备、平台、设备集群来执行。
参见图2,此后,具体的实现包括:
步骤200:判断当前加载的程序代码是否属于动态代码;该动态代码为在程序运行时从该程序对应的程序代码文件的外部加载到该程序中的代码。
步骤202:如果是,查找所述动态代码中的污点源。
步骤204:将所述动态代码中与所述污点源关联的变量的污点状态设置为污点。
步骤206:将所述动态代码中与所述污点源未关联的变量的污点状态设置为非污点。
步骤208:针对所述动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码;其中,所述污点状态计算语句用于根据该语句中引用的各变量的污点状态,计算该语句的污点状态。
在图2所示的代码处理方法中,考虑到程序运行过程中存在执行程序代码文件外部的动态代码的情况,在程序运行过程中将动态代码从该程序对应的程序代码文件的外部加载到该程序中之后,通过在加载的动态代码中插入污点状态计算语句,用于根据该语句中引入的各变量的污点状态,计算该语句的污点状态,以使程序运行代码重写后的动态代码,从而实现了对动态代码中污点分析,提高了污点分析结果的准确性。
下面描述图2所示的各个步骤的执行方式。
首先,在步骤200,判断当前加载的程序代码是否属于动态代码;该动态代码为在程序运行时从该程序对应的程序代码文件的外部加载到该程序中的代码。
为便于对本说明书所提供方案的理解,本说明书将程序代码划分为静态代码和动态代码两类。其中,静态代码可以在程序未运行时通过线下获得,而动态代码需要在程序运行过程中获得。因此,为实现程序代码的污点分析,对静态代码和动态代码的处理至少可以采用如下两种方式实现:
方式一、A1:在程序运行之前,对静态代码进行处理。
A2:在程序运行过程中,对动态代码进行处理。
方式二、在程序运行过程中,同时对静态代码和动态代码进行处理。
针对上述方式一,由于静态代码可以在线下获得,因此,可以在线下预先针对静态代码进行处理。在对静态代码处理完成后,程序可以直接运行处理完成后的程序代码,当加载出来的程序代码为静态代码时,由于该静态代码预先在线下进行了处理,因此通过执行该静态代码,可以实现对静态代码的污点分析。当加载出来的程序代码为动态代码时,可以对加载出来的该动态代码进行线上处理。
针对上述方式二,在程序运行过程中,每加载一个程序代码文件,则对该程序代码文件中包括的程序代码进行处理,该程序代码文件中包括的程序代码可以是静态代码,也可以是动态代码,在对程序代码处理完成后,重新加载给程序执行,以实现对程序全代码(包括静态代码和动态代码)的污点分析。
考虑到方式二中在程序运行过程中对程序全代码进行处理时开销较大,因此,在本说明书实施例中,优先选择上述方式一来对程序代码进行处理,即在程序运行过程中只考虑对动态代码进行处理。
程序运行过程中,会提前将接下来需要执行的程序代码文件进行加载,以待后续执行。程序代码文件可以是.class文件。为了实现对动态代码的处理,本说明书实施例中,可以利用java.lang.instrumentation框架实现一个ClassFileTransformer。ClassFileTransformer用来实现对class文件中包括的程序代码对处理。其中,class文件中包括的程序代码是字节码(bytecode)。
在程序运行过程中,当前加载出包括有程序代码的程序代码文件之后,首先需要判断当前加载的程序代码是否属于动态代码。如果不属于,那么表明当前加载的程序代码为静态代码,由于静态代码在程序运行之前线下进行了处理,因此,在当前加载的程序代码是静态代码时,可以不进行处理。如果当前加载的程序代码属于动态代码,那么就需要对当前加载的程序代码进行处理。
在本说明书一个实施例中,为了判断当前加载的程序代码是否属于动态代码,可以在程序运行之前线下对静态代码处理完成之后,为包括该静态代码的程序代码文件设置处理标识。比如,在程序代码文件中添加用于表征处理标识的字段。再比如,将已经处理过的程序代码文件的路径记录在一个本地文件中,每加载一个程序代码文件,可以在本地文件中查找是否记录有该当前加载的程序代码文件的路径,如果有,则表明当前加载的程序代码文件已经被处理过。
其中,该处理标识用来表征该程序代码文件已经被处理过,可以利用该处理标识识别出静态文件来。
那么,步骤200可以包括:判断当前加载的程序代码文件是否设置有处理标识,如果否,则确定当前加载的程序代码文件中的程序代码属于动态代码。
上述判断方式是本说明书一个优选方式,除上述判断方式以外,还可以利用其他方式来判断。比如,通过程序代码的加载方式来判断,如果程序代码是通过反射机制、反序列化机制动态加载出来的,那么表征该程序代码为动态代码。再比如,通过确定程序代码是否由Java Agent动态注入进来的来判断,如果是,则表征该程序代码为动态代码。
在步骤202中,当前加载的程序代码属于动态代码,识别该动态代码中的污点源。
由于污点源代表直接引入不受信任的数据或者隐私数据到系统中,那么为了识别污点源,在本说明书实施例中,可以预先设置一个策略文件。该策略文件可以是一个描述性文件,描述哪些函数是污点源。在设置该策略文件时,可以根据对程序代码进行污点分析时关注的安全漏洞类型来确定哪些函数是污点源。
例如,针对Web应用程序进行污点分析时,污点源可以是Web框架中关键对象的属性。请参考图3,为一个污点源示例。在根据策略文件识别污点源时,可以根据识别对象,确定对应的污点属性,将该识别对应的污点属性对应的变量确定为与污染源关联的变量。
在步骤204中,将该动态代码中与污点源关联的变量的污点状态设置为污点。
在步骤206中,将该动态代码中与污点源未关联的变量的污点状态设置为非污点。
在识别出污点源之后,可以为变量设置原始的污点状态。其中,将与污点源关联的变量的污点状态设置为污点,将与污点源未关联的变量的污点状态设置为非污点。例如,该污点状态可以用1,0来表示。污点状态为1时,表明该变量的污点状态为污点;污点状态为0时,表明该变量的污点状态为非污点。
步骤204和步骤206中所述的变量,至少包括如下两类:
第一类,为类class中的变量。
在方法栈中对应有多个存储位置,每一个存储位置中存储有类class的字段,这些存储的类class的字段即为类class中的变量。
第二类,在类class方法的bytecode中,包括的变量以及所调用函数中的参数。
在步骤208中,针对该动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码;其中,该污点状态计算语句用于根据该语句中引用的各变量的污点状态,计算该语句的污点状态。
在本说明书实施例中,对动态代码进行处理的方式是代码重写的方式,但是重写后的代码又不能影响程序原始的业务处理逻辑,因此,通过插入污点状态计算语句的方式来实现代码重写。即程序在运行过程中,按照原始的业务处理逻辑进行处理的同时,执行该插入的污点状态计算语句,以计算每一条语句的污点状态,以检测在敏感操作语句的污点状态是否为污点。
其中,计算一条语句的污点状态,实际是计算该语句中包括的变量的污点状态。在一条语句中包括的变量个数对应如下两种情况时,该语句的污点状态所指的变量不同:
情况A:当一条语句中包括一个变量时,该语句的污点状态为该变量的污点状态。
例如,一条语句为iload 1,该条语句中只包括一个变量,该变量是方法栈中索引为1的位置处存储的变量,那么该语句的污点状态即为该变量的污点状态。
情况B:当一条语句中包括至少两个变量时,该语句的污点状态为该语句最终计算出的变量的污点状态。
例如,一条语句为b=a+c,该条语句中包括三个变量a、变量b和变量c。其中,变量b为该语句最终计算出的变量,那么该语句的污点状态即为变量b的污点状态。
在为动态代码插入污点状态计算语句时,考虑到污点传播逻辑可能是贯穿多个程序代码文件中的,而在程序运行过程中只能获取到当前加载出的程序代码文件,在分析动态代码中的污点传播逻辑时,如果污点传播逻辑对应的语句存在其他未加载出来的程序代码文件中,则无法分析出最终的污点传播逻辑;并且污点传播逻辑的分析过程耗时较长,会影响程序代码的执行效率。因此,在本说明书实施例中,不对动态代码中的污点传播逻辑进行分析,而是针对动态代码中的每一个语句均插入污点状态计算语句。
其中,根据该语句中引用的各变量的污点状态,计算该语句的污点状态,可以包括如下三种情况:
情况一:如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行无害处理操作,则该语句的污点状态为非污点。
情况二:如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行非无害处理操作,则该语句的污点状态为污点。
情况三:如果该语句中引用的各变量中不包括污点状态为污点的变量,则该语句的污点状态为非污点。
在程序运行该动态代码中该语句插入的该污点状态计算语句时,会根据该语句对应的上述三种情况,计算该语句的污点状态。
针对上述情况一,该无害处理操作可以是一个对变量进行的加密处理或者其他移除危害的操作。假设该语句引用了一个变量,且引用的该变量为污点。如果对该变量的引用方式是对该变量进行加密,那么该语句的污点状态为非污点。此时为该语句插入的语句为:在对变量的引用方式为对该变量进行无害处理操作时,将该变量的污点状态更新为非污点,该语句的污点状态为该变量更新后的污点状态。
针对上述情况二和情况三,举例来说,请参考图4,为一个sum()函数对应的bytecode程序代码。其中,该函数中第6行语句是指示将方法栈中索引为0的位置处存储的变量加载出来,第7行语句是指示将方法栈中索引为1的位置处存储的变量加载出来,第8行语句是指示将加载出来的两个变量相加。假设方法栈中索引为0的位置处存储的变量的污点状态为污点,方法栈中索引为1的位置处存储的变量的污点状态为非污点。
针对第6行语句,该语句中引用了一个变量,该变量为方法栈中索引为0的位置处存储的变量,而该变量的污点状态为污点,且该语句的操作语义是将该变量加载出来,该操作并不属于无害处理操作,即该变量的引用方式为对该变量进行非无害处理操作,那么该第6行语句与上述情况二相对应,因此,该第6行语句的污点状态为污点。该情况下,为第6行语句插入的污点状态计算语句可以是:该第6行语句的污点状态等于方法栈中索引为0的位置处存储的变量的污点状态。
针对第7行语句,该语句中引用了一个变量,该变量为方法栈中索引为1的位置处存储的变量,而该变量的污点状态为非污点,那么该第7行语句与上述情况三相对应,因此,该第7行语句的污点状态为非污点。该情况下,为第7行语句插入的污点状态计算语句可以是:该第7行语句的污点状态等于方法栈中索引为1的位置处存储的变量的污点状态。
针对第8行语句,该语句中引用了两个变量,第一个变量为方法栈中索引为0的位置处存储的变量,第二个变量为方法栈中索引为1的位置处存储的变量。其中,第一个变量的污点状态为污点,第二个变量的污点状态为非污点。即该第8行语句中引用的各变量中包括污点状态为污点的变量(第一个变量),且该语句的操作语义是将第一个变量与第二个变量相加,该操作并不属于无害处理操作,即对第一个变量的引用方式为对第一个变量进行非无害处理操作,那么该第8行语句与上述情况二相对应,因此,该第8行语句的污点状态为污点。该情况下,为第8行语句插入的污点状态计算语句可以是:该第8行语句的污点状态为,若第一个变量的污点状态与第二个变量的污点状态中有一个为污点,那么该第8行语句的污点状态为污点。
请参考图5,为对图4所示的bytecode程序代码进行处理后,得到的代码重写后的程序代码。
需要说明的是,程序加载出来的程序代码为bytecode,如果需要较细的污点分析粒度,可以直接对bytecode的动态代码进行处理;如果需要较快的处理速度,那么可以先将动态代码的bytecode转换成IR(中间语言),在对动态代码处理完成后,在将处理完成后动态代码由IR转换成bytecode,得到代码重写后的动态代码。
优选地,直接对bytecode的动态代码进行处理,可以达到字段敏感、上下文敏感、流敏感和路径敏感的分析粒度。
在步骤208中得到代码重写后的动态代码之后,将代码重写后的动态代码重新加载给程序,以使程序运行该代码重写后的动态代码。
在本说明书实施例中,在得到代码重写后的动态代码之后,也可以对包括该代码重写后的动态代码的程序代码文件设置处理标识,在程序运行该代码重写后的动态代码之后,会将该代码重写后的动态代码存储到内存中。当程序需要再次加载该动态代码对应的程序代码文件时,可以直接从内存中将该代码重写后的动态代码加载出来并运行,而无需对该动态代码重写处理。
以上实现了在程序运行过程中,对加载出来的动态代码的处理。下面对本说明书实施例在程序运行之前线下对静态代码的处理方式进行说明。
图6示出了对静态代码的处理过程,该处理过程可以在程序运行之前执行。具体地,该处理过程包括:
步骤600:获取程序包括的静态代码;该静态代码为程序对应的程序代码文件内部包括的代码。
在本说明书实施例中,在获取程序对应的静态代码时,可以获取该程序与业务逻辑代码相关的Java bytecode宿主文件,该宿主文件可以是.class文件,也可以是.jar文件。其中,.jar文件可以解压缩出多个.class文件。
本步骤中获取到的静态代码为bytecode。
步骤602:识别该静态代码中的污点源。
步骤604:将所述静态代码中与该污点源关联的变量的污点状态设置为污点。
步骤606:将所述静态代码中与该污点源未关联的变量的污点状态设置为非污点。
其中,步骤602-步骤606的处理方式与步骤202-步骤206的处理方式相同,在此不在赘述。
步骤608:针对静态代码中的各语句,分别根据该语句中引用的各变量的污点状态,判断各语句的污点状态是否为污点,为污点状态为污点的静态代码中的各语句插入污点状态计算语句,得到代码重写后的静态代码。
由于静态代码是在线下进行处理,那么对静态代码的处理可以包括两种方式:
方式A:对静态代码中的每一条语句,均插入污点状态计算语句。
方式B:仅对污点状态为污点的语句插入污点状态计算语句。
在方式A下,无需判断静态代码中语句的污点状态,直接针对每一条语句插入污点状态计算语句。在静态代码执行的同时,对每一条语句的污点状态进行计算,防止漏掉对引用了污点状态为污点的变量的语句,进一步提高污点分析结果的准确性。其中,方式A下插入污点状态计算语句的过程与步骤208相同,在此不在赘述。
在方式B下,由于插入的污点状态计算语句是为了跟踪污点的传播路径,那么可以考虑仅对污点状态为污点的语句插入污点状态计算语句。由于静态代码在整个程序代码中的占比远远比动态代码要大,相对于方式A而言,利用方式B,可以使得向静态代码中插入的污点状态计算语句的数量更少,代码重写后的文件更小。
该方式B中,在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之前,可以进一步包括:生成污点使用链;将污点源作为第一条语句加入该污点使用链;依次判断静态代码中的每一条语句的污点状态,如果污点状态为污点,则将该语句串联在该污点使用链中;判断污点使用链中的最后一条语句是否为敏感操作语句;如果是,则继续执行步骤608中所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句(记为步骤6080),且该步骤6080包括:在该静态代码中,为污点使用链中包括的每一条语句分别插入污点状态计算语句,得到代码重写后的静态代码。
下面以图7示出的一段静态代码为例,对该污点使用链进行说明。在该段静态代码中,识别出了第4行引入了入密码数据的passwordText接口为污点源(source),pwd变量为与污点源相关的变量,将pwd变量的污点状态设置为污点。图7中,该pwd变量的污点状态传播到第5行、第6行,所以第5行的leakedPwd变量和第6行的leakedMessage变量的污点状态均更新为污点。在第8行该污点状态为污点的leakedMessage变量可以传播到发送信息的sendTextMessage接口,表明密码数据会被该接口泄露,而该第8行语句为敏感操作语句,那么该污点使用链中包括的语句分别为:第4行语句、第5行语句、第6行语句和第8行语句。此时,可以对该污点使用链中包括的每一条语句分别插入污点状态计算语句,得到代码重写后的静态代码。
可以理解,该污点使用链为污点状态为污点的各语句的集合,该污点使用链中的第一条语句为污点源,该污点使用链中的最后一条语句为敏感操作语句,且该污点源与敏感操作语句之间的语句是按照污点传播顺序依次加入到污点使用链中的。
其中,在判断污点使用链中的最后一条语句是否为敏感操作语句时,可以预先在步骤602识别静态代码的污点源的同时,对静态代码中的敏感操作语句进行识别并标记。同理,在策略文件中可以描述出哪些函数是敏感操作语句。即在步骤602中,利用策略文件识别出静态代码中的污点源和敏感操作语句,并标记。例如图7中对第4行标记的source以及对第8行标记的sink。
在本说明书实施例中,程序代码中的语句可以通过函数调用来实现该函数的功能,该调用的函数可以是另一个class文件中的函数(同样属于该程序的静态代码),也可以是系统库函数(不属于该程序的静态代码)。
在污点状态为污点的语句调用的函数是另一个class文件中的函数时,那么就需要获取该另一个class文件中的该函数所对应的各执行语句,针对该另一个class文件中的该函数所对应的各执行语句分别执行步骤6080。
在污点状态为污点的语句调用的函数是系统库函数时,由于系统库函数不属于该程序的静态代码,那么可以按照该系统库函数的污点行为描述,为其插入污点状态计算语句,而无需对该系统库函数中的每一条执行语句分别插入污点状态计算语句。例如,该系统库函数为Mcopy函数,用于从原buffer中拷贝数据到目标buffer中,那么为该语句插入的污点状态计算语句为:目标buffer的污点状态等于原buffer的污点状态。
在本说明书实施例中,在执行步骤602-步骤608时对应静态代码至少可以为如下两种形式的代码:
第一种:该静态代码为bytecode。
第二种:该静态代码为根据bytecode转换出的IR。
其中,步骤600中获取的静态代码为bytecode。
如果需要较细的污点分析粒度,那么执行步骤602-步骤608的静态代码可以为第一种形式的代码。
如果需要较快的静态代码处理速度,那么执行步骤602-步骤608的静态代码可以为第二种形式的代码。
在执行步骤602-步骤608的静态代码可以为第二种形式的代码时,在步骤600之后,步骤602之前,需要将静态代码由bytecode转换为IR。且步骤608中,在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,并在得到代码重写后的静态代码之前,进一步包括:将插入有污点状态计算语句的静态代码由IR转换为bytecode。代码转换后,得到代码重写后的静态代码。
其中,将bytecode转换成IR,以及将IR转换成bytecode,均可以根据配置文件来自动实现代码转换。
在本说明书实施例中,在针对静态代码中的各语句,为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,进一步包括:为包括该静态代码的程序代码文件设置处理标识。从而可以利用该设置的处理标识对步骤200中当前加载的程序代码是否属于动态代码进行判断。该步骤200包括:判断当前加载的程序代码文件是否设置有处理标识,如果否,则确定当前加载的程序代码文件中的程序代码属于动态代码。
图8示出根据一个实施例的污点分析方法的流程图。可以理解,该方法可以通过任何具有计算、处理能力的装置、设备、平台、设备集群来执行。
参见图8,此后,具体的实现包括:
步骤800:利用本说明书实施例中任一所述的代码处理方法,得到代码重写后的动态代码。
步骤802:运行代码重写后的动态代码。
步骤804:当运行到一条敏感操作语句,且根据为该敏感操作语句插入的污点状态计算语句确定出该敏感操作语句的污点状态为污点时,输出告警信息。
由于代码处理方法中对于动态代码的处理是程序运行过程中处理的,因此,在对动态代码处理完成后,该程序重新加载该得到的代码重写的动态代码。在运行代码重写后的动态代码过程中,一边执行原有业务处理逻辑,一边执行插入的污点状态计算语句,在执行插入的污点状态计算语句时会计算出每一条语句的污点状态,从而可以实现污点在各语句中的传播。
当运行到一条敏感操作语句时,如果该敏感操作语句的污点状态为污点,那么表明存在隐私数据泄露的风险,此时可以输出告警信息。其中,该告警信息中至少可以包括该敏感操作语句的位置。
程序维护人员可以根据该告警信息对存在隐私数据泄露的敏感操作语句进行定位,并对程序代码进行修复,以保证隐私数据的安全性。
另一方面的实施例,还提供了一种代码处理装置。如图9示出一个实施例的代码处理装置。可以理解,该装置可以通过任何具有计算、处理能力的装置、设备、平台和设备集群来实现。如图9所示,该装置90包括:
判断单元91,被配置为判断当前加载的程序代码是否属于动态代码;该动态代码为在程序运行时从该程序对应的程序代码文件的外部加载到该程序中的代码;
第一识别单元92,被配置为在当前加载的程序代码属于动态代码时,识别所述动态代码中的污点源;
第一污点状态设置单元93,被配置为将所述动态代码中与所述污点源关联的变量的污点状态设置为污点;以及将所述动态代码中与所述污点源未关联的变量的污点状态设置为非污点;
第一插入单元94,被配置为针对所述动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码;其中,所述污点状态计算语句用于根据该语句中引用的各变量的污点状态,计算该语句的污点状态。
一个可能的实现方式中,当一条语句中包括一个变量时,该语句的污点状态为该变量的污点状态;
当一条语句中包括至少两个变量时,该语句的污点状态为该语句最终计算出的变量的污点状态。
一个可能的实现方式中,请参考图10,该装置90可以进一步包括:
静态代码获取单元95,被配置为获取所述程序包括的静态代码;该静态代码为所述程序对应的程序代码文件内部包括的代码;
第二识别单元96,被配置为识别所述静态代码中的污点源;
第二污点状态设置单元97,被配置为将所述静态代码中与该污点源关联的变量的污点状态设置为污点;以及将所述静态代码中与该污点源未关联的变量的污点状态设置为非污点;
第二插入单元98,被配置为针对静态代码中的各语句,分别根据该语句中引用的各变量的污点状态,判断各语句的污点状态是否为污点,为污点状态为污点的静态代码中的各语句插入污点状态计算语句,得到代码重写后的静态代码。
一个可能的实现方式中,请参考图11,该装置90可以进一步包括:
污点使用链生成单元99,被配置为在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之前,生成污点使用链;将污点源作为第一条语句加入该污点使用链;依次判断静态代码中的每一条语句的污点状态,如果污点状态为污点,则将该语句串联在所述污点使用链中;判断污点使用链中的最后一条语句是否为敏感操作语句;如果是,则触发所述第二插入单元执行所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句,且
所述第二插入单元98在执行所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句时被配置为:在所述静态代码中,为污点使用链中包括的每一条语句分别插入污点状态计算语句,得到代码重写后的静态代码。
一个可能的实现方式中,所述静态代码获取单元、所述第二识别单元、所述第二污点状态设置单元以及所述第二插入单元所执行的操作,是在程序运行之前执行的。
一个可能的实现方式中,请参考图12,该装置90可以进一步包括:处理标识设置单元910,被配置为在针对静态代码中的各语句,为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,为包括该静态代码的程序代码文件设置处理标识;
所述判断单元91,被配置为判断当前加载的程序代码文件是否设置有处理标识,如果否,则确定当前加载的程序代码文件中的程序代码属于动态代码。
一个可能的实现方式中,所述静态代码为bytecode;
或者,
所述静态代码为:根据bytecode转换出的中间语言IR;
请参考图13,该装置90可以进一步包括:程序语言转换单元911,被配置为在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,并在得到代码重写后的静态代码之前,将插入有污点状态计算语句的静态代码由中间语言IR转换为bytecode。
一个可能的实现方式中,其中,所述第一插入单元94被配置为:在执行根据该语句中引用的各变量的污点状态,计算该语句的污点状态时:
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行无害处理操作,则该语句的污点状态为非污点;
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行非无害处理操作,则该语句的污点状态为污点;
如果该语句中引用的各变量中不包括污点状态为污点的变量,则该语句的污点状态为非污点。
另一方面的实施例,还提供了一种污点分析装置。如图14示出一个实施例的污点分析装置。可以理解,该装置可以通过任何具有计算、处理能力的装置、设备、平台和设备集群来实现。如图14所示,该装置140包括:
代码获取单元141,被配置为利用上述任一实施例所述的代码处理装置,得到代码重写后的动态代码;
程序运行单元142,被配置为运行代码重写后的动态代码;当运行到一条敏感操作语句,且根据为该敏感操作语句插入的污点状态计算语句确定出该敏感操作语句的污点状态为污点时,输出告警信息。
本说明书一个实施例提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行说明书中任一个实施例中的方法。
本说明书一个实施例提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现执行说明书中任一个实施例中的方法。
可以理解的是,本说明书实施例示意的结构并不构成对代码处理装置/污点分析装置的具体限定。在说明书的另一些实施例中,代码处理装置/污点分析装置可以包括比图示更多或者更少的部件,或者组合某些部件,或者拆分某些部件,或者不同的部件布置。图示的部件可以以硬件、软件或者软件和硬件的组合来实现。
上述装置、系统内的各模块之间的信息交互、执行过程等内容,由于与本说明书方法实施例基于同一构思,具体内容可参见本说明书方法实施例中的叙述,此处不再赘述。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、挂件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。

Claims (20)

1.代码处理方法,包括:
在程序运行过程中,判断当前加载的程序代码是否属于动态代码;该动态代码不属于程序中固有的代码,该动态代码为在程序运行时从该程序对应的程序代码文件的外部加载到该程序中的代码;
如果是静态代码,则不进行处理,结束当前流程;其中,静态代码属于程序中固有的代码,能够在离线状态下获取到;
如果是动态代码,识别所述动态代码中的污点源;
将所述动态代码中与所述污点源关联的变量的污点状态设置为污点;
将所述动态代码中与所述污点源未关联的变量的污点状态设置为非污点;
针对所述动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码;其中,所述污点状态计算语句用于根据该语句中引用的各变量的污点状态,计算该语句的污点状态。
2.根据权利要求1所述的方法,其中,
当一条语句中包括一个变量时,该语句的污点状态为该变量的污点状态;
当一条语句中包括至少两个变量时,该语句的污点状态为该语句最终计算出的变量的污点状态。
3.根据权利要求1所述的方法,进一步包括:
获取所述程序包括的静态代码;该静态代码为所述程序对应的程序代码文件内部包括的代码;
识别所述静态代码中的污点源;
将所述静态代码中与该污点源关联的变量的污点状态设置为污点;
将所述静态代码中与该污点源未关联的变量的污点状态设置为非污点;
针对静态代码中的各语句,分别根据该语句中引用的各变量的污点状态,判断各语句的污点状态是否为污点,为污点状态为污点的静态代码中的各语句插入污点状态计算语句,得到代码重写后的静态代码。
4.根据权利要求3所述的方法,在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之前,进一步包括:
生成污点使用链;
将污点源作为第一条语句加入该污点使用链;
依次判断静态代码中的每一条语句的污点状态,如果污点状态为污点,则将该语句串联在所述污点使用链中;
判断污点使用链中的最后一条语句是否为敏感操作语句;
如果是,则继续执行所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句,且
所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句,包括:在所述静态代码中,为污点使用链中包括的每一条语句分别插入污点状态计算语句,得到代码重写后的静态代码。
5.根据权利要求3所述的方法,其中,在程序运行之前,执行所述获取所述程序包括的静态代码直至所述得到代码重写后的静态代码的步骤。
6.根据权利要求3所述的方法,在针对静态代码中的各语句,为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,进一步包括:为包括该静态代码的程序代码文件设置处理标识;
所述判断当前加载的程序代码是否属于动态代码,包括:
判断当前加载的程序代码文件是否设置有处理标识,如果否,则确定当前加载的程序代码文件中的程序代码属于动态代码。
7.根据权利要求3所述的方法,
所述静态代码为bytecode;
或者,
所述静态代码为:根据bytecode转换出的中间语言IR;则在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,并在得到代码重写后的静态代码之前,进一步包括:将插入有污点状态计算语句的静态代码由中间语言IR转换为bytecode。
8.根据权利要求1至7中任一所述的方法,其中,所述根据该语句中引用的各变量的污点状态,计算该语句的污点状态包括:
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行无害处理操作,则该语句的污点状态为非污点;
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行非无害处理操作,则该语句的污点状态为污点;
如果该语句中引用的各变量中不包括污点状态为污点的变量,则该语句的污点状态为非污点。
9.污点分析方法,包括:
利用权利要求1至8中任一所述的代码处理方法,得到代码重写后的动态代码;
运行代码重写后的动态代码;
当运行到一条敏感操作语句,且根据为该敏感操作语句插入的污点状态计算语句确定出该敏感操作语句的污点状态为污点时,输出告警信息。
10.代码处理装置,包括:
判断单元,被配置为在程序运行过程中,判断当前加载的程序代码是否属于动态代码;该动态代码不属于程序中固有的代码,该动态代码为在程序运行时从该程序对应的程序代码文件的外部加载到该程序中的代码;
第一识别单元,被配置为在当前加载的程序代码属于静态代码时,不进行处理,结束当前流程;其中,静态代码属于程序中固有的代码,能够在离线状态下获取到;在当前加载的程序代码属于动态代码时,识别所述动态代码中的污点源;
第一污点状态设置单元,被配置为将所述动态代码中与所述污点源关联的变量的污点状态设置为污点;以及将所述动态代码中与所述污点源未关联的变量的污点状态设置为非污点;
第一插入单元,被配置为针对所述动态代码中的每一条语句,为该语句插入污点状态计算语句,得到代码重写后的动态代码;其中,所述污点状态计算语句用于根据该语句中引用的各变量的污点状态,计算该语句的污点状态。
11.根据权利要求10所述的装置,其中,
当一条语句中包括一个变量时,该语句的污点状态为该变量的污点状态;
当一条语句中包括至少两个变量时,该语句的污点状态为该语句最终计算出的变量的污点状态。
12.根据权利要求10所述的装置,进一步包括:
静态代码获取单元,被配置为获取所述程序包括的静态代码;该静态代码为所述程序对应的程序代码文件内部包括的代码;
第二识别单元,被配置为识别所述静态代码中的污点源;
第二污点状态设置单元,被配置为将所述静态代码中与该污点源关联的变量的污点状态设置为污点;以及将所述静态代码中与该污点源未关联的变量的污点状态设置为非污点;
第二插入单元,被配置为针对静态代码中的各语句,分别根据该语句中引用的各变量的污点状态,判断各语句的污点状态是否为污点,为污点状态为污点的静态代码中的各语句插入污点状态计算语句,得到代码重写后的静态代码。
13.根据权利要求12所述的装置,进一步包括:
污点使用链生成单元,被配置为在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之前,生成污点使用链;将污点源作为第一条语句加入该污点使用链;依次判断静态代码中的每一条语句的污点状态,如果污点状态为污点,则将该语句串联在所述污点使用链中;判断污点使用链中的最后一条语句是否为敏感操作语句;如果是,则触发所述第二插入单元执行所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句,且
所述第二插入单元在执行所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句时被配置为:在所述静态代码中,为污点使用链中包括的每一条语句分别插入污点状态计算语句,得到代码重写后的静态代码。
14.根据权利要求12所述的装置,其中,所述静态代码获取单元、所述第二识别单元、所述第二污点状态设置单元以及所述第二插入单元所执行的操作,是在程序运行之前执行的。
15.根据权利要求12所述的装置,进一步包括:处理标识设置单元,被配置为在针对静态代码中的各语句,为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,为包括该静态代码的程序代码文件设置处理标识;
所述判断单元,被配置为判断当前加载的程序代码文件是否设置有处理标识,如果否,则确定当前加载的程序代码文件中的程序代码属于动态代码。
16.根据权利要求12所述的装置,
所述静态代码为bytecode;
或者,
所述静态代码为:根据bytecode转换出的中间语言IR;
进一步包括:程序语言转换单元,被配置为在所述为污点状态为污点的静态代码中的各语句插入污点状态计算语句之后,并在得到代码重写后的静态代码之前,将插入有污点状态计算语句的静态代码由中间语言IR转换为bytecode。
17.根据权利要求10至16中任一所述的装置,其中,所述第一插入单元被配置为:在执行根据该语句中引用的各变量的污点状态,计算该语句的污点状态时:
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行无害处理操作,则该语句的污点状态为非污点;
如果该语句中引用的各变量中包括污点状态为污点的变量,且该变量的引用方式为对该变量进行非无害处理操作,则该语句的污点状态为污点;
如果该语句中引用的各变量中不包括污点状态为污点的变量,则该语句的污点状态为非污点。
18.污点分析装置,包括:
代码获取单元,被配置为利用权利要求10至17中任一所述的代码处理装置,得到代码重写后的动态代码;
程序运行单元,被配置为运行代码重写后的动态代码;当运行到一条敏感操作语句,且根据为该敏感操作语句插入的污点状态计算语句确定出该敏感操作语句的污点状态为污点时,输出告警信息。
19.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行权利要求1-9中任一项所述的方法。
20.一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-9中任一项所述的方法。
CN202110317801.0A 2021-03-25 代码处理方法、污点分析方法和装置 Active CN112926058B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110317801.0A CN112926058B (zh) 2021-03-25 代码处理方法、污点分析方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110317801.0A CN112926058B (zh) 2021-03-25 代码处理方法、污点分析方法和装置

Publications (2)

Publication Number Publication Date
CN112926058A CN112926058A (zh) 2021-06-08
CN112926058B true CN112926058B (zh) 2024-07-16

Family

ID=

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110597715A (zh) * 2019-08-28 2019-12-20 昆明理工大学 一种基于模糊测试的测试样本优化方法

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110597715A (zh) * 2019-08-28 2019-12-20 昆明理工大学 一种基于模糊测试的测试样本优化方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
二进制程序动态污点分析技术研究综述;宋铮;王永剑;金波;林九川;;信息网络安全;20160310(03);78-79页 *
基于代码改写的JavaScript动态污点跟踪;王伟平;柏军洋;张玉婵;王建新;;清华大学学报(自然科学版);20160915(09);958-959页 *

Similar Documents

Publication Publication Date Title
US9454659B1 (en) Software vulnerabilities detection system and methods
US9824214B2 (en) High performance software vulnerabilities detection system and methods
US8656496B2 (en) Global variable security analysis
US8387017B2 (en) Black box testing optimization using information from white box testing
CN112560045A (zh) 应用程序漏洞检测方法、装置、计算机设备和存储介质
US10599852B2 (en) High performance software vulnerabilities detection system and methods
US20240121261A1 (en) Automated Security Analysis of Software Libraries
CN111382067A (zh) 一种模糊测试中高质量种子生成方法及系统
CN109684829B (zh) 一种虚拟化环境中服务调用监控方法和系统
CN114036526A (zh) 漏洞测试方法、装置、计算机设备和存储介质
CN114091031A (zh) 基于白规则的类加载防护方法及装置
US11494492B2 (en) Program analysis system, program analysis method and storage medium
CN108509796B (zh) 一种风险性的检测方法及服务器
Baradaran et al. A unit-based symbolic execution method for detecting memory corruption vulnerabilities in executable codes
CN112926058B (zh) 代码处理方法、污点分析方法和装置
US11822673B2 (en) Guided micro-fuzzing through hybrid program analysis
CN113849817B (zh) 一种JavaScript原型链污染漏洞的检测方法及装置
Jurn et al. A survey of automated root cause analysis of software vulnerability
CN112926058A (zh) 代码处理方法、污点分析方法和装置
Wang et al. A Systematic Literature Review on Smart Contract Vulnerability Detection by Symbolic Execution
CN116861418B (zh) 面向32位Windows沙盒的渗透测试方法、装置、设备及存储介质
CN117614681B (zh) 智能合约的重入漏洞检测方法、系统、设备和存储介质
CN118051920B (zh) 一种漏洞验证请求包生成方法、装置、设备及存储介质
Letychevskyi Algebraic methods for detection of vulnerabilities in software systems
Lampezhev et al. Evaluation of Information Technology Equivalence in Telemedicine

Legal Events

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