基于污点查找关联的安卓静态污点分析装置和分析方法

文档序号:31863323发布日期:2022-10-19 06:59阅读:81来源:国知局
基于污点查找关联的安卓静态污点分析装置和分析方法

1.本发明涉及移动互联网安全技术领域,具体是一种基于污点查找关联的安卓(android)静态污点分析装置和分析方法。


背景技术:

2.近年来,移动互联网技术发展迅速,随之而来的安全问题也日益凸显。移动智能设备由于其特殊的使用场景,以及存储量大和通讯隐私的功能特性,在面对恶意攻击者以及以个性化广告投放服务商为代表的第三方信息使用者时,如何有效对未经用户授权的个人隐私信息进行防护已成为移动互联网安全的研究热点。
3.污点分析是信息流分析的一种形式,广泛应用于包括android 应用隐私泄露检测在内的软件缺陷检测中。为了提高污点分析的检测准确率和分析效率,许多研究采用各种方法进行了尝试,但当前大多数静态污点分析方法采取先依据程序代码构建控制流图、调用图、数据流图等有向图,然后再对有向图进行类似图可达性分析的方式来获得污点传播路径和对分析发现的污点泄露进行报警。然而,实际的程序代码中极有可能包含大量与污点传播过程无关的控制和数据依赖关系,这类关系经常导致被分析的图中存在大量与污点传播路径不相关的边和节点,这些冗余边和节点的存在既无助于提高污点分析的准确率和降低误报率、又会增加分析过程的时间和内存开销。
4.在针对android应用的静态污点分析技术中,对android特性的考虑是影响分析准确率的重要因素。android应用由系统调用和事件驱动构成,具备多入口、非线性等特征。在对android应用进行污点分析时,若对上述android应用特性考虑不足,则会导致污点分析准确率下降,产生不可避免的误报或漏报。由于模拟全部可能的回调方法执行顺序会使得分析开销过大,现有技术一般通过假定组件中回调方法的执行顺序来解决上述问题,但现有解决方案仍然在处理该类问题上存在不足,使得整体污点分析准确率下降。


技术实现要素:

5.本发明的目的是针对现有技术的不足,而提供一种基于污点查找关联的安卓静态污点分析装置和分析方法。这种方法能提升污点分析的准确率和分析效率,尤其解决因android应用特性导致的污点分析准确率下降问题。
6.实现本发明目的的技术方案是:一种基于污点查找关联的安卓静态污点分析装置, 所述静态污点分析装置设有顺序连接的:反编译模块:反编译模块的输入为android应用程序包apk,反编译模块用于反编译android应用程序包apk,特别是将应用程序包apk中的classes.dex字节码文件反编译为可供分析的java源码形式;分词模块:分词模块用于预处理源码即分词模块根据代码语义对代码语句进行分词,以便后续对代码进行进一步的语义判定和分析;
语义分析模块:语义分析模块采用基于污点查找关联的android静态污点分析方法和污点传播规则对分词模块处理的程序代码进行语义判定,将实际程序中的污点相关语句转化为污点传播边,并按照基于污点查找关联的android静态污点分析方法和污点传播规则对污点传播边进行关联,最终形成污点传播路径图并向外输出,其中,污点传播规则中定义如下四种语句类型:第一种直接赋值语句:“左值=右值”形式的直接赋值语句,表示由“右值”到“左值”的直接赋值;第二种方法调用语句:“方法名(参数)”形式的方法调用语句,表示调用包含实际参数“参数”、以“方法名”为名的方法;第三种返回赋值语句:“左值=方法名(参数《,

》)”形式的返回赋值语句,表示包含实际参数“参数”、以“方法名”为名的方法向“左值”返回值;第四种返回调用语句:“外部方法名(内部方法名(参数)i)”形式的返回调用语句,表示包含实际参数“参数”、以“内部方法名”为名的方法的返回值,被以“外部方法名”为名的方法作为第i个实际参数调用;所述污点传播规则包括:直接赋值传播规则:在直接赋值语句中,若等号右边变量或值为“污点”,则等号左边的变量为“新污点”;方法调用传播规则:在方法调用语句中,若被调用方法中的第i个实际参数为“污点”,则被调用方法定义中第i个形式参数为“新污点”;返回赋值传播规则:在返回赋值语句中,若被调用方法的返回值为“污点”,则等号左边的变量为“新污点”;返回调用传播规则:返回调用语句中,若内部被调用方法的返回值为“污点”、且返回值处于外部被调用方法的第i个实际参数位置,则外部被调用方法的第i个实际参数为“新污点”;污点生成判定规则:以污点源方法调用为“污点”,根据返回赋值传播规则、返回调用传播规则,若能够产生“新污点”,则认为有污点生成,否则认为没有污点生成;污点清除判定规则:在直接赋值语句中,若右值为常量或空值、左值为污点变量,则该污点被清除;污点泄露判定规则:在方法调用语句中,若被调用方法为污点汇聚点方法,且被调用的污点汇聚点方法的实际参数中包含污点,则认为产生了污点泄露;别名分析启动规则:在直接赋值语句中,若左值为对象类型,则以左值名称为目标启动别名分析;污点别名删除规则:在直接赋值语句中,若左值为污点别名,右值为该类别名以外的对象类型,则以左值名称为目标将其从别名列表中的相应位置剔除,语义分析模块中还植入有污点源/污点汇聚点列表,污点源/污点汇聚点列表用于对污点源和污点汇聚点的识别,采用现有技术制作,由基于机器学习的自动化分类方法提供,准确的污点源/污点汇聚点列表能够提升污点分析的准确率。
7.一种基于污点查找关联的安卓静态污点分析方法,包括上述基于污点查找关联的android静态污点分析装置,所述方法包括如下步骤:
1)导入预先由基于机器学习的自动化分类方法获得的污点源方法列表、污点汇聚方法列表;2)在完整的待分析代码中查找源方法集合中方法的调用位置,并将查找结果存储为污点起始点列表,列表中包含被查找到的完整代码行及完整代码行相关位置信息,若污点起始点列表为空即未在被分析代码中发现源方法调用,则污点分析终止;若污点起始点列表为非空,则执行步骤3);3)逐个判断步骤2)获得的污点起始点列表中产生污点的代码片段是否在污点生成后进行了传播行为,传播行为即直接赋值或作为参数传入任意被调用方法,若否,则继续对污点起始点列表中的下一个查找结果进行判断;若是,则执行步骤4),对污点起始点列表中全部查找结果完成判断后,执行步骤9);4)以步骤3)获得的进行了传播行为的污点生成代码作为起点,进行污点传播边的构建,并将该语句生成污点传播边作为第一条边构建一张新的污点传播路径图,其中,污点传播边结构为:[序号, 位置, 污点, 新污点, 类型],其中,序号表示操作语句在程序中的相对先后位置、采用代码行号,以递增的数字形式表示;位置表示操作语句所在的类名、方法名及当前被分析语句所在的选择结构,表示形式为“类名.方法名(《参数》《,参数

》)《.选择结构》”,尖括号表示尖括号内的内容为可选内容;污点表示传播边起点即需要进行分析以获取污点向后传播路径的当前污点位置,表示形式为“类名《.方法名》.变量名/方法名(《参数》《,参数》

)”,尖括号表示尖括号内的内容为可选内容;新污点表示传播边终点即分析得出的下一个污点位置,表示形式同“污点”字段;类型表示传播边的类型,包括“赋值”、“调用”、“返回”、“终止”四种类型,用于算法中针对该语句进行下一步操作决定的依据;5)依照深度优先方法查找与上一条污点传播边的“新污点”字段及“新污点”字段所指污点的污点别名有关的程序语句,并根据查找结果语句构建下一条污点传播边,若查找结果语句不在当前被分析的类中,则生成的污点传播边存入污点传播路径备用列表,否则,将构建的污点传播边直接加入污点传播路径图,若被分析污点进入当前组件的其它回调方法,假定污点不分先后地向任意一个回调方法内传播,构建一条或多条平行的、指向不同回调方法中污点的污点传播边,若查找结果为空,则当前污点传播路径图构建完成,并将构建完成的污点传播路径图加入污点传播路径图集合,返回步骤3),其中,污点传播路径备用列表为:由若干包含一条或多条污点传播边的污点传播路径段组成的集合,路径间按照路径所处的不同类方法分类,污点传播路径备用列表在类方法调用验证过程中被使用,通过验证的路径段将被加入污点传播路径图中;6)逐个判断步骤5)中查找结果语句是否包含对污点对象中类方法的调用,若是,进行类方法调用验证,所述类方法调用验证过程为:在污点传播路径构建过程中持续监测是否有污点传播路径备用列表中的备用污点传播路径对应的类方法被调用,一旦发现类方法被调用行为,则立即将备用路径转为有效的污点传播路径加入当前正在构建的污点传播路径图中;
7)逐个判断步骤5)中查找结果语句中是否有污点向对象或向对象的某个域传播,若是,则进行持续的别名获取,直至获取到当前被分析污点变量的全部别名,所述污点别名获取的过程为:当发现污点向对象传播时,以被污染的对象为目标,在当前方法内向上查找被污染的对象是否存在别名,若存在,则针对新的别名再进行别名获取,直至获取到当前被分析污点对象的全部别名、并将获取到的污点别名以集合形式返回,供步骤5)中搜索污点过程使用;8)逐个判断步骤5)中查找结果语句是否导致别名失效,若是,则从拥有失效别名的污点对应的别名列表中剔除失效的别名,返回步骤5);9)污点传播路径图集合构建完成,返回污点传播路径图集合。
[0008]
本技术方案采用构建一条或多条平行的、指向不同回调方法中污点的污点传播边,使得污点分析方法能够更好地处理android应用多入口、非线性的特性,提升了污点分析准确率,其中,污点查找关联的本技术方案仅查找和分析污点相关代码,降低了污点不相关代码对污点分析系统性能造成的负面影响,避免了对被分析程序进行完整建模产生过大的时空消耗,提升了污点分析效率。
[0009]
本技术方案制定污点传播规则,能够根据规则有效地对污点相关语句进行查找和关联,以构建准确完整的污点传播路径图。
[0010]
本技术方案采用污点别名获取,解决了污点分析中的别名分析问题,实现了包含准确别名分析的android静态污点分析。
[0011]
这种方法能提升污点分析的准确率和分析效率,尤其解决因android应用特性导致的污点分析准确率下降问题。
附图说明
[0012]
图1为实施例中污点传播边构建过程示意图;图2为实施例中污点查找关联过程示意图;图3为实施例中污点传播路径示意图;图4为实施例中类方法调用验证过程示意图;图5为实施例中污点别名获取过程示意图;图6为实施例中方法的流程示意图。
具体实施方式
[0013]
下面结合附图和实施例对本发明的内容做进一步的阐述,但不是对本发明的限定。
[0014]
实施例:参照图6,一种基于污点查找关联的安卓静态污点分析装置, 所述静态污点分析装置设有顺序连接的:反编译模块:反编译模块的输入为android应用程序包apk,反编译模块用于反编译android应用程序包apk,特别是将应用程序包apk中的classes.dex字节码文件反编译为可供分析的java源码形式;分词模块:分词模块用于预处理源码即分词模块根据代码语义对代码语句进行分
词,以便后续对代码进行进一步的语义判定和分析;语义分析模块:语义分析模块采用基于污点查找关联的android静态污点分析方法和污点传播规则对分词模块处理的程序代码进行语义判定,将实际程序中的污点相关语句转化为污点传播边,并按照基于污点查找关联的android静态污点分析方法和污点传播规则对污点传播边进行关联,最终形成污点传播路径图并向外输出,其中,污点传播规则中定义如下四种语句类型:第一种直接赋值语句:“左值=右值”形式的直接赋值语句,表示由“右值”到“左值”的直接赋值;第二种方法调用语句:“方法名(参数)”形式的方法调用语句,表示调用包含实际参数“参数”、以“方法名”为名的方法;第三种返回赋值语句:“左值=方法名(参数《,

》)”形式的返回赋值语句,表示包含实际参数“参数”、以“方法名”为名的方法向“左值”返回值;第四种返回调用语句:“外部方法名(内部方法名(参数)i)”形式的返回调用语句,表示包含实际参数“参数”、以“内部方法名”为名的方法的返回值,被以“外部方法名”为名的方法作为第i个实际参数调用;所述污点传播规则包括:直接赋值传播规则:在直接赋值语句中,若等号右边变量或值为“污点”,则等号左边的变量为“新污点”;方法调用传播规则:在方法调用语句中,若被调用方法中的第i个实际参数为“污点”,则被调用方法定义中第i个形式参数为“新污点”;返回赋值传播规则:在返回赋值语句中,若被调用方法的返回值为“污点”,则等号左边的变量为“新污点”;返回调用传播规则:返回调用语句中,若内部被调用方法的返回值为“污点”、且返回值处于外部被调用方法的第i个实际参数位置,则外部被调用方法的第i个实际参数为“新污点”;污点生成判定规则:以污点源方法调用为“污点”,根据返回赋值传播规则、返回调用传播规则,若能够产生“新污点”,则认为有污点生成,否则认为没有污点生成;污点清除判定规则:在直接赋值语句中,若右值为常量或空值、左值为污点变量,则该污点被清除;污点泄露判定规则:在方法调用语句中,若被调用方法为污点汇聚点方法,且被调用的污点汇聚点方法的实际参数中包含污点,则认为产生了污点泄露;别名分析启动规则:在直接赋值语句中,若左值为对象类型,则以左值名称为目标启动别名分析;污点别名删除规则:在直接赋值语句中,若左值为污点别名,右值为该类别名以外的对象类型,则以左值名称为目标将其从别名列表中的相应位置剔除,语义分析模块中还植入有污点源/污点汇聚点列表,污点源/污点汇聚点列表用于对污点源和污点汇聚点的识别,本例依据机器学习的自动化分类方法建立污点源/污点汇聚点列表,准确的污点源/污点汇聚点列表能够提升污点分析的准确率,一种基于污点查找关联的安卓静态污点分析方法,包括上述基于污点查找关联的
android静态污点分析装置,所述方法包括如下步骤:1)导入预先由基于机器学习的自动化分类方法获得的污点源方法列表、污点汇聚方法列表;2)在完整的待分析代码中查找源方法集合中方法的调用位置,并将查找结果存储为污点起始点列表,列表中包含被查找到的完整代码行及完整代码行相关位置信息,若污点起始点列表为空即未在被分析代码中发现源方法调用,则污点分析终止;若污点起始点列表为非空,则执行步骤3);3)逐个判断步骤2)获得的污点起始点列表中产生污点的代码片段是否在污点生成后进行了传播行为,传播行为即直接赋值或作为参数传入任意被调用方法,若否,则继续对污点起始点列表中的下一个查找结果进行判断;若是,则执行步骤4),对污点起始点列表中全部查找结果完成判断后,执行步骤9);4)以步骤3)获得的进行了传播行为的污点生成代码作为起点,进行污点传播边的构建,并将该语句生成污点传播边作为第一条边构建一张新的污点传播路径图,其中,污点传播边结构为:[序号, 位置, 污点, 新污点, 类型],其中,序号表示操作语句在程序中的相对先后位置、采用代码行号,以递增的数字形式表示;位置表示操作语句所在的类名、方法名及当前被分析语句所在的选择结构,表示形式为“类名.方法名(《参数》《,参数

》)《.选择结构》”,尖括号表示尖括号内的内容为可选内容;污点表示传播边起点即需要进行分析以获取污点向后传播路径的当前污点位置,表示形式为“类名《.方法名》.变量名/方法名(《参数》《,参数》

)”,尖括号表示尖括号内的内容为可选内容;新污点表示传播边终点即分析得出的下一个污点位置,表示形式同“污点”字段;类型表示传播边的类型,包括“赋值”、“调用”、“返回”、“终止”四种类型,用于算法中针对该语句进行下一步操作决定的依据;5)依照深度优先方法查找与上一条污点传播边的“新污点”字段及“新污点”字段所指污点的污点别名有关的程序语句,并根据查找结果语句构建下一条污点传播边,若查找结果语句不在当前被分析的类中,则生成的污点传播边存入污点传播路径备用列表,否则,将构建的污点传播边直接加入污点传播路径图,若被分析污点进入当前组件的其它回调方法,假定污点不分先后地向任意一个回调方法内传播,构建一条或多条平行的、指向不同回调方法中污点的污点传播边,若查找结果为空,则当前污点传播路径图构建完成,并将构建完成的污点传播路径图加入污点传播路径图集合,返回步骤3),其中,污点传播路径备用列表为:由若干包含一条或多条污点传播边的污点传播路径段组成的集合,路径间按照路径所处的不同类方法分类,污点传播路径备用列表在类方法调用验证过程中被使用,通过验证的路径段将被加入污点传播路径图中;6)逐个判断步骤5)中查找结果语句是否包含对污点对象中类方法的调用,若是,进行类方法调用验证,所述类方法调用验证过程为:在污点传播路径构建过程中持续监测是否有污点传播路径备用列表中的备用污点传播路径对应的类方法被调用,一旦发现类方法被调用行为,则立即将备用路径转为有效的污点传播路径加入当前正在构建的污点传播
路径图中;7)逐个判断步骤5)中查找结果语句中是否有污点向对象或向对象的某个域传播,若是,则进行持续的别名获取,直至获取到当前被分析污点变量的全部别名,所述污点别名获取的过程为:当发现污点向对象传播时,以被污染的对象为目标,在当前方法内向上查找被污染的对象是否存在别名,若存在,则针对新的别名再进行别名获取,直至获取到当前被分析污点对象的全部别名、并将获取到的污点别名以集合形式返回,供步骤5)中搜索污点过程使用;8)逐个判断步骤5)中查找结果语句是否导致别名失效,若是,则从拥有失效别名的污点对应的别名列表中剔除失效的别名,返回步骤5);9)污点传播路径图集合构建完成,返回污点传播路径图集合,具体地,如图6所示,虚线方框外左侧为本例装置的输入:android应用程序包(apk),虚线方框外右侧为装置的输出:污点传播路径图;虚线方框内为本例装置的组成单元包括反编译模块、分词模块、语义分析模块。
[0015]
本例中,污点查找关联过程如图2所示,污点查找关联过程产生的污点传播路径图如图3所示,过程如下:1)发现污点源source()向tiantvalue1赋值,构建由source()到tiantvalue1的传播边;2)发现tiantvalue1作为参数被copy方法调用,构建由tiantvalue1到copy(tiantvalue1)的传播边;3)发现tiantvalue1作为参数被sink方法调用,构建由tiantvalue1到sink(tiantvalue1)的传播边,污点被泄露;4)发现tiantvalue1被赋值为常量,构建由“clear_if”到tiantvalue1的传播边,污点被清除;5)发现tiantvalue1被赋值为常量,构建由“clear_else”到tiantvalue1的传播边,污点被清除;6)tiantvalue1由实际参数转换为copy方法中形式参数,构建tiantvalue1到局部变量s的传播边;7)发现s被copy方法返回,构建s到“return s”的传播边;8)“return s”将s的值返回至copy方法被调用处,构建“return s”到copy(tiantvalue1)的传播边;9)发现copy(tiantvalue1)向tiantvalue2赋值,构建由copy(tiantvalue1)到tiantvalue2的传播边;10)发现tiantvalue2作为参数被sink方法调用,构建由tiantvalue2到sink(tiantvalue1)的传播边,污点被泄露。
[0016]
本例中,类方法调用验证过程如图4所示,过程如下:1)发现污点源source()向a.tiantvalue1赋值,构建由source()到a.tiantvalue1的传播边;2)发现a.tiantvalue1作为构造方法参数进入classb中,构建a.tiantvalue1到b
(taintvalue1, taintvalue2)的传播边;3)a.tiantvalue1由实际参数转换为b方法中形式参数,构建a.tiantvalue1到局部变量tiantvalue1的传播边;4)发现tiantvalue1向b.tiantvalue1赋值,构建由tiantvalue1到b.tiantvalue1的传播边;5)发现b.tiantvalue1向leaktaintvalue1中的t赋值,构建由b.tiantvalue1到t的传播边,但该边为备用传播边;6)发现t作为参数被sink方法调用,构建由t到sink(t)的传播边,但该边为备用传播边,污点暂时未被泄露;7)发现污点对象b中的类方法leaktaintvalue1被调用,将步骤5)、6)中构建的备用传播边加入污点传播路径图中,污点被泄露。
[0017]
本例中,污点别名获取过程如图5所示,过程如下:1)发现污点变量s向对象域taintb.taintstring传播,开始对taintb进行别名获取;2)发现taintb的别名taintbalias,开始对taintbalias进行别名获取;3)未发现taintbalias另外的别名,对taintbalias的别名获取终止;4)发现污点对象taintbalias向对象域tianta.t传播,开始对tianta进行别名获取;5)发现tainta的别名taintaalias,开始对taintaalias进行别名获取;6)未发现taintaalias另外的别名,对taintaalias的别名获取终止;7)因为taintaalias.t.taintstring在污点别名集合中,在进行污点分析时taintaalias.t.taintstring也将被视为污点进行污点传播边构建。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1