一种基于数据流分析的动静态ANDROID隐私泄露检测方法及系统

未命名 10-18 阅读:108 评论:0

一种基于数据流分析的动静态android隐私泄露检测方法及系统
技术领域
1.本发明涉及一种基于数据流分析的动静态android隐私泄露检测方法及系统,属于隐私泄露检测技术领域。


背景技术:

2.污点分析技术在数据泄露检测领域具有广泛应用。该技术首先将目标程序中的数据标记为污点或非污点,再监控污点数据的流向,根据预先指定的信息流传播策略,判断是否将非污点数据感染为污点。当污点数据最终达到指定的信息泄露点时,可以认定系统违反了信息流策略。其中,污点可称为源(source),指定的信息泄漏点可称为汇(sink)。
3.污点分析技术分为静态和动态两类。静态污点分析通过语法分析、词法分析等方式,根据自定义的污染传播策略,对程序的所有代码进行静态分析。在这种方法下,代码检测的覆盖范围非常广,容易检测深度隐藏的恶意行为,但面临着路径爆炸的问题,虚假路径容易导致许多误报。动态污点分析采用虚拟执行、动态插桩执行等方式,检测程序实际运行的特征,误报率更低,但代码检测的覆盖范围小,容易产生漏报。为了在不执行应用程序的情况下,快速地搜寻代码中可能的泄露,研究者们往往采用静态污点分析技术对apk(android application package)文件进行检测。
4.静态污点分析的目标是找到源与汇之间的连接,定义什么构成一个源和什么构成一个汇非常重要。对于隐私泄露检测领域,通常将获取用户隐私数据的api(application programming interface)定义为源点,将隐私数据向应用外部传输的api定义为汇点。
5.静态污点分析虽然开销小、覆盖面大,但由于保守的传播策略,以及对代码运行关系的不精确建模,常常伴随着较的高假阳性。
6.因此,如何克服污点分析技术中的不足,实现android隐私泄露检测是本领域技术人员急需要解决的技术问题。


技术实现要素:

7.目的:为了克服现有技术中存在的不足,本发明提供一种基于数据流分析的动静态android隐私泄露检测方法及系统,结合了静态污点检测和动态程序切片两种技术,对数据流进行二次分析,通过动态执行后的假阳性检验,降低判定结果为误报的概率,从而提高泄露检测的准确度,同时尽可能少的增加系统额外开销。
8.技术方案:为解决上述技术问题,本发明采用的技术方案为:第一方面,一种基于数据流分析的动静态android隐私泄露检测方法,包括如下步骤:步骤1:获取待检测android应用程序的源代码,遍历源代码中所有类及其子函数,将获取敏感信息的函数标记为源点,将向外界发送敏感信息的函数标记为汇点,得到所述应用程序对应的源与汇列表。
9.步骤2:根据源代码中的函数间的调用关系,以及函数内部的控制流关系,生成icfg图,将源点依次标注为污染源,模拟污染的传播。当源与汇列表中的汇点被污染,则记录所有作为污染源的源点,以一个汇点对应多个源点的方式,标记一条泄露数据流。对于每一条泄露数据流,用一个源点-汇点对标记一处隐私泄露。
10.步骤3:将获取的所有泄露数据流存放进集合plset,集合plset的元素包括《sourceset, sink》,sourceset表示源点集合,sink表示汇点。构建两个空集fpset和tpset,fpset存放假阳性泄露,tpset存放真阳性泄露。空集fpset和tpset的元素包括《source, sink》,source表示源点。
11.步骤4:将待检测android应用程序进行插桩后,安装至android模拟器,通过压力测试工具启动应用程序和ui界面输入参数的方式触发隐私泄露。获取android模拟器的全部运行日志,筛选出插桩输出语句,根据插桩输出语句获得动态执行结果。
12.步骤5:选取集合plset中任意一条泄露数据流《sourceset,sink》,判断动态执行结果中是否包括该条泄露数据流的sink,如果包括sink,则跳转至步骤6。如果不包括sink,则将该sink对应的《source,sink》加入fpset。
13.步骤6:根据动态执行结果构造程序依赖图,将包括sink的动态执行结果构造为切片准则《n,v》,其中n为切点行号,v为感兴趣的变量集合。
14.步骤7:根据程序依赖图和切片准则《n,v》进行后向切片,得到兴趣工作集,根据兴趣工作集中的切片片段,判断切片片段的标志变量flag。
15.步骤8:根据标志变量flag的值,将切片片段对应的源点、汇点二元组存放进对应的集合,得到当前泄露的最终判定结果。
16.步骤9:如果plset中每一条泄露数据流《sourceset, sink》均被访问,根据《sourceset, sink》拆分得到的每一处隐私泄露《source, sink》也均已得到判定,则返回fpset和tpset,当fpset和tpset记录了步骤2识别出的目标应用程序的所有泄露的判定结果,检测方法运行完毕。如果存在没有经过分析的泄露数据流《sourceset,sink》或隐私泄露《source,sink》,则跳转至步骤5。
17.作为优选方案,所述模拟污染的传播采用ifds算法计算图可达问题进行模拟污染的传播。
18.作为优选方案,所述步骤4,具体包括:将待检测android应用程序的字节码转换为中间表示ir。
19.对ir代码进行插桩,在每个代码基本块前插入系统日志输出语句。
20.插桩完毕后,再将ir代码转变回字节码,将签名后的apk文件安装至android模拟器。
21.通过压力测试工具启动应用程序,并触发隐私泄露,在ui界面上通过手动点击、输入方式向应用程序发送参数,进一步触发隐私泄露。
22.泄露漏洞触发完毕后,获取android模拟器的全部运行日志,筛选出其中的插桩输出语句,通过插桩输出语句,得到已运行的代码基本块的标识符以及代码基本块的动态执行顺序,即动态执行结果。
23.作为优选方案,所述步骤6,具体包括:遍历动态执行结果中每一个已运行的代码基本块,根据代码基本块的执行顺序,
构造程序依赖图。程序依赖图中的节点是每个已运行的代码基本块的语句实例,对节点进行编号,并根据代码基本块的语句实例的执行顺序在程序依赖图中添加控制流依赖和数据流依赖的边。
24.当节点对应的代码基本块的语句实例包括sink,则将该节点对应的编号作为切片准则中的n,将与sink相关的切片感兴趣的变量,存放进变量集合v,完成切片准则的生成。
25.作为优选方案,所述步骤7,具体包括:将切片准则中声明的语句实例及其变量初始化为切片的兴趣工作集。
26.在程序依赖图上根据控制流依赖和数据流依赖关系,依次将其他相关语句实例及其使用的所有变量添加进兴趣工作集,直到不能再向兴趣工作集添加相关的语句,完成后向切片。
27.兴趣工作集中所有语句实例构成了切片片段。
28.将切片片段中的语句集合存放进集合stmtset,新建标志变量flag,记录当前泄露的属性,初始化时令flag为fp,即假设当前泄露为假阳性。
29.判断切片片段的标志变量flag。
30.作为优选方案,所述判断切片片段的标志变量flag的方法,具体包括:步骤7.1、如果集合stmtset不为空,则令stmt := pop(stmtset),stmt被赋值为stmtset集合中任一语句,并将该语句从stmtset中删除。
31.步骤7.2、如果字符串匹配检测到stmt包含source,说明初始化时假设不成立,则令flag :=tp,跳转至步骤8。
32.步骤7.3、如果字符串匹配检测到stmt不包含source,则根据stmtset子元素数量跳转至步骤7.1或7.4。
33.步骤7.4、如果stmtset为空,则跳转至步骤8。
34.作为优选方案,所述步骤8,具体包括:步骤8.1、如果flag为tp,则源点、汇点二元组《source,sink》加入集合tpset,认定当前泄露真实存在。
35.步骤8.2、如果flag为fp,则源点、汇点二元组《source,sink》加入集合fpset,认定当前泄露为假阳性。
36.第二方面,一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时,实现如第一方面中任一所述的基于数据流分析的动静态android隐私泄露检测方法。
37.第三方面,一种计算机设备,包括:存储器,用于存储指令。
38.处理器,用于执行所述指令,使得所述计算机设备执行如第一方面中任一所述的基于数据流分析的动静态android隐私泄露检测方法的操作。
39.有益效果:本发明提供的一种基于数据流分析的动静态android隐私泄露检测方法及系统, 本发明首先,遍历目标应用程序的源代码来标记源点与汇点。其次,根据源与汇列表进行静态污点分析,得到潜在隐私泄露数据流。接着,根据潜在泄露数据流中的每一个汇点,以及应用程序的动态执行结果,生成相应切片准则,进行数次后向切片。最后,遍历切片生成的代码片段,检查源点是否被调用。在上述过程中,对数据流是否为假阳性进行判
定。相比于传统的污点分析方法,本发明引入动态程序切片对数据流进行二次分析,能够提取应用程序真实的执行轨迹,并且通过静态污点分析,去除了大量源与汇的冗余信息,在较少的系统开销下有效地降低了结果输出的假阳率。其优点如下:一、本发明在静态污点分析的基础上,引入动态程序切片对数据流进行二次分析,能够提取应用程序真实的执行轨迹。相比单静态污点分析,本发明提出的动静结合检测方法能够识别出误报,降低结果输出的假阳率。
40.例如:本发明的示例应用程序,静态污点分析识别出了3条潜在隐私泄露数据流,经过动态程序切片,进行假阳性检测后,1条数据流被判定为假阳性,另2条被判定为真阳性,本发明提出的方法减少了一个误报的产生。
41.二、本发明以先进行静态污点分析,后执行动态程序切片的顺序对数据流进行分析。假如先执行动态切片,则需要分析的源点-汇点对直接来源于源与汇列表,其中包含了大量的可能配对组合,这将会产生巨大的时空消耗。按现在的设计模式先执行静态污点分析,静态分析后已大大的缩小了源与汇的信息量,去除了大部分与泄露数据流无关的冗余信息,后续只需在此基础上进行数次切片,在较小的系统开销下,能够有效地降低假阳性,提升精度。
42.例如:本发明的示例应用程序,表格中展示了6个关键子函数的标记,而这仅仅是源与汇列表的一部分,所有与源代码、程序运行、服务调用等相关的库函数,均会在污点分析前被标记。本发明经过静态污点分析后,动态程序切片仅需要对3条潜在泄露数据流再作分析。
附图说明
43.图1是基于数据流分析的动静态android隐私泄露检测方法整体流程图。
44.图2是示例应用程序的源代码。
具体实施方式
45.下面结合本发明实例中的附图,对本发明实例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域技术人员在没有做创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。
46.下面结合具体实施例对本发明作更进一步的说明。
47.实施例1:
48.如图1所示,一种基于数据流分析的动静态android隐私泄露检测方法,包括如下步骤:步骤1:选定待检测的android应用程序,读取apk压缩包中对应的classes.dex、androidmanifest.xml文件,其中:classes.dex存储了经过编译的源代码,androidmanifest.xml声明了应用程序的包名、所有组件(包括活动、服务、广播接收器和内容提供器)、需要具备的权限、需要的硬件和软件功能等。遍历classes.dex源代码中所有类及其子函数,将获取敏感信息的函数标记为源点,将向外界发送敏感信息的函数标记为汇点,得到该应用程序对应的源与汇列表。
49.步骤2、根据classes.dex源代码中的函数间的调用关系,以及函数内部的控制流关系,生成icfg图,将源点依次标注为污染源,根据ifds算法计算图可达问题,模拟污染的传播。假如源与汇列表中的汇点被污染,则记录所有作为污染源的源点,以一个汇点对应多个源点的方式,标记一条泄露数据流。对于每一条泄露数据流,用一个源点-汇点对标记一处隐私泄露。
50.进一步的,一个实施例,静态污点分析问题被转化为一种特殊的图可达性问题,能够在多项式时间复杂度内被精确求解。本发明采用的求解算法为ifds(interprocedural, finite, distributive and subset)算法。ifds算法求解问题的核心思想是将数据流分析问题转化为图可达问题。ifds 算法基于过程间控制流图(icfg)进行分析,将程序转换为icfg,并对图中的每个节点上的程序状态进行分析。该算法的输入为一个由所有函数的控制流图(cfg)组成的超图,输出为所有有效路径。为了确定超图每条边的流函数,即信息流动方式,需要对污点传播策略进行定义。流函数可大致分为四类,即normal流函数, call流函数, return流函数和call-to-return流函数。针对这四种不同情况,可以自定义设置不同的污点传播规则。
51.进一步的,一个实施例,静态污点分析获取泄露数据流,是指对android应用源码进行解析,根据源与汇列表建立污点传播模型,寻找潜在泄露的过程。首先提供待分析应用对应的源与汇列表,将源点作为污染源,然后根据应用的源码构建icfg图,在图上计算污染传播,如果污染到达了汇点,则得到了一处潜在的隐私泄露数据流。
52.步骤3、将步骤2获得的所有泄露数据流存放进集合plset(potential leak set),该集合元素为二元组pl=《sourceset, sink》,由源点集合sourceset和汇点sink组成。新建两个空集fpset(false positive set)和tpset(true positive set)存放泄露数据流分类结果,fpset存放的是本检测方法在后续步骤中判定的假阳性泄露,tpset存放的是判定的真阳性泄露。这两个集合的子元素均为l=《source, sink》,即一个源点-汇点对标注的一处隐私泄露。
53.步骤4、将目标应用程序的字节码转换为中间表示ir,(intermediate representation),对ir代码进行插桩,在每个代码基本块前插入系统日志输出语句,使得应用在被执行时,能够在android运行日志中记录当前代码块对应的唯一标识符。插桩完毕后,再将ir代码转变回字节码。经过上述操作,源代码文件classes.dex已被修改,因此需要重新对应用程序进行签名。将签名后的apk文件安装至android模拟器,根据androidmanifest.xml中声明的包名,通过压力测试工具启动应用程序。在应用程序启动完毕后,在ui界面上通过手动点击、输入等方式进一步触发隐私泄露,具体触发方式与apk本身的源代码有关。应用程序启动时,以及启动后,都有可能引发隐私泄露漏洞。泄露漏洞触发完毕后,获取android模拟器的全部运行日志,筛选出其中的插桩输出语句,通过这些输出语句,可以得到已运行的代码基本块的标识符以及代码基本块的动态执行顺序,即动态执行结果。
54.进一步的,一个实施例,启动过程中会涉及许多系统操作,例如加载和初始化资源、创建进程、初始化应用程序的活动、启动服务等,这些操作可以通过压力测试工具进行模拟。
55.进一步的,一个实施例,动态执行前的插桩需要直接对源代码进行解析,其解析难
度与代码的表示形式有关。android应用的字节码原始文件classes.dex常常包括上百种不同的操作码,所有操作码都必须在数据流事实方面进行模拟。对于每个操作码,都需要单独制定规则来转换传入的数据流事实,从而使输出类似于操作码对各自数据的影响。为了降低分析的复杂性,本发明基于中间表示ir开展插桩工作。相比于字节码,ir操作码类型非常少,并且存在与字节码之间的语义完整映射。转换为ir代码虽然增加了总体代码的行数,但通过创建结构简单的语句实例,有效地减少了分析情况的数量。
56.步骤5、选取plset中任意一条泄露数据流《sourceset,sink》,对于该条泄露数据流,再任取其包含的一处隐私泄露,该隐私泄露通过一个源汇二元组《source,sink》进行描述。根据动态执行结果判断是否为假阳性。
57.进一步的,一个实施例,根据动态执行结果判断是否为假阳性,具体包括:步骤5.1、如果动态执行结果中已运行的代码基本块均不包含sink,则将源汇二元组《source,sink》加入fpset, 算法将当前泄露判断为假阳性。
58.步骤5.2、如果动态执行结果中任一已运行的代码基本块包含sink,则跳转至步骤6。
59.步骤6、根据包含sink的动态执行结果构造切片准则《n,v》,其中n为切点行号,v为感兴趣的变量集合。遍历动态执行结果中每一个已执行的代码基本块,根据这些代码块的执行顺序,构造程序依赖图。程序依赖图中的节点是每个执行的基本块的语句实例,对这些节点进行编号,并根据语句实例的执行顺序在图中添加控制流依赖和数据流依赖边。对于每一个节点代表的语句实例匹配sink,假如sink包含于该语句实例,则将该节点对应的编号作为切片准则中的n。通过正则式匹配将该语句实例自行创建或引用或接收的实际参数,即与汇点相关的切片感兴趣的变量,存放进变量集合v,完成切片准则的生成。
60.步骤7、基于步骤6生成的切片准则和程序依赖图进行后向切片,将切片准则中声明的语句实例及其变量初始化为切片的兴趣工作集,在程序依赖图上根据控制流依赖和数据流依赖关系,依次将其他相关语句实例及其使用的所有变量添加进兴趣工作集。切片过程继续执行,直到不能再向兴趣工作集添加相关的语句,完成后向切片,兴趣工作集中所有语句实例构成了切片片段。将切片片段中的语句集合存放进stmtset(statement set)。新建标志变量flag,记录当前泄露的属性(fp或tp),初始化时令flag为fp,即假设当前泄露为假阳性。如果在后续的步骤中检测到切片片段中存在源点,则说明在动态执行过程中源点到汇点的路径是可达的,源汇二元组描述的一处隐私泄露真实存在。
61.如果敏感信息到达汇点并向外界传递,则反向搜寻所有与之相关的源点,由此来定义一条隐私泄露数据流,用数据结构《sourceset,sink》表示。由于该数据结构中sink是唯一确定的,因此在步骤6中通过汇点来生成切片准则最为高效。在步骤7中仅需针对这一条切片准则进行一次切片,并在切片生成的语句实例片段中,针对a个源点进行a次字符串匹配。假如根据源点构建切片准则,则需要根据a个源点生成的a条切片准则进行a次切片操作,对于每次切片操作再进行一次汇点的字符串匹配。由于切片的时间复杂度远大于字符串匹配,因此本发明提出的切片准则生成方案是最优的。
62.程序切片是一种分解程序的分析技术,常用于代码的调试、分析、理解和重构等。其原理是根据自定义的切片准则,在源程序中删去与准则无关的指令,达到精简程序、简化分析等目的。后向切片是为了寻找程序p中对兴趣点n的变量有影响的语句和控制谓词,即
兴趣点在程序p的后端。前向切片是为了寻找程序p中有哪些语句和谓词会受到n点的变量v的值的影响,即兴趣点在程序p的前端。步骤6中切片准则是根据汇点构造的,因此在该步骤本发明仅能使用后向切片。
63.步骤7.1、如果stmtset不为空,则令stmt := pop(stmtset),即stmt被赋值为stmtset集合中任一语句,并将该语句从stmtset中删除。:=表示等于。
64.步骤7.1.1、如果字符串匹配检测到stmt包含source,说明初始化时假设不成立,则令flag :=tp,跳转至步骤8。
65.步骤7.1.2、如果字符串匹配检测到stmt不包含source,则根据stmtset子元素数量跳转至步骤7.1或7.2。
66.步骤7.2、如果stmtset为空,则跳转至步骤8。
67.进一步的,一个实施例,根据潜在泄露进行动态程序切片,是指提取数据流中的源点和汇点信息,动态执行应用程序,然后再进行后向切片,生成程序片段的过程。首先提取出潜在泄露数据流的源点和汇点信息,然后在android模拟器上动态执行应用程序,根据每一个源点-汇点对,以及动态执行结果生成相应的切片准则,进行后向切片,得到切片片段。
68.步骤8、根据标志变量flag的值,将源汇二元组存放进对应的集合,得到检测方法对当前泄露的最终判定结果。
69.步骤8.1、如果flag为tp,则源汇二元组《source,sink》加入集合tpset,算法认定当前泄露真实存在。
70.步骤8.2、如果flag为fp,则源汇二元组《source,sink》加入集合fpset,算法认定当前泄露为假阳性。
71.步骤9、如果plset中每一条泄露数据流《sourceset, sink》均被访问,根据《sourceset, sink》拆分得到的每一处隐私泄露《source, sink》也均已得到判定,则返回fpset和tpset,当fpset和tpset记录了步骤2静态污点分析识别出的目标应用程序的所有泄露的判定结果,检测方法运行完毕。如果存在没有经过分析的泄露数据流《sourceset,sink》或隐私泄露《source,sink》,则跳转至步骤5。
72.进一步的,一个实施例,数据流假阳性检测,是指根据动态程序切片结果,对潜在泄露进行二次分析,判断是否为假阳性的过程。如果动态执行日志中不存在汇点,或者切片片段中不存在源点,则方法将该条泄露数据流判定为假阳性。如果动态执行日志中存在汇点,且切片片段中存在源点,则方法将该条泄露数据流判定为真阳性。
73.实施例2:
74.本发明选取开源基准测试套件droidbench 3.0中的应用activityevent-sequence1.apk进一步说明基于数据流分析的动静态android隐私泄露检测方法,而不能以此来限制本发明的保护范围。
75.图2是本发明选取的示例android应用程序对应的源代码。只有在调用onresume时触发了信息泄露,在调用onstart和onrestoreinstancestate时均不会触发。
76.步骤1:在遍历源代码中所有类及其子函数时,根据函数体内容,将4个经过重写的回调函数,及其内部调用的库函数,按类标记为源点或汇点。
77.表1描述了所有关键函数的标记结果,其中序号为5的函数被标记为源点,其他函数均被标记为汇点。
78.表1为所有关键函数的标记结果
79.步骤2:在示例程序的icfg图上计算污点传播路径,当污染传播至步骤1中标记的汇点时,则将对应的数据流认定为潜在的隐私泄露,将描述泄露数据流的二元组《sourceset, sinkset》存储进集合plset,完成静态污点分析。
80.表2描述了静态污点分析发现的3条潜在泄露数据流,源点均为getdeviceid函数,汇点分别为onresume、onstart和onrestoreinstancestate函数。
81.表2为静态污点分析结果
82.步骤3:在模拟器上运行示例应用程序,在动态执行结果中搜索plset中存储的所有汇点,发现onstart和onresume均被触发,而onrestoreinstancestate没有被触发,因此将第3条潜在泄露数据流判定为假阳性。
83.步骤4:分别对onstart和onresume生成对应的切片准则,并进行后向切片。
84.表3描述了对两个汇点分别生成切片准则的依据,onstart对应的切片准则为《12, 所有变量集合》,onresume对应的切片准则为《18, 所有变量集合》。
85.表3为生成切片准则的依据
86.步骤5、根据步骤4生成的切片准则,依次进行两次后向切片,在两次生成的不同程序片段中,搜索源点getdeviceid。
87.表4描述了第一次后向切片的结果,切片准则为根据汇点onstart生成的《12, 所有变量集合》,在片段序号4中调用了源点getdeviceid,因此将该条泄露数据流判定为真阳性。同理,在第二次后向切片结果中也发现了源点getdeviceid,因此到达汇点onresume的数据流也被判定为真阳性。至此,本发明对三条潜在隐私数据流均进行了二次分析,将其中
一条判定为假阳性,另两条判定为真阳性。
88.表4后向切片的结果
89.实施例3:本实施例介绍一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时,实现如实施例1中任一所述的基于数据流分析的动静态android隐私泄露检测方法。
90.实施例4:
91.本实施例介绍一种计算机设备,包括:存储器,用于存储指令。
92.处理器,用于执行所述指令,使得所述计算机设备执行如实施例1中任一所述的基于数据流分析的动静态android隐私泄露检测方法的操作。
93.本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
94.本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流
程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
95.这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
96.这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
97.以上所述仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。

技术特征:
1.一种基于数据流分析的动静态android隐私泄露检测方法,其特征在于:包括如下步骤:步骤1:获取待检测android应用程序的源代码,遍历源代码中所有类及其子函数,将获取敏感信息的函数标记为源点,将向外界发送敏感信息的函数标记为汇点,得到所述应用程序对应的源与汇列表;步骤2:根据源代码中的函数间的调用关系,以及函数内部的控制流关系,生成icfg图,将源点依次标注为污染源,模拟污染的传播;当源与汇列表中的汇点被污染,则记录所有作为污染源的源点,以一个汇点对应多个源点的方式,标记一条泄露数据流;对于每一条泄露数据流,用一个源点-汇点对标记一处隐私泄露;步骤3:将获取的所有泄露数据流存放进集合plset,集合plset的元素包括<sourceset, sink>,sourceset表示源点集合,sink表示汇点;构建两个空集fpset和tpset,fpset存放假阳性泄露,tpset存放真阳性泄露;空集fpset和tpset的元素包括<source, sink>,source表示源点;步骤4:将待检测android应用程序进行插桩后,安装至android模拟器,通过压力测试工具启动应用程序和ui界面输入参数的方式触发隐私泄露;获取android模拟器的全部运行日志,筛选出插桩输出语句,根据插桩输出语句获得动态执行结果;步骤5:选取集合plset中任意一条泄露数据流<sourceset,sink>,判断动态执行结果中是否包括该条泄露数据流的sink,如果包括sink,则跳转至步骤6;如果不包括sink,则将该sink对应的<source,sink>加入fpset;步骤6:根据动态执行结果构造程序依赖图,将包括sink的动态执行结果构造为切片准则<n,v>,其中n为切点行号,v为感兴趣的变量集合;步骤7:根据程序依赖图和切片准则<n,v>进行后向切片,得到兴趣工作集,根据兴趣工作集中的切片片段,判断切片片段的标志变量flag;步骤8:根据标志变量flag的值,将切片片段对应的源点、汇点二元组存放进对应的集合,得到当前泄露的最终判定结果;步骤9:如果plset中每一条泄露数据流<sourceset, sink>均被访问,根据< sourceset, sink>拆分得到的每一处隐私泄露<source, sink>也均已得到判定,则返回fpset和tpset,当fpset和tpset记录了步骤2识别出的目标应用程序的所有泄露的判定结果,检测方法运行完毕;如果存在没有经过分析的泄露数据流<sourceset,sink>或隐私泄露<source,sink>,则跳转至步骤5。2.根据权利要求1所述的一种基于数据流分析的动静态android隐私泄露检测方法,其特征在于:所述模拟污染的传播采用ifds算法计算图可达问题进行模拟污染的传播。3.根据权利要求1所述的一种基于数据流分析的动静态android隐私泄露检测方法,其特征在于:所述步骤4,具体包括:将待检测android应用程序的字节码转换为中间表示ir;对ir代码进行插桩,在每个代码基本块前插入系统日志输出语句;插桩完毕后,再将ir代码转变回字节码,将签名后的apk文件安装至android模拟器;通过压力测试工具启动应用程序,并触发隐私泄露,在ui界面上通过手动点击、输入方式向应用程序发送参数,进一步触发隐私泄露;
泄露漏洞触发完毕后,获取android模拟器的全部运行日志,筛选出其中的插桩输出语句,通过插桩输出语句,得到已运行的代码基本块的标识符以及代码基本块的动态执行顺序,即动态执行结果。4.根据权利要求1所述的一种基于数据流分析的动静态android隐私泄露检测方法,其特征在于:所述步骤6,具体包括:遍历动态执行结果中每一个已运行的代码基本块,根据代码基本块的执行顺序,构造程序依赖图;程序依赖图中的节点是每个已运行的代码基本块的语句实例,对节点进行编号,并根据代码基本块的语句实例的执行顺序在程序依赖图中添加控制流依赖和数据流依赖的边;当节点对应的代码基本块的语句实例包括sink,则将该节点对应的编号作为切片准则中的n,将与sink相关的切片感兴趣的变量,存放进变量集合v,完成切片准则的生成。5.根据权利要求1所述的一种基于数据流分析的动静态android隐私泄露检测方法,其特征在于:所述步骤7,具体包括:将切片准则中声明的语句实例及其变量初始化为切片的兴趣工作集;在程序依赖图上根据控制流依赖和数据流依赖关系,依次将其他相关语句实例及其使用的所有变量添加进兴趣工作集,直到不能再向兴趣工作集添加相关的语句,完成后向切片;兴趣工作集中所有语句实例构成了切片片段;将切片片段中的语句集合存放进集合stmtset,新建标志变量flag,记录当前泄露的属性,初始化时令flag为fp,即假设当前泄露为假阳性;判断切片片段的标志变量flag。6.根据权利要求5所述的一种基于数据流分析的动静态android隐私泄露检测方法,其特征在于:所述判断切片片段的标志变量flag的方法,具体包括:步骤7.1、如果集合stmtset不为空,则令stmt := pop(stmtset),stmt被赋值为stmtset集合中任一语句,并将该语句从stmtset中删除;步骤7.2、如果字符串匹配检测到stmt包含source,说明初始化时假设不成立,则令flag :=tp,跳转至步骤8;步骤7.3、如果字符串匹配检测到stmt不包含source,则根据stmtset子元素数量跳转至步骤7.1或7.4;步骤7.4、如果stmtset为空,则跳转至步骤8。7.根据权利要求1所述的一种基于数据流分析的动静态android隐私泄露检测方法,其特征在于:所述步骤8,具体包括:步骤8.1、如果flag为tp,则源点、汇点二元组<source,sink>加入集合tpset,认定当前泄露真实存在;步骤8.2、如果flag为fp,则源点、汇点二元组<source,sink>加入集合fpset,认定当前泄露为假阳性。8.一种计算机可读存储介质,其特征在于:其上存储有计算机程序,该计算机程序被处理器执行时,实现如权利要求1-7中任一所述的基于数据流分析的动静态android隐私泄露检测方法。
9.一种计算机设备,其特征在于:包括:存储器,用于存储指令;处理器,用于执行所述指令,使得所述计算机设备执行如权利要求1-7中任一所述的基于数据流分析的动静态android隐私泄露检测方法的操作。

技术总结
本发明公开了一种基于数据流分析的动静态ANDROID隐私泄露检测方法及系统,遍历目标应用程序的源代码来标记源点与汇点。根据源与汇列表进行静态污点分析,得到潜在隐私泄露数据流。根据潜在泄露数据流中的每一个汇点,以及应用程序的动态执行结果,生成相应切片准则,进行数次后向切片。遍历切片生成的代码片段,检查源点是否被调用。本发明在上述过程中,对数据流是否为假阳性进行判定。相比于传统的污点分析方法,本发明引入动态程序切片对数据流进行二次分析,能够提取应用程序真实的执行轨迹,并且通过静态污点分析,去除了大量源与汇的冗余信息,在较少的系统开销下有效地降低了结果输出的假阳率。了结果输出的假阳率。了结果输出的假阳率。


技术研发人员:王田田 张迎周 马锐 谢金言 李俊锋
受保护的技术使用者:南京邮电大学
技术研发日:2023.07.07
技术公布日:2023/10/15
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐