一种基于下推自动机的信息流路径跟踪方法、装置及系统

文档序号:30081719发布日期:2022-05-18 04:32阅读:153来源:国知局
一种基于下推自动机的信息流路径跟踪方法、装置及系统

1.本技术涉及通信技术领域,尤其涉及一种基于下推自动机的信息流路径跟踪方法、装置及系统。


背景技术:

2.随着终端设备的逐渐普及,依赖于终端设备运行的各类应用程序层出不穷。由于商业利益或不受信任的第三方组件,一些热门的应用程序,如即时通讯、照相机和导航软件等,不仅使用敏感信息来完成正常功能,而且在不通知用户的情况下传播敏感信息。当敏感信息被传播时,将存在很大的安全隐患。
3.目前,采用动态污点分析算法(dynamic taint analysis,dta)对动态上下文信息进行控制,以便发现释放点泄漏了哪些敏感信息。尽管dta已在各种安全应用中被证明是有效的,但当前dta系统性能开销过大,效率较低,严重影响了dta在生产系统中的应用,尤其是在计算和存储资源均有限的android系统上更难以实现。同时,dta的低代码覆盖率将会导致较高的误阴率。因此,需要解决dta性能开销过大的问题。


技术实现要素:

4.有鉴于此,本技术的目的在于提供了一种基于下推自动机的信息流路径跟踪方法、装置及系统,以实现轻量级、低损耗、细粒度的信息流路径跟踪,从而解决动态污点分析算法性能开销过大的问题,其具体技术方案如下:
5.第一方面,本技术提供了一种基于下推自动机的信息流路径跟踪方法,所述方法应用于一种基于下推自动机的信息流路径跟踪系统中的服务器,所述基于下推自动机的信息流路径跟踪系统包括所述服务器和客户端,所述方法包括:
6.接收所述客户端发送的第一安卓应用程序安装包apk和自定义信息流策略,所述自定义信息流策略为用户对应用程序自定义的信息流策略;
7.根据所述自定义信息流策略,利用静态污点分析算法sta从所述第一apk中搜索出信息流路径集合;
8.根据所述自定义信息流策略,从所述信息流路径集合中获取敏感信息流路径;
9.利用静态插桩算法将预设的监控代码插入到所述第一apk中的所述敏感信息流路径,以得到第二apk,并将所述第二apk发送至所述客户端,使得所述客户端在接收到所述第二apk后运行所述第二apk;
10.通过所述监控代码监控所述敏感信息流路径的状态。
11.在一种可能的实现方式中,所述根据所述自定义信息流策略,利用静态污点分析算法sta从所述第一apk中搜索出信息流路径集合,包括:
12.读取所述自定义信息流策略中的源语句集合;
13.利用所述sta从所述第一apk中搜索出以所述源语句集合中的源语句为起点的信息流路径集合。
14.在一种可能的实现方式中,所述根据所述自定义信息流策略,从所述信息流路径集合中获取敏感信息流路径,包括:
15.读取所述自定义信息流策略中的释放点集合;
16.在所述以所述源语句集合中的源语句为起点的信息流路径集合中,获取以所述释放点集合中的释放点为终点的敏感信息路径。
17.在一种可能的实现方式中,在所述利用静态插桩算法将监控代码插入所述敏感信息流路径之前,所述方法还包括:
18.通过多级哈希映射表对所述敏感信息流路径进行分层管理。
19.在一种可能的实现方式中,在所述利用静态污点分析算法sta从所述第一apk中搜索出信息流路径集合之后,所述方法还包括:
20.将所述信息流路径集合中的所有信息流路径的关键节点信息记录在字符串数组中。
21.第二方面,本技术还提供了一种基于下推自动机的信息流路径跟踪装置,所述装置应用于一种基于下推自动机的信息流路径跟踪系统中的服务器,所述基于下推自动机的信息流路径跟踪系统包括所述服务器和客户端,所述装置包括:
22.接收模块,用于接收所述客户端发送的第一安卓应用程序安装包apk和自定义信息流策略,所述自定义信息流策略为用户对应用程序自定义的信息流策略;
23.搜索模块,用于根据所述自定义信息流策略,利用静态污点分析算法sta从所述第一apk中搜索出信息流路径集合;
24.获取模块,用于根据所述自定义信息流策略,从所述信息流路径集合中获取敏感信息流路径;
25.插桩模块,用于利用静态插桩算法将预设的监控代码插入到所述第一apk中的所述敏感信息流路径,以得到第二apk,并将所述第二apk发送至所述客户端,使得所述客户端在接收到所述第二apk后运行所述第二apk;
26.监控模块,用于通过所述监控代码监控所述敏感信息流路径的状态。
27.在一种可能的实现方式中,所述搜索模块,具体用于:
28.读取所述自定义信息流策略中的源语句集合;
29.利用所述sta从所述第一apk中搜索出以所述源语句集合中的源语句为起点的信息流路径集合。
30.在一种可能的实现方式中,所述获取模块,具体用于:
31.读取所述自定义信息流策略中的释放点集合;
32.在所述以所述源语句集合中的源语句为起点的信息流路径集合中,获取以所述释放点集合中的释放点为终点的敏感信息路径。
33.在一种可能的实现方式中,所述装置还包括:
34.管理模块,用于通过多级哈希映射表对所述敏感信息流路径进行分层管理。
35.在一种可能的实现方式中,所述装置还包括:
36.记录模块,用于将所述信息流路径集合中的所有信息流路径的关键节点信息记录在字符串数组中。
37.第三方面,本技术还提供了一种基于下推自动机的信息流路径跟踪系统,包括:服
务器和客户端;
38.所述服务器,用于执行上述第一方面或第一方面任一项所述的方法;
39.所述客户端,用于:
40.向所述服务器发送第一安卓应用程序安装包apk和自定义信息流策略,所述自定义信息流策略为用户对应用程序自定义的信息流策略;
41.接收所述服务器发送的第二apk并运行所述第二apk。
42.本技术实施例提供的基于下推自动机的信息流路径跟踪方法,接收客户端发送的第一安卓应用程序安装包apk和自定义信息流策略,自定义信息流策略为用户对应用程序自定义的信息流策略;根据自定义信息流策略,利用静态污点分析算法sta从第一apk中搜索出信息流路径集合;根据自定义信息流策略,从信息流路径集合中获取敏感信息流路径;利用静态插桩算法将预设的监控代码插入到第一apk中的敏感信息流路径,以得到第二apk,并将第二apk发送至客户端,使得客户端在接收到第二apk后运行第二apk;通过监控代码监控敏感信息流路径的状态。利用该方案只对目标应用程序使用轻量级的监控代码,不涉及微观且繁琐的变量级污点跟踪,由此实现快速且低损耗的运行时信息流跟踪分析。并且利用sta全面搜索敏感信息流路径,比传统的dta算法更容易找到隐式流动路径,通过验证程序运行时未出现的路径,可以达到比dta更高的精度,从而能够实现轻量级、低损耗、细粒度的信息流路径跟踪,解决dta算法性能开销过大的问题。
附图说明
43.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
44.图1示出了本技术提供的一种基于下推自动机的信息流路径跟踪方法实施例的流程图;
45.图2示出了本技术提供的一种路径控制自动机模型;
46.图3示出了本技术提供的一种基于下推自动机的信息流路径跟踪装置的结构示意图;
47.图4示出了本技术提供的一种基于下推自动机的信息流路径跟踪系统的结构示意图。
具体实施方式
48.为使本技术实施例的目的、技术方案和优点更加清楚,下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
49.首先,对本技术实施例中可能出现的一些名词进行解释。
50.动态污点分析算法(dynamic taint analysis,dta),在程序运行过程中,通过实时监控程序的污点数据在系统程序中的传播来检测数据能否从污点源传播到污点汇聚点。
51.静态污点分析算法(static taint analysis,sta),在不运行且不修改代码的前提下,通过分析程序变量间的数据依赖关系来检测数据能否从污点源传播到污点汇聚点。
52.有限状态自动机(finite stateautomata,fsa),为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型。
53.为了克服信息流跟踪技术性能开销的瓶颈,当前的相关研究都致力于将污点跟踪逻辑与程序执行解耦。基于这一研究方向,本技术提出了一种基于下推自动机的信息流路径跟踪系统fsaflow,在显著减少dta算法开销的同时,能够确保达到良好的隐私保护的效果。在本技术提供的fsaflow中,将路径跟踪逻辑与相应的污点跟踪逻辑进一步分离,实现了对信息流路径较为优化的控制。
54.fsaflow包括服务器和客户端,fsaflow的工作流程如下所示。
55.用户可以使用客户端为手机上的任何应用程序自定义信息流策略。通过管理从源语句到释放点的信息流路径,用户可以获得定制的隐私策略,例如位置信息是否可以通过网络发送或写入本地文件等。然后,客户端将自定义信息流策略与要处理的相应安卓应用程序安装包(androidpackage,apk)一起上传到服务器。
56.在服务器,fsaflow根据客户端上传的自定义信息流策略执行静态污点分析和静态插桩处理。在静态污点分析阶段,将挖掘出所有信息流路径,并对违反隐私策略的敏感信息流路径进行标记。同时,在该阶段记录所有信息流路径的关键节点信息。在静态插桩处理阶段,对需要受监控的敏感信息流路径的重要节点进行插桩,以实现有效的路径状态管理。然后,重新打包插桩后的代码以生成新的apk文件并发送回客户端。
57.基于以上流程,经过安全增强的应用程序将被重新安装在用户的手机上高效运行,并处于监控状态。
58.请参见图1,示出了本技术实施例提供的一种基于下推自动机的信息流路径检测方法实施例的流程图,所述方法由服务器执行,本技术实施例至少包括以下步骤:
59.s110,接收所述客户端发送的第一安卓应用程序安装包apk和自定义信息流策略。
60.在本技术实施例中,用户使用客户端为手机上的任何应用程序自定义信息流策略。然后,客户端将自定义信息流策略与要处理的相应apk(即第一apk)一起上传到服务器。服务器接收客户端发送的第一apk和自定义信息流策略,以便服务器根据自定义信息流策略对第一apk对应的应用程序进行监控。其中,自定义信息流策略为用户对手机上的任何应用程序自定义的信息流策略。
61.s120,根据所述自定义信息流策略,利用静态污点分析算法sta从所述第一apk中搜索出信息流路径集合。
62.在本技术实施例中,服务器根据接收到的自定义信息流策略,利用sta算法从第一apk中搜索出信息流路径集合。
63.根据自定义信息流策略,利用静态污点分析算法sta从第一apk中搜索出信息流路径集合的其中一种实现方式可以是,读取自定义信息流策略中的源语句集合,利用sta从第一apk中搜索出以源语句集合中的源语句为起点的信息流路径集合。
64.s130,根据所述自定义信息流策略,从所述信息流路径集合中获取敏感信息流路径。
65.在本技术实施例中,在获取到第一apk中的信息流路径集合之后,服务器根据自定
义信息流策略,从信息流路径集合中获取敏感信息流路径。
66.根据自定义信息流策略,从信息流路径集合中获取敏感信息流路径的其中一种实现方式可以是,读取自定义信息流策略中的释放点集合,在以源语句集合中的源语句为起点的信息流路径集合中,获取以释放点集合中的释放点为终点的敏感信息路径。
67.sta算法旨在有效地搜索整个程序,并标记潜在的敏感信息流路径。在本技术实施例中,sta算法是通过修改经典的ifds(interprocedural finite distri-butive subset)框架和flowdroid工具实现的。许多静态分析问题,包括污点分析、指针分析、活动变量和常量传播等,都可以通过ifds使用特殊的图的可达性算法来解决。
68.ifds由(g
#
,d,f,m,π)表示,其中,g
#
=(n
#
,e
#
)称为过程间控制流图(interprocess control flow graph,icfg),提供了程序的有向超图表示。每个n对应于程序的一个语句,n∈n
#
,(n1,n2)∈e
#
表示语句n2是语句n1的直接后继语句。d是一组有限的信息流事实集,表示被污染的变量。是信息流函数集。流函数定义语句对一组流事实的影响。例如,语句s:x=y与将一个事实集{y}(即,y被污染)映射到一个事实集{x,y}(即,x和y都被污染)的流函数相关,可以表示为{x,y}=fs({y})。m:e
#

f是从g
#
的边到流函数的映射,满足污点分析π运算。
69.g
#
由一些流图{g1,g2,

}的集合组成,每个函数对应一张流图。函数function的流图g
function
由唯一的开始节点s
function
、唯一的结束节点e
function
和表示function中语句和谓词的剩余节点组成。在g
#
中,调用函数h的语句m由两个节点表示,一个是调用节点cm,另一个是返回节点rm。此时,存在三条边连接m和h:从cm到rm的call-to-return边,从cm到sh的call-to-start边,从eh到rm的exit-to-return边。
70.为了将静态分析问题转化为图的可达性问题,将g
#
扩展为超图g
*
=(n
*
,e
*
),其中,e
*
={<u,d
x


<v,dy>|(u,v)∈e
#
,dy∈fu(d
x
)}。例如,如果y在n1之前被污染,则(n1:x=y

n2:z=x)∈e
#
可以扩展为{(<n1,y>

<n2,y>,<n1,x>

<n2,y>)}∈e
*
。需要注意的是,表示一组事实的空集。
71.基于流函数的定义,ifds从源语句执行icfg的宽度优先遍历,在e
*
中搜索以释放点为终点的敏感信息流路径。例如,g
*
中存在从节点到节点<nfinal:sink(x),z>的路径,则该路径上节点对应的语句序列构成了从源语句到释放点的敏感信息流路径。
72.由于分支跳转是区分不同路径的关键节点,因此需要记录路径上分支节点的上下文。监控点主要安装在分支机构上。此外,函数调用和返回的上下文将被记录为辅助信息,用于在检测阶段定位分支的函数体。
73.fsaflow继续将g
*
扩展到g
^
=(n
^
,e
^
),其中,n^=n
*
×
string、e^={<u,d
x
,p
fsa


<v,dy,p
fsa
>|(u,v)∈e
*
,dy∈fu(d
x
)}。字符串数组p
fsa
记录目前为止用于识别信息流路径集合中所有信息流路径的关键节点信息,包括分支语句和调用/返回语句的上下文等。在本技术实施例中,搜索路径和记录路径同时执行。具体的静态污点分析算法如表1所示。
74.表1静态污点分析算法
75.[0076][0077]
在sta算法中,通过读取自定义信息流策略,获得源语句集合sourcelist和释放点集合sinklist。通过调用soot工具生成g
#
,首先,搜索g
#
以查找源语句集合。然后,以每个源语句作为起点,遍历e^,搜索到以释放点为终点的信息流路径。将已搜索的路径记录在列表pathedge中,并且不会再次搜索这些已搜索的路径(如表1第12-13行)。工作列表worklist记录仍需搜索的路径的集合,将新找到的路径添加到worklist(如表1第7、23、27行等),已
搜索的路径将从worklist中删除(如表1第11行)。
[0078]
字符串数组p
fsa
按顺序存储每个信息流路径的关键节点信息。在p
fsa
中,不同的节点信息通过一个特殊的分隔符进行分割。fsaflow为不同的语句类型提取不同的关键信息。
[0079]
(1)语句类型为释放点sink(如表1第16-18行),表示已找到敏感信息流路径,此时,终止路径扩展并输出p
fsa

[0080]
(2)语句类型为函数调用(function call)(如表1第19-27行)。如果第一次遇到此节点,则会将有关调用方和被调用方的调用节点信息附加到p
fsa
,并将路径扩展到被调用方。否则,可以从摘要哈希表summaryhash中提取关于被调用方的新的扩展路径片段part
fsa
,然后在返回节点上执行搜索。该summaryhash中存储信息流路径流经函数时的路径片段。
[0081]
(3)语句类型为函数返回(function return)(如表1第28-33行)。附加总结函数到summaryhash中,以便后续再出现该总结函数时,直接复用该总结函数的摘要。然后,算法返回到call节点并继续扩展下一条语句。
[0082]
(4)语句类型为赋值语句(assignment)(如表1第34-38行)。p
fsa
将不会更新。赋值语句不是fsaflow的关键信息,但在这种情况下需要考虑别名问题。fsaflow执行按需别名分析。当变量被污染时,fsaflow会向后搜索被污染的变量的别名,然后再污染这些别名。将别名分析函数输出的结果变量、当前的语句和p
fsa
一起在n^中形成一个新节点。利用此新节点继续进行正向数据流分析。
[0083]
(5)语句类型为分支(branch)(如表1第39-47行)。分支路径的第一条语句ms的信息m
p
作为节点附加到p
fsa
。节点m
p
由元组《sn,size,no,type,sn’,m》组成,其中,sn表示m
p
在p
fsa
中的位置;size表示分支的分支编号;no表示目标路径的分支序列号;type表示节点类型,表示所选分支属于哪个分支类型;m表示语句本身。节点类型可以是in(插入循环体)、out(退出循环体)和x(其他)。如果ms在当前函数内的路径上出现多次,则sn’表示ms首次出现时在p
fsa
中的位置。最后,当输出p
fsa
时,在p
fsa
中从该节点移除m。
[0084]
经过静态污点分析得到的路径的主要结构如表2所示。fsaflow对jimple语句进行操作,因此输出路径也由jimple语句表示,以便于后续的检测。其中,jimple是由soot工具生成的,java source文件到java class文件的中间文件。
[0085]
表2静态污点分析得到的路径的主要结构
[0086][0087]
s140,利用静态插桩算法将预设的监控代码插入到所述第一apk中的所述敏感信息流路径,以得到第二apk,并将所述第二apk发送至所述客户端,使得所述客户端在接收到所述第二apk后运行所述第二apk。
[0088]
在本技术实施例中,服务器利用静态插桩将预设的监控代码插入到第一apk中的敏感信息流路径,根据插入监控代码的第一apk得到第二apk,并将第二apk发送至客户端,以便客户端根据第二apk安装应用程序。
[0089]
在静态插桩之前,fsaflow对p
fsa
进行预处理。由于循环结构的存在,语句可能会重复出现在路径上,则需要对p
fsa
中的语句进行归纳。设sn为语句m出现在路径上的所有位置{sn}的集合。fsaflow将sn附加到m第一次出现在路径上的节点,以便m的位置只被插桩一次。附加后,关于m的其他节点保留在路径上,以确保在插桩其他节点时控制信息流的一致性。此外,路径中涉及的每个循环结构都被分配一个唯一标识,便于嵌套循环中的状态监控。
[0090]
此外,根据类、方法和路径标识,还可以通过多级哈希映射表hashmap
policy
对敏感信息流路径进行分层管理,使得每个参与的类和方法只遍历一次。hashmap
policy
的数据结构为《classname,《method,《pathid,pathfragment》》》,可以通过多级键值直接访问。基于此,方法索引的每个键值都可以存储多条路径的片段信息。pathfragment仅存储分支节点。需要注意的是,与路径上的函数调用关联的节点是可以删除的,并且不会出现在hashmappolicy中。后续的检测也是基于hashmappolicy执行的。
[0091]
fsaflow扩展了soot工具的bodytransformer,实现了internaltransform方法以
遍历所有方法体的单元(语句),并在指定位置插入监控代码。表3详细描述了静态插桩的过程。
[0092]
表3静态插桩算法
[0093][0094][0095]
hashmap
policy
中出现的类是从实际的类文件中逐项加载的,然后,逐个解析类文件中的方法。对于每种方法,从hashmap
policy
中提取对应的路径标识和路径段,节点处理有三种情况:
[0096]
(1)如果与源类型匹配,则会找到相应的状态变量,并在其前面插入监控代码,这样可以在应用程序运行时激活对指定路径的监视。
[0097]
(2)如果与分支类型匹配,则找到当前位置的下一个分支。对于不同的后续路径,根据后续的表5,在后续敏感信息流路径的第一个语句之前插入相应监控代码。如果节点不是第一个重复节点(sn’=-1),则表示该节点已被处理,可以忽略。
[0098]
(3)如果与释放点类型匹配,则会找到相应的语句,并在该语句之前插入控制代码,从而可以执行信息流控制和审核。
[0099]
在路径中,一个方法可以调用多次。需要说明的是,可以利用newinvoke节点将当前插桩位置更新到方法的开始。
[0100]
在本技术实施例中,通过遍历hashmap
policy
完成相关类文件的代码插桩后,可以获得一组新的类文件。然后,将所有新的类文件重新打包到.dex文件中,以替换第一apk文件
中的.dex文件。对替换.dex文件后的第一apk文件使用压缩包处理,生成第二apk文件。
[0101]
s150,通过所述监控代码监控所述敏感信息流路径的状态。
[0102]
在本技术实施例中,通过静态插桩,可以在应用程序正常运行时实现对信息流的监控。虽然在循环结构中重用和重新计算敏感信息流并不常见,但为了保证fsaflow的鲁棒性,本技术实施例考虑了敏感信息流在循环或嵌套循环中的传播。以表4所示的代码片段作为示例来说明应用程序运行时的监控机制。
[0103]
表4循环结构中敏感信息流传播代码片段
[0104][0105]
如果使用ifds算法分析以上示例,则在其从s2到s5三次遍历循环体后,将找到程序n
*
中的节点《s3,td》,《s3,in》,《s3,a》,《s3,b》,《s3,c》。当ifds第四次尝试遍历s3时,发现没有可用于路径扩展的新节点。因此,ifds停止遍历循环体并继续遍历s6。最后,输出路径s0-s1-s2
1-s3
1-s4
1-s5
1-s2
2-s3
2-s4
2-s5
2-s2
3-s3
3-s4
3-s5
3-s6,其中,sin表示si的第n次执行,而实际执行路径是s0-s1-s2
1-s3
1-s4
1-s5
1-s2
2-s3
2-s4
2-s5
2-s2
3-s3
3-s4
3-s5
3-s2
4-s3
4-s4
4-s5
4-s6,这导致信息泄漏以及ifds中的信息漏报。事实上,所有静态信息流分析技术都可能面临这个问题。
[0106]
为了更好地处理这个问题,污点传播过程沿着路径分为三个阶段:
[0107]
1)前向传播阶段(n):执行语句在循环体之外,对应于s1和s6的执行阶段。
[0108]
2)循环传播阶段(p):执行语句在循环体中,根据ifds,在当前循环中仍然存在与“s2
1-s3
1-s4
1-s5
1-s2
2-s3
2-s4
2-s5
2-s2
3-s3
3-s4
3-s5
3”的执行阶段相对应的新节点扩展。
[0109]
3)循环稳定阶段(s):执行语句在循环体中,根据ifds,在当前循环中没有新节点扩展。ifds不再跟踪该阶段的执行,其对应于“s2
4-s3
4-s4
4-s5
4”的执行阶段。
[0110]
虽然为了避免路径长度爆炸的问题,ifds没有对s阶段进行分析,但仍然达到了良好的精度。然而,对s阶段进行进一步监测是有益的。如果存在包含s阶段的泄漏路径,则会导致ifds中出现信息漏报。使用sta算法很难确定s阶段中实际执行的循环次数,所以对s阶段使用过于精确的sta算法很容易导致过多的开销。因此,需要一种更有效、更合理的方法来对s阶段进行监测。
[0111]
在执行进入循环的s阶段之前,其实已经经历了p阶段,并通过污点累积达到了最大污点状态。因此,在s阶段内循环的同一代码段的重复执行往往趋于稳定,以保持循环的最大污点状态。实际上,循环中的代码可能是重复的逻辑行为,如科学计算、文件读取和写
入等。路径的执行通常不会改变p阶段的最终传播状态。因此,这些路径仍然有效,但它们在传播中是不起作用的。
[0112]
在本技术实施例中,使用fsaflow监控s阶段以确保安全性。在大多数情况下,fsaflow仍然只监控关键分支节点,以确保性能和正确性。在少数情况下,s阶段可能出现误判,此时,对路径的监控策略进行修改,不再监控s阶段以减少误判。
[0113]
在本技术实施例中,fsaflow实现了基于下推自动机的路径控制,下推自动机是有限状态自动机fsa的扩展,由状态控制器、输入和堆栈组成。如图2所示,在形式上,给定静态分析输出的路径path,并假设其长度为n,则运行时对应的自动机表示为m=(q,∑,γ,δ,q0,f),其中:
[0114]
(1)q是一组有限的状态。path上的每个节点i对应于状态qi(i》0)。q0对应于路径的非活动状态,q1对应于源点,qn对应于释放点。
[0115]
(2)∑:sns
×
type
×
l
id
是输入字母表。每个输入符号对应于fsaflow的一个监控点,输入序列表示程序执行的监控点的执行顺序。输入符号σ由元组(sns,type,l
id
)组成。sns∈2
{0,1,...,n}
是与监控点相对应的允许节点编号集合。path上的每个节点按顺序分配一个节点编号i。特殊地,sns={0}表示监控点位于非目标分支路径上。type∈{in,out,x}表示监控点位置的类型。in/out/x分别表示监控点是循环结构和其他类型的入口/出口点。l
id
表示循环结构的标识,如果type=x,则l
id
=-1。
[0116]
(3)γ=peroid
×
l
id
是堆栈字母表。堆栈是“后进先出”存储设备,可以记录嵌套循环执行中循环的相应执行阶段。peroid:{n,p,s}分别表示前向传播阶段(n)、循环传播阶段(p)和循环稳定阶段(s)。l
id
是循环的ids集。如果peroid=s,则l
id
=-1。
[0117]
(4)δ:q
×

×
γ
→q×
γ是转换函数。根据当前状态、当前输入和堆栈顶部的符号,确定自动机m的下一个动作,包括状态转换和堆栈上的push或pop操作。
[0118]
(5)q0∈q是初始状态,表示路径未激活。
[0119]
(6)是接受状态的集合。
[0120]
表5列出了自动机m的转换函数。自动机m从状态q0和空堆栈开始,执行源语句后,达到状态q1并进入n阶段。在n阶段,当遇到诸如if/switch之类的分支跳转时,如果跳转目标指向路径中的下一个节点,则状态将向前更新一步;当遇到while/for循环时,自动机m将进入p阶段,如果跳跃目标和目标路径都需要进入循环体,则状态向前更新一步。在p阶段,当遇到分支跳转时,如果跳转目标指向路径中的下一个节点,则状态将向前更新一步;否则,当路径中的下一个节点指向循环出口分支时,如果分支跳转再次进入循环体,自动机m将进入s阶段。在这种情况下,在执行达到关于路径的污点传播的最大值后继续执行循环结构。在s阶段内,不会跳出循环结构的分支将被连续监控,并且路径状态保持不变。当遇到跳出循环结构的分支时,自动机m将弹出堆栈,并将堆栈指示的最后一个阶段恢复为当前阶段。然后,根据不同的阶段要求继续跟踪和监控。在p阶段或s阶段,如果自动机m通过区分循环结构标识确定进入不同的循环机构,则将发生循环嵌套。在这种情况下,新阶段信息将被推送到堆栈中,并且新阶段的分配与当前阶段的分配相同。如果遇到其他情况,自动机m将返回到状态q0并清除堆栈。其中,表5中a、-表示通配符。通过删除表5中的规则7和规则10,fsaflow能够跟踪sta算法输出的任何路径。
[0121]
表5自动机m的转换函数
[0122][0123]
fsaflow利用全局变量记录所有受监控的敏感信息流路径的执行状态和堆栈。如图2所示,包括有四个监控点。这些监控点的主要监控代码如表6所示。
[0124]
表6监控代码
[0125][0126][0127]
如果语句执行到释放点对应的监控点,fsaflow检查当前执行语句是否与所需状
态匹配。若是,fsaflow拦截释放点传输的敏感数据。如果拦截的敏感数据是数字,则该敏感数据被分配为0。如果拦截的敏感数据是字符数据,则将字符数据替换为0的ascii码。为了防止利用敏感数据的长度进行隐蔽通信,进一步地,调用随机数生成应用程序接口(application program interface,api)来随机确定清除字符数据的长度。最后,为了不影响应用程序的正常功能,净化后的数据将被传递到路径释放点继续执行。可选地,向用户提示拦截的信息。
[0128]
在本技术实施例,给定一个程序q,对于ifds/flowdroid找到的任何路径path,当且仅当q运行时出现path,不处于稳定阶段的fsaflow才能报告path。
[0129]
假设ifds/flowdroid将路径path=s1→
s2→
...

si→
...

sj→
...

sk→
sm判断为泄漏路径,其中s1为源节点,sm为释放点。跳转语句可用作分割节点,将path表示为基本块序列b1→
b2→
b3→
...
→bn
。fsaflow在每个bi前面插桩一个监控点m
bi
,并将q转换为q’。其中,基本块指的是在一个程序中仅以一个entry和一个exit顺序执行的一系列语句。只有基本块中的最后一条指令才能使执行进入其他基本块。
[0130]
在执行任何bi之前,首先执行其m
bi
。根据表5的转换函数,如果前序状态为q
i-1
,m
bi
的执行把状态更新为qi。执行源语句时,path被激活,q’从初始状态q0达到状态q1。从qi到q
i+1
的任何状态转换都表明在执行bi后,b
i+1
的代码将随后执行。有必要排除在从bi转换到b
i+1
期间执行其他块的可能性。假设有一个执行路径bi→
e1→
e2→
...
→ex
→bi+1
,首先,e1出现在path上,并且e1在path上的位置集被标记为k={k|k≠i+1,bk=e1},e1的监控点m
e1
的sns等于k。在bi之后、执行e1之前,首先执行m
e1
。根据转换函数,m
e1
将路径状态恢复为q0,因为不符合规则2至规则6,表示停止跟踪当前路径。因此,当在qi执行bi→
e1→
e2→…→ex
→bi+1
时,状态不会从当前路径的qi进入q
i+1
,当前路径中的状态转换只能在从bi直接执行到b
i+1
时发生。其次,e1不是路径path上的基本块,e1的监控点m
e1
的sns为{0}。显然,如果执行m
e1
,fsaflow将把状态恢复到q0,并停止跟踪当前路径。因此,当且仅当在执行bi之后立即执行bi+1时,状态从qi转换到q
i+1
。此外,一般化状态转换q1→
q2→…→qn
必须伴随着路径b1→
b2→
b3→…→bn
的出现。因此,当且仅当path发生时,执行达到qn状态。
[0131]
在本技术实施例中,给定一个程序q,f是q中的语句集。假设q中监控u条路径,路径上不同分支节点的平均数为n,监控点的平均语句数为r。那么,fsaflow运行时的平均开销为nru/|f|。
[0132]
给定路径path,根据fsaflow静态插桩机制,只能在分支节点上设置监控点。此外,重复的分支节点共享一个监控点。监控点的执行频率取决于相应分支语句的执行频率。假设f中的所有语句都是统一执行的,并且path有n个不同的分支节点。然后,path的所有监控点的执行频率比为n/|f|。如果监视点的平均执行语句数为r,则监控path的平均运行时开销的比率为nr/|f|。扩展到u路径,fsaflow运行时开销的比率为nru/|f|。
[0133]
对于r,需要考虑指令执行的随机性。大多数程序执行不遵循敏感信息流路径。因此,当执行监控点的监控代码时,它很可能处于非活动状态q0。对于大多数监控点,状态从q0转换到qi(i≠1)与转换函数不一致,表示只执行监控点的起始代码,后续复杂判断可能不执行。在循环稳定期内,可以省略许多集合确定操作。因此,在每个监控点执行的实际代码量可能很小。
[0134]
对于u,只监控违反用户自定义信息流策略的敏感信息流路径,而不是所有信息流
路径。根据对实际软件的分析工作,商业软件中此类路径通常很少。
[0135]
对于n,路径上的节点主要由赋值、移动和计算等顺序语句组成。路径的分支语句数通常远小于路径长度。此外,路径长度通常远小于|f|,因此n远小于|f|。
[0136]
总的来说,由于nru/|f|《《1,性能开销可能非常低。作为比较,在采用逐条指令跟踪机制的dta系统中,假设每条指令都需要一条用于跟踪的指令,而这些指令通常用于复制和计算阴影内存中的污点,使得开销是大于1的,通常增加了一个数量级,并且性能开销显著高于fsaflow。
[0137]
另外,在本技术实施例中,sta算法和静态插桩算法是可以终止的。
[0138]
在sta算法中,列表pathedge记录已搜索的路径。随着每个扩展路径的添加,将污染更多的变量。同时,在第一次扩展分析之后,每条路径都将被插入到列表pathedge中。随后,如果新的扩展路径位于pathedge中,表明该任务已在执行,则此分析将停止以避免重复分析。随着路径的扩展,污点变量的数量单调增加。因为变量的数量和路径的数量都是有限的,所以上限是所有变量都受到影响。因此,存在一个图形搜索状态,其中所有新的扩展边缘任务都已执行,所以sta算法可以终止。
[0139]
在搜索过程中,对于单一源信息流跟踪,最坏的情况是搜索所有扩展路径并污染所有变量。在这种情况下,sta算法的复杂度为o(|f||d|2),其中f是程序语句集,d是程序变量集。考虑到函数重复节点的验证,并假设方法中的平均语句数为k,则sta算法的复杂度为o(k|f||d|2)。此外,如果考虑后向别名分析,sta算法的复杂度为o(k|f||d|4)。然而,事实上,调用函数的扩展边缘只传播和分析一次,因为在第一次对其进行分析后,记录并汇总为摘要哈希表summaryhash。当以后遇到相同的扩展时,可以重用总结函数,特别是在对同一方法的不同调用点进行分析时,总结函数可以重用,以提高效率。
[0140]
对于静态插桩算法,利用多级哈希映射表hashmap
policy
对敏感信息流路径进行分类和记录,并对这些路径进行方法分层处理。在此基础上,每个类的方法只分析一次,节省了重复访问的准备和等待时间。在每个分支节点插入相应的监控代码以监控路径状态。因为路径长度和路径集合都是有限的,所以静态插桩算法可以终止。对于u条路径,一条路径的平均分支节点数表示为v,则静态插桩算法的复杂度为o(uv),这主要取决于路径数和分支节点数。
[0141]
在本技术实施例中,接收客户端发送的第一安卓应用程序安装包apk和自定义信息流策略,自定义信息流策略为用户对应用程序自定义的信息流策略;根据自定义信息流策略,利用静态污点分析算法sta从第一apk中搜索出信息流路径集合;根据自定义信息流策略,从信息流路径集合中获取敏感信息流路径;利用静态插桩算法将预设的监控代码插入到第一apk中的敏感信息流路径,以得到第二apk,并将第二apk发送至客户端,使得客户端在接收到第二apk后运行第二apk;通过监控代码监控敏感信息流路径的状态。利用该方案只对目标应用程序使用轻量级的监控代码,不涉及微观且繁琐的变量级污点跟踪,由此实现快速且低损耗的运行时信息流跟踪分析。并且利用sta全面搜索敏感信息流路径,比传统的dta算法更容易找到隐式流动路径,通过验证程序运行时未出现的路径,可以达到比dta更高的精度,从而能够实现轻量级、低损耗、细粒度的信息流路径跟踪,解决dta算法性能开销过大的问题。
[0142]
接下来对本技术提供的一种基于下推自动机的信息流路径检测装置进行介绍,下
文介绍的一种基于下推自动机的信息流路径检测装置与上文介绍的一种基于下推自动机的信息流路径检测方法可相互对应参照。
[0143]
请参见图3,示出了本技术提供的一种基于下推自动机的信息流路径检测装置的结构示意图,所述装置包括:
[0144]
接收模块301,用于接收所述客户端发送的第一安卓应用程序安装包apk和自定义信息流策略,所述自定义信息流策略为用户对应用程序自定义的信息流策略
[0145]
搜索模块302,用于根据所述自定义信息流策略,利用静态污点分析算法sta从所述第一apk中搜索出信息流路径集合;
[0146]
获取模块303,用于根据所述自定义信息流策略,从所述信息流路径集合中获取敏感信息流路径;
[0147]
插桩模块304,用于利用静态插桩算法将预设的监控代码插入到所述第一apk中的所述敏感信息流路径,以得到第二apk,并将所述第二apk发送至所述客户端,使得所述客户端在接收到所述第二apk后运行所述第二apk;
[0148]
监控模块305,用于通过所述监控代码监控所述敏感信息流路径的状态。
[0149]
在本技术实施例中,所述搜索模块302,具体用于:
[0150]
读取所述自定义信息流策略中的源语句集合;
[0151]
利用所述sta从所述第一apk中搜索出以所述源语句集合中的源语句为起点的信息流路径集合。
[0152]
在本技术实施例中,所述获取模块303,具体用于:
[0153]
读取所述自定义信息流策略中的释放点集合;
[0154]
在所述以所述源语句集合中的源语句为起点的信息流路径集合中,获取以所述释放点集合中的释放点为终点的敏感信息路径。
[0155]
在本技术实施例中,所述装置还包括:
[0156]
管理模块,用于通过多级哈希映射表对所述敏感信息流路径进行分层管理。
[0157]
在本技术实施例中,所述装置还包括:
[0158]
记录模块,用于将所述信息流路径集合中的所有信息流路径的关键节点信息记录在字符串数组中。
[0159]
请参见图4,示出了本技术提供的一种基于下推自动机的信息流路径检测系统的结构示意图,所述系统包括:服务器41和客户端42。
[0160]
服务器41,用于执行上述方法实施例所述的基于下推自动机的信息流路径检测方法;
[0161]
客户端42,用于:
[0162]
向所述服务器发送第一安卓应用程序安装包apk和自定义信息流策略,所述自定义信息流策略为用户对应用程序自定义的信息流策略;
[0163]
接收所述服务器发送的第二apk并运行所述第二apk。
[0164]
在本技术实施例中,接收客户端发送的第一安卓应用程序安装包apk和自定义信息流策略,自定义信息流策略为用户对应用程序自定义的信息流策略;根据自定义信息流策略,利用静态污点分析算法sta从第一apk中搜索出信息流路径集合;根据自定义信息流策略,从信息流路径集合中获取敏感信息流路径;利用静态插桩算法将预设的监控代码插
入到第一apk中的敏感信息流路径,以得到第二apk,并将第二apk发送至客户端,使得客户端在接收到第二apk后运行第二apk;通过监控代码监控敏感信息流路径的状态。利用该方案只对目标应用程序使用轻量级的监控代码,不涉及微观且繁琐的变量级污点跟踪,由此实现快速且低损耗的运行时信息流跟踪分析。并且利用sta全面搜索敏感信息流路径,比传统的dta算法更容易找到隐式流动路径,通过验证程序运行时未出现的路径,可以达到比dta更高的精度,从而能够实现轻量级、低损耗、细粒度的信息流路径跟踪,解决dta算法性能开销过大的问题。
[0165]
需要说明的是,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例、系统类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0166]
对于前述的各实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本技术并不受所描述的动作顺序的限制,因为依据本技术,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本技术所必须的。
[0167]
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0168]
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本技术。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本技术的精神或范围的情况下,在其它实施例中实现。因此,本技术将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
[0169]
以上所述仅是本技术的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本技术原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本技术的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1