首页 / 专利库 / 软件 / 控制流图 / 基于静态污点数据分析的隐私泄漏漏洞检测确认方法

基于静态污点数据分析的隐私泄漏漏洞检测确认方法

阅读:941发布:2020-05-15

专利汇可以提供基于静态污点数据分析的隐私泄漏漏洞检测确认方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种检测Android应用 软件 APP是否存在隐私 泄漏 漏洞的方法,主要解决 现有技术 检测漏洞速度慢、检测环境要求高和检测准确率低的问题。其实现过程是:配置优化检测文件,限定检测的Android 应用软件 APP的组件和回调,对限定的组件和回调进行静态污点数据流分析,得出污点数据流路径;进一步对污点路径处理,建立函数 节点 序列,扩展填充函数节点,并进行 剪枝 和压缩处理,将处理后的函数节点连接形成详细污点数据流动路径;对详细污点数据流动路径进行去重处理,再图形化输出。本发明提高了对Android应用软件APP隐私漏洞检测的速度,降低了对检测环境的要求和漏洞重现的难度,使得漏洞分析更加快速和准确。,下面是基于静态污点数据分析的隐私泄漏漏洞检测确认方法专利的具体信息内容。

1.基于静态污点数据分析的隐私泄漏漏洞检测确认方法,包括:
1)查找污点数据流动路径:
1a)输入需要检测的Android应用软件APP、APP应用编程接口API对应的android.jar包路径和配置文件,该配置文件包括:
入口配置文件,用于限定检测的Android应用软件APP的组件,且通过组件类别和组件签名两种方式限定;
污点数据规则文件,用于定义污点数据源和泄漏端点;
回调配置文件,用于限定检测Android应用软件APP的回调函数,且通过回调类别和回调函数签名两种方式限定;
1b)根据配置规则文件,建立待检测组件列表,并将回调列表文件中配置的回调绑定到对应组件上;解析Android应用程序APP,根据解析结果,删除配置文件中无效的组件和回调,再根据待检测组件列表、待检测回调列表建立模拟主函数;
1c)根据模拟主函数,构建过程间控制流图ICFG和控制流图CFG,根据过程间控制流图ICFG,建立过程间数据流图;
1d)根据过程间控制流图ICFG和过程间数据流图,对待检测的组件进行污点数据传播路径分析,搜索原始污点数据传播路径;
2)污点数据流动路径分析处理:
2a)使用1c)输出的过程间控制流图ICFG,根据原始污点数据传播路径,建立函数节点序列;
2b)对函数节点序列中的每个函数节点进行处理,根据控制流图CFG和原始污点数据传播路径,构建函数内部路径,使用构建出的函数内部路径填充函数节点;
2c)对填充后的函数节点序列中的每个函数节点进行类型分析和剪枝处理,得到剪枝压缩后的函数节点序列;
2d)将函数节点序列中的函数节点进行拼接,得到原始污点数据流动路径所对应的详细污点传播路径;
2e)对详细的污点数据传播路径进行去重处理,得到最终的详细污点传播路径;
3)图形化输出处理:
3a)根据详细污点传播路径,建立Dot图形数据,输出污点传播路径对应的图形文件;
3b)根据图形文件,判定Android应用软件APP内部是否存在未过滤掉的能达到泄漏端点的逻辑分支:如果存在,则此处存在隐私泄漏漏洞,且该漏洞的输入能够找到,如果不存在,则该污点数据传播路径为假阳性路径,不是漏洞。
2.根据权利要求1所述的方法,其特征在于,步骤1a)中的配置文件,是可在具体检测Android应用软件APP之前自动生成,且自动生成的配置文件包含了Android应用软件APP中所有的组件和回调列表,自动生成配置文件的步骤如下:
1a1)指定需要预处理的Android应用程序APP,解析Android应用程序APP的Manifest清单文件,得到注册到清单文件中的组件列表,记为FAI_Set;
1a2)建立回调列表,记为FC_Set;FC_Set列表中的元素为<组件I,回调J>的二元组,表示组件I中存在回调J,初始时,回调列表为空;
1a3)建立备份组件列表,记为FAB_Set,初始时,FAB_Set为空;建立组件全集列表,记为FA_Set,将FAI_Set中的内容加入到FA_Set中;
1a4)从FAI_Set中取出一个组件,记为ComponentI,分析ComponentI中的每行代码,寻找是否有通过程序代码动态注册的组件或是回调,将找到的动态注册的组件加入到FAB_Set中,将找到的注册的回调加入到FC_Set中;
1a5)重复1b4),直到FAI_Set中的所有组件都被处理完毕,此时,将FAB_Set中的内容加入到FA_List中,清空FAI_Set,然后将FAB_Set中的内容加入到FAI_Set中,再清空FAB_Set;
1a6)按照步骤1b4)对FAI_List进行处理,处理完后,将新得到FAB_Set中的内容加入到FA_Set中,此时得到的FA_Set为Android应用程序APP组件全集列表,输出到入口配置文件中,将得到的FC_Set输出到回调配置文件中。
3.根据权利要求1所述的方法,其特征在于,步骤2a)中根据原始污点数据传播路径,建立函数节点序列,按如下步骤进行:
2a1)逆序处理原始污点传播路径语句序列中的语句节点,记当前处理的语句节点为s_cur,语句s_cur属于函数f_cur;在原始污点传播路径语句序列中,语句s_cur的前一条语句为s_prev,语句s_prev属于函数f_prev;初始时,s_cur为原始污点传播路径语句序列中的最后一条语句;定义操作操作getPrev(stmt)为在原始污点传播路径语句序列中取stmt语句的前一条语句;定义操作getFunc(stmt)为获取stmt语句所在的函数;
2a2)判定s_cur的值,如果s_cur为空,即处理完了原始污点传播路径语句序列中的所有语句,已经建立好了函数节点序列,结束处理;如果s_cur不为空,则继续处理,进入到
2a3)
2a3)为函数f_cur建立一个函数节点,记为Fnode;
2a4)比较f_cur和f_prev的值,如果f_cur和f_prev不是同一个函数,则将语句s_cur添加到Fnode函数节点所关联的污点数据处理语句集合中,更新s_cur、f_cur,s_prev,f_prev,使得s_cur=s_prev,f_cur=f_prev,s_prev=getPrev(s_prev),f_prev=getFunc(s_prev),跳到2a2)继续处理;如果f_cur和f_prev是同一个函数,则在原始污点传播路径语句序列中,从s_prev语句开始,向前依次搜索,搜索到一条满足特定条件的语句,记为s_prev_new,使得f_cur!=getFunc(s_prev_new),然后将原始污点传播路径语句序列中的子序列(s_prev_new,s_cur]加入到Fnode函数节点所关联的污点数据处理语句集合中,更新s_prev和f_prev,使得s_prev=s_prev_new,f_prev=getFunc(s_prev_new),跳到2a2)继续处理。
4.根据权利要求1所述的方法,其特征在于,步骤2b)中根据控制流图CFG和原始污点数据传播路径,构建函数内部路径,按如下步骤进行:
2c1)将原始污点路径中的语句节点作为对应的函数节点的终点语句,如果该语句为函数返回语句,则进行重定位,然后将重定位的语句作为终点语句;
2c2)通过控制流图CFG,找到函数节点的入口语句;
2c3)在控制流图CFG上使用树的搜索遍历算法,搜索遍历从入口语句到终点语句之间的可达路径,如果CFG中存在环路,导致树的搜索遍历进入死循环,则通过设定单条搜索分支的最大步数来评定是否舍弃该路径,如果单条搜索分支步数达到最大值,则舍弃该路径,即跳出该环路,否则,继续搜索。
5.根据权利要求1所述的方法,其特征在于,步骤2e)中对详细的污点数据传播路径进行去重处理,步骤如下:
2d1)在拼接后的路径中,搜索返回类型函数节点,以返回类型函数节点为中心,检测最长“调用-返回”函数节点的子序列;
2d2)在最长“调用-返回”函数节点子序列中,参照调用函数节点,删除对应返回函数节点中的重复语句节点。
6.根据权利要求1所述的方法,其特征在于,步骤3a)中根据详细污点传播路径,建立Dot图形数据,步骤如下:
3a1)为污点数据传播路径中的语句节点添加图形节点、有向边节点,并根据语句节点类型,为图形节点添加属性数据;如果语句节点为分支语句,则需要为分支语句的所有目标语句添加图形节点和有向边节点;
3a2)在污点数据传播路径中的函数节点间,插入有向边节点,有向边的起点为上一个函数节点的终点语句,有向边的端点为下一个函数节点的入口语句。

说明书全文

基于静态污点数据分析的隐私泄漏漏洞检测确认方法

技术领域

[0001] 本发明属于信息安全技术领域,特别涉及一种隐私泄漏检测方法,可用于检测分析安卓手机应用软件是否泄漏用户隐私数据,存在隐私泄漏类漏洞。

背景技术

[0002] 随着移动互联网的迅速发展,智能手机设备迅速得到普及,安卓系统在整个手机市场的占有率更是高达2/3,而且市场占有率还在不断稳步提升。Android系统作为一个开放的平台,被安装的应用在安装时,用户给与了相应的权限后,应用就能自由的获取相应的隐身数据,用户对这些数据的使用情况一无所知,无论这些应用是普通的应用还是恶意的应用。
[0003] 现有的分析方法,从程序是否执行的层面上可以分为两大类分析方法:静态分析方法和动态分析方法,其中:
[0004] 静态分析是指在被分析程序不运行的基础上,扫描分析目标程序的源代码或者可执行代码以推测目标程序运行时的信息,并通过具体的程序抽象假设和相似性模拟,来检测目标程序存在的问题。通常静态分析会通过比较保守的抽象假设来覆盖所有的可能性。
[0005] 动态程序分析的主要思想是使程序在模拟环境或者真实环境中,通过在程序的运行过程中检测观察程序的运行状况对安全和性能等方面进行考察。在程序动态分析中,可以通过一些自动化工具来记录、监视和统计程序的运行状况。
[0006] 污点分析作为新兴的安全性分析方法,主要原理是将来自用户输入或是网络等不被信任的渠道的数据标记为“污点”数据,并且对“污点”数据进行算术或逻辑操作产生的新数据也会被标记为“污点”数据,检测应用程序中的“污点”数据的流动,得到“污点”数据流动路径,然后对“污点”数据流动路径分析,将匹配特定规则的“污点”数据流动路径判定为非法操作;在针对隐私数据泄露环境,“污点”数据就是用户隐私数据,如通讯录数据、地理位置数据。
[0007] 由于Android应用软件APP是基于用户响应的交互型应用,采用动态的污点分析必须要达到一定的代码覆盖率才能达到较好的检测效果,但是对于基于用户响应的交互性应用,自动的、无需人工干预的动态污点检测是很难做到的,例如事件的检测、事件触发模拟、事件的收集这些均属技术难点。由于以上原因,在对Android APP进行污点分析时,主要还是使用的静态污点分析。现有的静态污点分析主要有以下三个技术难点:
[0008] 一:无法快速有效的进行检测。
[0009] 现在的APP支持的功能越来越复杂,这直接导致APP代码量大,逻辑复杂;同时由于现在的APP注重用户体验,使得原本简单的代码不再适用,而是需要做多方面的处理来满足APP 的快速响应、提高用户体验的需求,这些因素使得APP的代码量大,逻辑复杂;代码量大、逻辑复杂使得分析的数据量直线上升,导致检测过程速度慢、检测出现异常。
[0010] 二:污点分析中的误报率高。
[0011] 对于静态的污点分析来说,由于并不实际运行APP,只是按照相关规则追踪污点数据在程序中可能的流向,这就存在两种误报情况:一是假阳性,即在APP中检测到符合规则的污点数据流动路径,但是在实际程序运行时,这条路径却是不可达的;二是假阴性,即APP中存在符合规则的污点数据流动,但是系统却检测不到。
[0012] 三:难以找到合适的输入数据,不能实现漏洞重现。
[0013] 对于漏洞检测系统来说,除了需要说明该APP是否存在漏洞,还需要输出检测到的数据流动的详细过程,并能够提供重现漏洞的输入,这不仅有利于确认漏洞的真实性,排除假阳性的测试的结果,同时方便开发人员找到修复漏洞的方案。为了找到合适的能够重现漏洞的输入数据,这就需要不仅仅追踪污点数据的流动,还需要收集追踪从APP入口位置到污点数据引入这段的详细的程序流动过程和收集需要满足的程序分析判断条件,而这些额外数据的收集、追踪是比较困难的,影响漏洞重现。

发明内容

[0014] 本发明的目的在于针对上述现污点数据追踪检测方案的不足,提出一种基于静态污点数据分析的隐私泄漏类漏洞检测确认方法,以提高检测的速度,降低污点数据传播详细路径的复杂度,并输出可视化的详细污点传播路径,帮助确认漏洞和重现漏洞。
[0015] 本发明的技术思路是:通过采用组件分离和配置定制检测规则策略,提高检测速度;通过采用图深度优先搜索算法,得出污点数据传播的详细路径;通过采用路径剪枝、修正策略,减少路径的复杂度;通过采用图形式,输出可视化的详细污点传播路径,帮助确认漏洞、找到合适的输入,重现漏洞。
[0016] 根据上述思路本发明的实现步骤包括如下:
[0017] 1)查找污点数据流动路径:
[0018] 1a)输入需要检测的Android应用软件APP、APP应用编程接口API对应的android.jar 包路径和配置文件,该配件文件包括:
[0019] 入口配置文件,用于限定检测的Android应用软件APP的组件,且通过组件类别和组件签名两种方式限定;当某个组件不符合入口配置文件规则,则检测时忽略该组件,即该组件相关代码都不会进行分析处理;
[0020] 污点数据规则文件,用于定义污点数据源规则和泄漏端点规则;当被测试的android应用程序中的数据匹配污点数据源规则时,会被标记为“污点”数据,该“污点”数据在Android 应用程序位置称为泄露源点;当被测试的android应用程序对“污点”数据的处理方式匹配泄漏端点规则时,该处理方式在Android应用程序中位置被标记为泄露端点;从泄露源点到泄露端点之前的可达路径称为污点数据传播路径;
[0021] 回调配置文件,用于限定检测Android应用软件APP的回调函数,且通过回调类别和回调函数签名两种方式限定;当某个回调不符合回调配置文件规则,则检测时忽略该回调,该回调相关代码都不会进行分析处理;
[0022] 1b)根据配置规则文件,建立待检测组件列表,并将回调列表文件中配置的回调绑定到对应组件上;解析Android应用程序APP,根据解析结果,删除配置文件中无效的组件和回调,再根据待检测组件列表、待检测回调列表建立模拟主函数;
[0023] 1c)根据模拟主函数,构建过程间控制流图ICFG和控制流图CFG,根据过程间控制流图 ICFG,建立过程间数据流图;
[0024] 1d)根据过程间控制流图ICFG和过程间数据流图,对待检测的组件进行污点数据传播路径分析,搜索原始污点数据传播路径;
[0025] 2)污点数据流动路径分析处理:
[0026] 2a)使用1c)输出的过程间控制流图ICFG,根据原始污点数据传播路径,建立函数节点序列;
[0027] 2b)对函数节点序列中的每个函数节点进行处理,根据控制流图CFG和原始污点数据传播路径,构建函数内部路径,使用构建出的函数内部路径填充函数节点;
[0028] 2c)对填充后的函数节点序列中的每个函数节点进行类型分析和剪枝处理,得到剪枝压缩后的函数节点序列;
[0029] 2d)将函数节点序列中的函数节点进行拼接,得到原始污点数据流动路径所对应的详细污点传播路径;
[0030] 2e)对详细的污点数据传播路径进行去重处理,得到最终的详细污点传播路径;
[0031] 3)图形化输出处理:
[0032] 3a)根据详细污点传播路径,建立图形数据,输出污点传播路径对应的图形文件;
[0033] 3b)根据图形文件,判定Android应用软件APP内部是否存在未过滤掉的能达到泄漏端点的逻辑分支:如果存在,则此处存在隐私泄漏漏洞,且该漏洞的输入能够找到,如果不存在,则该污点数据传播路径为假阳性路径,不是漏洞。
[0034] 本发明具有如下优点:
[0035] 1)本发明通过引入优化配置文件,使用户可以做个性化测试配置;
[0036] 2)本发明通过限定检测的Android应用软件APP的组件和回调,以及使用组件串接的检测方式,减低了Android应用软件APP的规模,降低了系统对内存的需求,提高了检测速度和正确率;
[0037] 3)本发明通过在控制流图CFG上使用树的搜索算法,并通过设置设定单条搜索分支的最大步数来避免图的环路问题,降低了系统的复杂度和内存需求;
[0038] 4)本发明通过对函数节点进行剪枝和去重,降低了污点传播路径的复杂度;
[0039] 5)本发明通过输出污点传播路径图帮助确认隐私泄漏漏洞,可找到漏洞的输入,减少了误报率。附图说明
[0040] 图1为本发明的实现流程图
[0041] 图2为对恶意Android应用程序APP经过查找污点数据流动路径步骤处理后得出的原始数据流动路径示例图;
[0042] 图3为对函数节点进行剪枝和压缩路径处理过程示例图;
[0043] 图4为用本发明检测示例Android应用程序APP所得出一个结果图。;

具体实施方式

[0044] 以下结合附图对本发明作详细描述。
[0045] 参照图1,本发明的实现步骤如下:
[0046] 步骤1,查找污点数据流动路径。
[0047] 1a)配置污点数据规则文件,配置方式为指定引入污点数据的函数签名和目标端点函数签名;
[0048] 1b)配置入口配置文件,该配置文件中的组件为待测试组件,在配置该文件时,可先自动生成一份配置文件,该配置文件包含了Android应用软件APP中所有的组件列表,用户再在该自动生成的配置文件的基础上修改,自定义配置;自动生成配置文件可在检测Android应用程序APP之前进行,属于预处理步骤,自动生成配置文件的步骤如下:
[0049] 1b1)指定需要预处理的Android应用程序APP,解析Android应用程序APP的Manifest 清单文件,得到注册到清单文件中的组件列表,记为FAI_Set;
[0050] 1b2)建立回调列表,记为FC_Set;FC_Set列表中的元素为<组件I,回调J>的二元组,表示组件I中存在回调J,初始时,回调列表为空;
[0051] 1b3)建立备份组件列表,记为FAB_Set,初始时,FAB_Set为空;建立组件全集列表,记为FA_Set,将FAI_Set中的内容加入到FA_Set中;
[0052] 1b4)从FAI_Set中取出一个组件,记为ComponentI,分析ComponentI中的每行代码,寻找是否有通过程序代码动态注册的组件或是回调,将找到的动态注册的组件加入到FAB_Set 中,将找到的注册的回调加入到FC_Set中;
[0053] 1b5)重复1b4),直到FAI_Set中的所有组件都被处理完毕,此时,将FAB_Set中的内容加入到FA_List中,清空FAI_Set,然后将FAB_Set中的内容加入到FAI_Set中,再清空 FAB_Set;
[0054] 1b6)按照步骤1b4)对FAI_List进行处理,处理完后,将新得到FAB_Set中的内容加入到FA_Set中,此时得到的FA_Set为Android应用程序APP组件全集列表,输出到入口配置文件中,将得到的FC_Set输出到回调配置文件中;
[0055] 1c)配置回调配置文件,该配置文件中的回调为待测试回调,与配置入口文件相同,可先自动生成的一份配置文件,该配置文件包含了Android应用软件APP中所有回调列表,用户再在该自动生成的文件的基础上修改,自定义配置;
[0056] 1d)指定需要检测的Android应用软件APP、APP应用编程接口API对应的android.jar 包路径;
[0057] 1e)开始污点数据流动路径分析,解析Android应用软件APP的Manifest清单文件,获取待检测的Android应用软件APP实际的组件全集列表,记为FA_Actual_Set;初步解析 Android应用软件APP,获取Android应用软件APP实际的回调列表,记为FC_Actual_Set;
[0058] 1f)解析入口配置文件,建立配置的待检测组件列表,记为FA_Config_Set,解析回调配置文件,建立待检测回调列表,记为FC_Config_Set,根据FA_Actual_Set和FC_Actual_Set,通过删除FA_Config_Set和FC_Config_Set中的无效组件或是无效回调,对FA_Config_Set 和FC_Config_Set进行修正,修正具体步骤如下:
[0059] 1f1)取FA_Config_Set和FA_Actual_Set的交集,记为FA_Inter_Set;
[0060] 1f2)将FA_Inter_Set的内容赋给FA_Config_Set,即FA_Config_Set=FA_Inter_Set;
[0061] 1f3)FC_Config_Set集合中的元素进行处理:如果元素∈ FC_Config_Set,但ComponentI不属于FA_Config_Set,则从FC_Config_Set中删除 
[0062] 1g)根据FA_Config_Set和FC_Config_Set,建立被测Android应用软件APP的模拟主函数,以该主函数为Android应用软件APP的主函数;该模拟主函数中包涵了调用 FA_Config_Set中组件的代码,同时包涵了调用FC_Config_Set中回调函数的代码;FA_Config_Set集合中的组件相关的代码和FC_Config_Set集合中的回调相关的代码成为可达代码;不在FA_Config_Set集合中的组件和不在FC_Config_Set中的回调不会出现在模拟主函数,这些组件或是回调相关的代码会成不可达代码,不会被处理;
[0063] 1h)以模拟主函数为入口,解析可达的Android应用软件中的程序代码,并在解析过程中,根据用户设置的隐私泄露路径规则,找到所有的污点数据泄露源点和泄露端点;
[0064] 1i)根据模拟主函数,建立可达的Android应用软件APP程序的过程间控制流图ICFG和控制流图CFG;
[0065] 1j)根据过程间控制流图ICFG和控制流图CFG建立过程间数据流图,在过程间数据流图上,搜索查找污点数据泄露源点到泄露端点之间的可达路径,并输出过程间控制流图ICFG和原始污点数据流动路径,原始污点数据流动路径为一个语句序列。
[0066] 步骤2,污点数据流动路径分析处理。
[0067] 2a)逆序遍历原始污点传播路径语句序列,建立一个函数节点序列;建立函数节点序列步骤如下:
[0068] 2a1)逆序处理原始污点传播路径语句序列中的语句节点,记当前处理的语句节点为 s_cur,语句s_cur属于函数f_cur;在原始污点传播路径语句序列中,语句s_cur的前一条语句为s_prev,语句s_prev属于函数f_prev;初始时,s_cur为原始污点传播路径语句序列中的最后一条语句;定义操作操作getPrev(stmt)为在原始污点传播路径语句序列中取stmt 语句的前一条语句;定义操作getFunc(stmt)为获取stmt语句所在的函数;
[0069] 2a2)判定s_cur的值,如果s_cur为空,即处理完了原始污点传播路径语句序列中的所有语句,已经建立好了函数节点序列,结束处理;如果s_cur不为空,则继续处理,进入到2a3)
[0070] 2a3)为函数f_cur建立一个函数节点,记为Fnode;
[0071] 2a4)比较f_cur和f_prev的值,如果f_cur和f_prev不是同一个函数,则将语句s_cur 添加到Fnode函数节点所关联的污点数据处理语句集合中,更新s_cur、f_cur,s_prev,f_prev, 使得s_cur=s_prev,f_cur=f_prev,s_prev=getPrev(s_prev),f_prev=getFunc(s_prev), 跳到2a2)继续处理;如果f_cur和f_prev是同一个函数,则在原始污点传播路径语句序列中,从s_prev语句开始,向前依次搜索,搜索到一条满足特定条件的语句,记为s_prev_new, 使得f_cur!=getFunc(s_prev_new),然后将原始污点传播路径语句序列中的子序列 (s_prev_new,s_cur]加入到Fnode函数节点所关联的污点数据处理语句集合中,更新s_prev 和f_prev,使得s_prev=s_prev_new,f_prev=getFunc(s_prev_new),跳到2a2)继续处理;
[0072] 2a5)使用图2所示的简单恶意Android应用程序APP来说明改步处理结果;在图2所示的程序片段中,main函数在获取了污点数据后,对污点数据进行了简单处理,然后将污点数据发送到网络中;经过查找污点数据流动路径步骤处理,得到的原始污点数据流动路径语句序列为(Stmt i,Stmt j,Stmt q,Stmt r,Stmt y,Stmt z,Stmt t),其中Stmt i,Stmt j 属于同一个函数,Stmt q,Stmt r,Stmt t属于同一个函数,Stmt z,Stmt t属于同一个函数,最终建立的函数节点序列为(main,processTaint,reprocessTaint,processTaint);
[0073] 2b)填充函数节点序列中的每个函数节点,填充函数节点步骤如下:
[0074] 2b1)记当前处理的函数节点为Fnode,获取Fnode所关联的污点数据处理语句集合,记为F_taint_stmt,根据过程间控制流图ICFG,找到Fnode函数节点对应的控制流图CFG;
[0075] 2b2)将F_taint_stmt集合中的最后一条语句作为Fnode函数节点的终点语句,如果该语句为函数返回语句,则进行重定位,然后将重定位的语句作为终点语句;
[0076] 2b3)通过控制流图CFG,找到Fnode函数节点的入口语句;
[0077] 2b4)在控制流图CFG上使用树的搜索遍历算法,搜索遍历从入口语句到终点语句之间的可达路径,如果CFG中存在环路,导致树的搜索遍历进入死循环,则通过设定单条搜索分支的最大步数来评定是否舍弃该路径,如果单条搜索分支步数达到最大值,则舍弃该路径,即跳出该环路,否则,继续搜索;
[0078] 2b5)使用搜索到的从入口语句到终点语句之间的可达路径填充函数节点;
[0079] 2c)对填充后的函数节点序列中的每个函数节点进行类型分析和剪枝处理,得到剪枝压缩后的函数节点序列,对每个函数节点的处理步骤如下:
[0080] 2c1)建立分支条件变量集合,记为args_set,记当前处理的函数节点为Fnode,将Fnode 函数节点的终点语句中的被污染的右值加入到args_set集合中,如果终点语句为函数调用语句,则将调用语句中的被污染的参数加入到args_set集合中;
[0081] 2c2)逆向处理除了终点语句之外的从入口语句到终点语句之间的可达路径上的每条语句,如果当前遍历到的语句为赋值语句,且赋值语句的左值不在args_set集合中,则删除该语句;如果当前遍历到的语句为赋值语句,且该赋值语句的左值在args_set集合中,则将该赋值语句中的右值添加到args_set集合中,且保留该语句;如果当前遍历到的语句为条件判断语句,则将条件判断语句中条件变量添加到args_set集合中,且保留该语句;如果当前遍历到的语句为直接跳转语句,则将跳转语句的目标变量添加到args_set集合中,且保留该语句;如果当前遍历到的语句为变量定义语句,且定义的变量在args_set集合中,则保留该语句;如果当前遍历到的语句为变量定义语句,且定义的变量不在args_set集合中,则删除该语句;
[0082] 2c3)重复2f2)所述过程,直到处理了路径中的所有语句;如果某条语句的右值不在 args_set集合中,则说明该条语句的右值既不是污点数据,也不是与污点传播路径直接相关的分支条件或是分支目标,即该条语句为污点传播路径无关语句;通过删除无关的赋值语句,达到剪枝,压缩路径的目的;
[0083] 2d)将上述处理后的所有函数节点进行拼接,构成详细的污点数据传播路径;
[0084] 2e)对详细的污点数据传播路径进行去重处理,步骤如下:
[0085] 2e1)在详细的污点数据传播路径,搜索返回类型函数节点,以返回类型函数节点为中心,检测最长“调用-返回”函数节点的子序列;
[0086] 2e2)在2e1)得到的最长“调用-返回”函数节点子序列中,参照调用函数节点,删除对应返回函数节点中的重复语句节点,做去重处理,形成新的污点数据传播路径。
[0087] 2e3)步骤2e)的作用为删除“调用-返回”函数节点序列中重复路径,使用图2所示的简单恶意Android应用程序APP来说明“调用-返回”函数节点序列中重复路径问题;在图 2所示的程序片段中,在经过步骤2a处理后,得到的函数节点序列为(main,processTaint, reprocessTaint,processTaint),其中函数节点序列中第一次出现的processTaint记为 processTaint1,函数节点序列中第二次出现的processTaint记为processTaint2,通过步骤2b,2c,2d,2e,2f,2g处理后,得到详细的污点数据传播路径,其中函数节点 processTaint1中的语句节点为(Stmt p,...,Stmt q,Stmt r),函数节点processTaint2 中的语句节点为(Stmt p,...,Stmt q,Stmt r,...,Stmt t),重复路径为(Stmt p,...,Stmt r),需要删除processTaint2函数节点中的重复路径。
[0088] 步骤3,图形化输出处理。
[0089] 3a)为污点数据传播路径中的语句节点添加图形节点、有向边节点,并根据语句节点类型,为图形节点添加属性数据;如果语句节点为分支语句,则需要为分支语句的所有目标语句添加图形节点和有向边节点;
[0090] 3b)在污点数据传播路径中的函数节点间,插入有向边节点,有向边的起点为上一个函数节点的终点语句,有向边的端点为下一个函数节点的入口语句;
[0091] 3c)将上述步骤得到的图形节点和有向边节点输出;
[0092] 3d)根据3c)输出的图形文件,判定Android应用软件APP内部是否存在未过滤掉的能达到泄漏端点的逻辑分支:如果存在,则此处存在隐私泄漏漏洞,且该漏洞的输入能够找到,如果不存在,则该污点数据传播路径为假阳性路径,不是漏洞。
[0093] 本发明的效果可通过以下实验进一步说明:
[0094] 1.实验硬件环境:2核4G内存计算节点;
[0095] 2.实验内容:
[0096] 使用本发明方法检测示例Android应用程序APP是否存在隐私泄漏漏洞,该示例Android 应用程序APP为展示本发明效果而自己编写的,测试配置如下所述;
[0097] 污点数据规则配置文件包含两条记录,其中:
[0098] 第一条记录是:
[0099] ->_SOURCE_;
[0100] 第二条记录是:
[0101] ->_SINK_。
[0102] 入口配置文件配置包含1个组件,为MainActivity,其他配置使用默认值。
[0103] 3.检测结果:
[0104] 在上述测试配置条件下,用本发明方法对示例Android应用程序APP进行检测,输出一个图形文件,如图4所示。
[0105] 图4中实心曲线标记的路径为真实的数据传播路径,该路径对应为示例Android应用程序APP漏洞;图4中的每个矩形框代表一条Jimple语句,语句内容为矩形框中的内容;为方便做Android应用程序APP进行分析,将Android应用程序APP反编译解析为Jimple中间字节码的形式。
[0106] 从图4可见,在示例Android应用程序APP中MainActivity组件中存在一条污点数据传播路径,该路径的第二条语句匹配污点数据规则配置文件中的第一条规则,获取了隐私数据,该路径的终点语句匹配污点数据规则配置文件中的第二条规则,处理了隐私数据,且该条路径没有完善的校验,没有过滤掉不合理的组件调用,属于真实存在的漏洞。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈