一种检测安卓混合型app安全漏洞的静态分析方法

专利查询8月前  51



1.本发明涉及信息安全检测领域,尤其涉及一种检测安卓混合型app安全漏洞的静态分析方法。


背景技术:

2.随着移动互联网的发展,安卓app的需求也越来越强烈,android开发者在google play、华为应用市场分发了大量的android应用程序供用户使用,完成不同的操作功能。目前,android应用程序主要分为三类:native app、web app和混合app。native app是基于安卓操作系统,采用原生语言开发的应用程序,它可以借助操作系统直接访问资源,如摄像头、通讯录等数据,并且运行流畅,但对开发人员的要求高一些,而且需要用户去应用市场下载安装。web app是利用html、css以及javascript等网页开发语言开发的应用程序,开发者不需要具备专业的移动开发经验,只需了解网络编程就可以开发web app,这种类型的app比较容易构建和分发,不需要上传到专门的安卓应用市场,缺点是不能直接访问用户的设备资源,用户体验较差。
3.如今,越来越多的安卓app开发倾向于使用混合(hybrid)开发模式。混合开发是一种取长补短的开发模式,即原生代码部分利用webview控件或者其它框架为h5提供容器,应用程序的框架是使用原生代码开发,而经常会变动和业务相关的页面则使用h5进行展示。目前已经有众多流行的混合app,如抖音、淘宝、今日头条等。由于混合开发模式中webview容易使用,深受移动开发人员的喜爱。研究显示,大约80%的安卓应用使用webview。
4.android混合app主要包含了一个或多个webview,webview是混合应用的关键组件之一。webview为应用程序提供了一个显示web页面的空间,同时也是native层和web层的一个接口,并且能够将native层的对象绑定到web中供javascript调用本地java方法。开发人员可分别开发native层的功能模块和web层的功能模块,极大地提高了开发的效率。
5.但是native与webview的交互机制很复杂,在安卓应用中容易引发各种安全问题,如用户敏感信息的泄露、网络钓鱼攻击、恶意广告加载等。因此,如何有效检测出混合型app的安全问题,是一个值得深入研究的课题。
6.因此,本领域的技术人员致力于开发一种检测安卓混合型app安全漏洞的静态分析方法,以准确检测出安全漏洞。


技术实现要素:

7.有鉴于现有技术的上述缺陷,本发明所要解决的技术问题是如何检测安卓混合型app安全漏洞。
8.为实现上述目的,本发明提供了一种检测安卓混合型app安全漏洞的静态分析方法,包括以下步骤:
9.步骤1、对apk进行反汇编,得到jimple代码;
10.步骤2、对所述jimple代码进行配置检测;
11.步骤3、根据预先总结的js和native互相通信的方式,对js bridge进行提取,基于soot工具,检测出所有的js bridge方法;其中,所述互相通信的方式包括拦截url请求的方式、拦截prompt、alert函数的方式、注入js上下文的方式;
12.步骤4、分析js侧的危险调用,替换webview模块,覆盖加载h5url的方法,在加载h5url的方法中注入所述js bridge方法和sink存根方法,将重打包的app输入到flowdroid进行分析;
13.步骤5、拉取h5页面生成抽象语树,在js代码定位js侧的所述jsbridge方法;
14.步骤6、使用selenium对h5页面中的所述jsbridge方法模糊测试;
15.步骤7、汇总分析结果。
16.进一步地,所述步骤2包括:
17.步骤2.1、针对密码明文存储漏洞,对soot反汇编成的中间代码进行代码扫描,对所述jimple代码进行扫描,判断所述jimple代码里是否调用了websettings.setsavepassword(false),如果没有,则添加报警。
18.进一步地,所述步骤2还包括:
19.步骤2.2、针对域控制不严格漏洞,对webview涉及跨域访问的api进行检查。
20.进一步地,所述步骤2.2中被检查的所述api包括:
21.setallowfileaccessfromfileurls,用于设置是否允许通过file url加载的javascript访问其他的file域本地文件;
22.setallowuniversalaccessfromfileurls,用于设置是否允许通过file url加载的javascript访问其他域;
23.setallowfileaccess,用于设置是否要使用file协议;
24.setjavascriptenabled,用于设置是否要使用javascript。
25.进一步地,所述步骤2还包括:
26.步骤2.3、对逆向得到的androidmanifest.xml文件进行扫描,查找是否有activity的android:exported为true,如果设置为导出,则进一步检测所述activity是否使用webview以及加载的url是否是file协议,如果使用了所述file协议,再进一步检查所述setallowfileaccessfromfileurls、所述setallowuniversalaccessfromfileurls、所述setjavascriptenabled中的任意一个是否设置成了true,如果所述setallowfileaccessfromfileurls、所述setallowuniversalaccessfromfileurls、所述setjavascriptenabled中的任意一个设置为true,则存在域控制不严格漏洞。
27.进一步地,所述步骤3包括:针对所述注入js上下文的方式,在反汇编后的所述jimple代码中寻找有@javascriptinterface的注解,注解锁标注的方法即为所述js bridge方法。
28.进一步地,所述步骤3还包括:针对拦截prompt/alert和拦截url请求两种通信方式的java反射调用,对反汇编后的jimple代码进行符号收集和前向搜索,定位到所述反射调用的具体类,并将所述具体类的所有public方法视为js bridge方法。
29.进一步地,所述步骤4包括:在取得所有所述js bridge方法后,创建一个新类,所述新类用于替代原有的webview类,在所述新类类的加载h5url的方法中调用所述js bridge方法,并且添加sink函数,将调用结果作为参数输入到所述sink函数中;以及将注入
完代码的app重新打包输出成apk文件,输入到flowdroid进行数据流分析。
30.进一步地,所述步骤5包括:获得所述h5页面后,使用babel对所述js代码进行语义分析,生成抽象语法树;其中,所述babel是一个javascript语法编译器。
31.进一步地,所述步骤5还包括:使用深度优先搜索算法,在所述抽象语法树中对所述js bridge方法进行名字查找,如果发现被检测函数的名字或者参数和收集到的所述js bridge方法匹配,则将所述被检测函数的函数名记录下来,然后对所述被检测函数进行模糊测试。
32.与现有技术方案相比,本发明的有益技术效果在于以下两点:
33.首先,本发明技术方案中的敏感数据流更加完备。由于结合了java侧数据流分析的先进工具,在其基础上进行源码的修改和拓展,这样使得本发明技术方案中的污点分析更加精确。
34.其次,本发明的语义分析更加全面。为了增强风险检测能力,对可能的js-java通信情况进行全面的分析,不仅包括直接调用js bridge方法,还包括了schema协议的使用、事件处理器的自动触发、反射情况的处理等各种情况。
35.以下将结合附图对本发明的构思、具体结构及产生的技术效果作进一步说明,以充分地了解本发明的目的、特征和效果。
附图说明
36.图1是本发明的一个较佳实施例的方法流程图;
37.图2是本发明的一个较佳实施例的配置检测流程图;
38.图3是本发明的一个较佳实施例的触发xss攻击示意图;
39.图4是本发明的一个较佳实施例的模糊测试流程图。
具体实施方式
40.以下参考说明书附图介绍本发明的多个优选实施例,使其技术内容更加清楚和便于理解。本发明可以通过许多不同形式的实施例来得以体现,本发明的保护范围并非仅限于文中提到的实施例。
41.在附图中,结构相同的部件以相同数字标号表示,各处结构或功能相似的组件以相似数字标号表示。附图所示的每一组件的尺寸和厚度是任意示出的,本发明并没有限定每个组件的尺寸和厚度。为了使图示更清晰,附图中有些地方适当夸大了部件的厚度。
42.图1是本发明的一个较佳实施例的方法流程图。在本发明的一个实施例中,对混合型app可能的配置问题进行了报警,具体的配置检测流程如图2所示。
43.首先,针对密码明文存储漏洞,对soot反汇编成的中间代码进行了代码扫描,密码明文存储漏洞存在的原因是webview默认开启密码保存功能,在用户输入密码时,会弹出提示框:询问用户是否保存密码;如果选择”是”,密码会被明文保到/data/data/com.package.name/databases/webview.db中,这样就有被盗取密码的危险。
44.因此需要确保代码显示的禁止了密码保存提醒的功能,防止明文密码存在本地被盗用,在这里,对jimple代码进行了扫描,判断代码里是否调用了websettings.setsavepassword(false),如果没有,会添加报警。
45.针对域控制不严格漏洞,对webview涉及跨域访问的几个api进行了检查,一是setallowfileaccessfromfileurls,它用于设置是否允许通过file url加载的javascript访问其他的file域本地文件;二是setallowuniversalaccessfromfileurls,它用于设置是否允许通过file url加载的javascript访问其他域;三是setallowfileaccess,它用于设置是否要使用file协议;四是setjavascriptenabled,它用于设置是否要使用javascript。
46.为了检测是否有可能触发,首先对逆向得到的androidmanifest.xml文件进行扫描,查找是否有activity的android:exported为true,如果设置为导出,则进一步检该activity是否使用webview以及加载的url是file协议,如果使用了file协议,再进一步检查上述setallowfileaccessfromfileurls、setallowuniversalaccessfromfileurls、setjavascriptenabled是否设置成了true,如果为true,则存在域控制不严格漏洞。
47.在本发明的第二个实施例中,对混合型app中h5页面可能调用的java侧敏感api进行了检测,在检测之前,根据预先总结的js和native互相通信的方式,会对js bridge进行提取,然后再重写webview类,将jsbridge运行结果注入到定义的sink存根函数中,再使用flowdroid进行隐私泄露分析,具体流程如图2所示。
48.本发明总结js和native通信的方式,包括拦截url请求、拦截prompt、alert函数、注入js上下文三种方式。
49.(1)拦截url请求的方式。这种模式下,h5端通过触发一个url访问,例如通过设置href直接跳转:
50.window.location.href=url;
51.或者通过创建新的iframe跳转:
52.const iframe=document.createelement('iframe');
53.iframe.src=url;
54.iframe.style.width=0;
55.iframe.style.height=0;
56.document.body.appendchild(iframe);
57.这样native可以在url跳转处理器中调用jsbridge方法。
[0058][0059]
最后h5和native再约定一个通信协议,这样在h5侧触发跳转时,native侧就能去解析url,从url中提取要调用的类和方法。
[0060]
(2)拦截prompt、alert和confirm的方式。这种模式下,h5发起alert、confirm、prompt请求。native会拦截h5发出的prompt,如下所示:
[0061][0062]
native在onjsprompt捕获h5传来的协议,解析流程与方法一一样。
[0063]
(3)通过注入js上下文的方法完成通信。这种方式最简单,只需要在java对应的方法上增加一个@javascriptinterface的注解,之后该方法就可以被h5侧调用。但是这种方式进行通信在低版本存在安全漏洞,本发明也做了相应的报警。
[0064]
三种方式对比如下:
[0065][0066][0067]
本发明为了尽可能提升准确率,将上述三种通信情况都考虑在内,基于soot这个java代码优化工具,检测出所有的js bridge方法,然后将安卓代码里的webview替换成重写的一个新类,这个类继承webview父类,覆盖loadurl、loaddata,loaddatawithbaseurl,posturl这些加载url的方法,在这些方法中添加标记sink存根函数并调用相应的js bridge方法的运行结果。具体如下:
[0068]
(1)针对注入js上下文的方法完成通信的情况,寻找js bridge方法只要在反汇编后的jimple代码中寻找有@javascriptinterface的注解,注解锁标注的方法即为js bridge方法。
[0069]
(2)对于使用url请求和拦截prompt方法的方式,可以归为一类,都是通过触发native侧的方法,然后去解析相应的协议。这种情况需要去解决java反射的问题。
[0070]
具体地,本发明将java常见的反射的api做了一个总结,如下所示:
[0071][0072]
根据上表,本发明在事件处理函数中,对反射api进行符号收集,在事件处理函数中,如果通过反射动态调用了函数,必定会使用了invoke api,因此,本发明使用了前向搜索,通过类方法获取的方法符号搜索,最终找到类变量的获取方法。
[0073]
对于最终符号搜索到的类,认为该类的所有方法都是可能会被h5代码调用的,即该类的所有方法都认为是可能的js bridge方法。
[0074]
(3)拿到所有js bridge方法后,由于本发明的数据流分析是基于flowdroid的,flowdroid无法分析h5的代码,因此本发明需要创建一个新类,该类用于替代原有的webview类,在该类的loadurl等加载h5url的方法中调用上述分析得到的js bridge方法,并且添加sink函数,将调用结果作为参数输入到sink函数中。最后本发明将注入完代码的app重新打包输出成apk文件,输入到flowdroid进行数据流分析。
[0075]
本发明的第三实施例中,对h5代码中可能出现的注入攻击进行了检测。
[0076]
具体地,当h5中展示的信息是从native侧获取的时候,攻击者可以将危险字符串注入到h5页面中从而触发xss攻击,如图3所示,app获取wifi名字并展示到页面上,当wifi名包含恶意字符串时,h5会被触发xss攻击,严重的会被盗取cookie等敏感信息。
[0077]
为了对这种xss攻击进行检测,需要基于第二部分对js bridge方法的提取结果,在得到js bridge方法名字后,再对xss攻击进行模糊测试,具体步骤如下:
[0078]
(1)首先,本发明需要对h5页面进行拉取,由于h5页面有两种形式,一种是file协议,一种是http协议。对于file协议,则直接从本地进行读取,对于http协议,则需要先发请求爬取网页。
[0079]
(2)获得页面后,本发明对js代码进行语义分析,在这里,本发明使用了babel,这是一个javascript语法编译器,同时也能对js代码进行语义分析,生成抽象语法树。
[0080]
进一步地,本发明会在抽象语法树中对js bridge方法进行名字查找,具体使用了深度优先搜索算法,如果发现某个函数的名字或者参数和收集到的js bridge方法匹配,则
将改函数名记录下来,然后对该函数进行模糊测试。
[0081]
(3)本发明使用了selenium工具作为模糊测试的容器,selenium是一个自动化测试工具,可以作为一个无头浏览器,让它去加载h5页面。
[0082]
模糊测试的流程如图4所示,先进行payload的构造,包含一些危险字符串和生成的随机字符,然后通过selenium进行函数调用,最后查找字符串是否回显在页面中。
[0083]
模糊测试过程中综合考虑了xss攻击模式的几十种情况,下表列出了本发明使用的几种xss攻击模式。
[0084][0085][0086]
经测试,本发明能够在检测到js bridge方法的基础上,能准确检测出h5存在的注入漏洞。
[0087]
以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术无需创造性劳动就可以根据本发明的构思作出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。

技术特征:
1.一种检测安卓混合型app安全漏洞的静态分析方法,其特征在于,包括以下步骤:步骤1、对apk进行反汇编,得到jimple代码;步骤2、对所述jimple代码进行配置检测;步骤3、根据预先总结的js和native互相通信的方式,对js bridge进行提取,基于soot工具,检测出所有的js bridge方法;其中,所述互相通信的方式包括拦截url请求的方式、拦截prompt、alert函数的方式、注入js上下文的方式;步骤4、分析js侧的危险调用,替换webview模块,覆盖加载h5 url的方法,在加载h5 url的方法中注入所述js bridge方法和sink存根方法,将重打包的app输入到flowdroid进行分析;步骤5、拉取h5页面生成抽象语树,在js代码定位js侧的所述jsbridge方法;步骤6、使用selenium对h5页面中的所述jsbridge方法模糊测试;步骤7、汇总分析结果。2.如权利要求1所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤2包括:步骤2.1、针对密码明文存储漏洞,对soot反汇编成的中间代码进行代码扫描,对所述jimple代码进行扫描,判断所述jimple代码里是否调用了websettings.setsavepassword(false),如果没有,则添加报警。3.如权利要求2所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤2还包括:步骤2.2、针对域控制不严格漏洞,对webview涉及跨域访问的api进行检查。4.如权利要求3所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤2.2中被检查的所述api包括:setallowfileaccessfromfileurls,用于设置是否允许通过file url加载的javascript访问其他的file域本地文件;setallowuniversalaccessfromfileurls,用于设置是否允许通过file url加载的javascript访问其他域;setallowfileaccess,用于设置是否要使用file协议;setjavascriptenabled,用于设置是否要使用javascript。5.如权利要求4所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤2还包括:步骤2.3、对逆向得到的androidmanifest.xml文件进行扫描,查找是否有activity的android:exported为true,如果设置为导出,则进一步检测所述activity是否使用webview以及加载的url是否是file协议,如果使用了所述file协议,再进一步检查所述setallowfileaccessfromfileurls、所述setallowuniversalaccessfromfileurls、所述setjavascriptenabled中的任意一个是否设置成了true,如果所述setallowfileaccessfromfileurls、所述setallowuniversalaccessfromfileurls、所述setjavascriptenabled中的任意一个设置为true,则存在域控制不严格漏洞。6.如权利要求5所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤3包括:针对所述注入js上下文的方式,在反汇编后的所述jimple代码中寻找有@
javascriptinterface的注解,注解锁标注的方法即为所述js bridge方法。7.如权利要求6所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤3还包括:针对拦截prompt/alert和拦截url请求两种通信方式的java反射调用,对反汇编后的jimple代码进行符号收集和前向搜索,定位到所述反射调用的具体类,并将所述具体类的所有public方法视为js bridge方法。8.如权利要求7所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤4包括:在取得所有所述js bridge方法后,创建一个新类,所述新类用于替代原有的webview类,在所述新类类的加载h5 url的方法中调用所述js bridge方法,并且添加sink函数,将调用结果作为参数输入到所述sink函数中;以及将注入完代码的app重新打包输出成apk文件,输入到flowdroid进行数据流分析。9.如权利要求8所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤5包括:获得所述h5页面后,使用babel对所述js代码进行语义分析,生成抽象语法树;其中,所述babel是一个javascript语法编译器。10.如权利要求9所述的检测安卓混合型app安全漏洞的静态分析方法,其特征在于,所述步骤5还包括:使用深度优先搜索算法,在所述抽象语法树中对所述js bridge方法进行名字查找,如果发现被检测函数的名字或者参数和收集到的所述js bridge方法匹配,则将所述被检测函数的函数名记录下来,然后对所述被检测函数进行模糊测试。

技术总结
本发明公开了一种检测安卓混合型app安全漏洞的静态分析方法,涉及信息安全检测领域,包括以下步骤:对apk进行反汇编;对得到的jimple代码进行配置检测;对js bridge进行语义分析,提取jsbridge方法;分析js侧的危险调用,替换webview模块,覆盖加载h5url的方法,在其中注入js bridge方法和sink方法,将重打包的app输入到flowdroid进行分析;拉取h5页面生成抽象语树,在js代码定位js侧的jsbridge方法;使用selenium对h5页面中的jsbridge方法模糊测试;汇总分析结果。该方法能够准确检测出安全漏洞。安全漏洞。安全漏洞。


技术研发人员:吴越 赖敬之 邹福泰
受保护的技术使用者:上海交通大学
技术研发日:2021.12.13
技术公布日:2022/3/8

最新回复(0)