一种基于小程序框架的漏洞检测方法

文档序号:32408454发布日期:2022-12-02 20:58阅读:89来源:国知局
一种基于小程序框架的漏洞检测方法

1.本发明属于漏洞检测与测试技术领域,具体涉及基于小程序框架的漏洞检测方法。


背景技术:

2.移动应用程序以丰富的功能为人们的工作和日常生活带来了极大的便利。为了更好地服务现有用户并不断吸引新用户,微信、支付宝等流行应用将自己打造成为超级应用,吸引第三方开发者入驻,提供尽可能丰富的内容和功能。运行在超级应用程序中的由其他各方开发的子应用程序,被称为“小程序”。这种小程序框架的生态系统非常流行,例如,微信中就存在380万个小程序,比谷歌应用商店中安卓应用的数量(304万)还要多。
3.现在的移动端应用开发有三种不同的模式:原生应用(纯原生开发)、web应用、混合应用(混搭开发)。原生应用使用安卓原生开发的app,其优势为应用性能、用户体验最好,但其劣势也相对明显,开发门槛高,资源投入多,升级困难等;web应用内的业务使用纯前端的方式开发和渲染,开发简单,代码在多段环境中可以复用,但往往用户的交互体验较差;混合应用则综合以上两种模式的优点,既有高效的开发速度又能给用户带来高性能体验。而小程序框架的开发模式就属于混搭式的开发方式,既使用了安卓原生开发,又具备加载web资源的能力。
4.当用户在超级应用程序中点击一个小程序开始启动运行时,超级应用程序中对应的安卓组件activity会接收到一个通知其启动的intent,并将对应的小程序的资源从服务器下载到移动端本地,然后根据小程序代码逻辑将内容加载到webview(安卓组件)实例中。webview实例能够加载从服务器端下载到移动端本地的模板文件,或是来自不同域名身份的第三方的外部web资源,例如,小程序内部可以加载第三方的广告提供商域名;完成加载并渲染后,小程序可以访问由超级应用程序提供的具有强大功能的敏感特权api,例如,这些api可以访问已保存的用户数据(比如注册时使用的账户、电话号码等个人信息),也可以利用为超级应用程序提供的操作系统级资源(比如,地理位置、摄像头和麦克风等)。小程序访问api的能力是由webview组件提供的,开发者可以选择是否给webview组件绑定javascript bridge,运行在webview组件中的javascript代码可以通过这个javascript bridge调用到超级应用程序中的java代码,从而访问超级应用程序提供的敏感api。
5.在小程序通过webview加载内容时,需要对加载的内容实施可靠的安全策略,否则会导致移动端小程序加载并渲染出乎意料的违背小程序开发者意图的视图内容;在小程序调用由超级应用程序提供的敏感特权api时,也需要对每次的api调用实施访问控制策略,不能任由每次api调用都被成功执行,否则可能会导致用户或系统资源的泄露。
6.对于传统的静态分析而言,小程序的技术框架是跨语言实现的,小程序本身的代码逻辑是基于javascript编写的,而小程序运行的环境超级应用程序则是使用java编写的;除此之外,小程序采用定制化的代码做开发,存在自己独特的生命周期函数,打包之后的小程序代码呈碎片化分布;并且小程序代码往往动态从云端下发加载。传统的静态分析
没有办法解决这些挑战。
7.对于传统的动态测试而言,小程序没有一个统一格式的输入,而且存在很多启动入口,无法高效地生成可以进行批量动态测试的输入,而且不同的超级应用程序要求的输入格式存在差异性,所以传统的动态测试没有办法解决这些挑战。
8.以上两种安全策略的正确实施是保证小程序安全的基础,如果其中任一环节的安全策略出现漏洞,就很可能导致用户或系统遭受到攻击。


技术实现要素:

9.本发明的目的是针对新兴的超级应用程序中的小程序框架,提供一种自动化检测其安全漏洞的方法。
10.本发明提供的基于小程序框架的漏洞检测方法,利用爬虫技术、模糊测试技术、静态程序分析和动态测试技术,自动检测流行小程序框架中的两种漏洞类型:云侧软件成分加载漏洞和端侧api访问控制漏洞。
11.本发明方法的提出基于如下的观察(客观实际):超级应用程序中的流行小程序框架,其主要技术原理分为两个部分,第一部分使用webview组件加载并渲染相应的小程序页面,第二部分采用jscore线程运行小程序的javascript逻辑脚本。小程序展示给用户的内容实现在第一部分中,真正实现功能的api调用逻辑则实现在第二部分中。
12.在加载并渲染对应的页面内容时,小程序应该对加载的页面内容进行管控,即应该限制加载什么样的页面内容用于展示给用户。对于此阶段,本发明提出了一个基于安卓中的intent机制的检测模型,可以自动化检测小程序开发者在此阶段施加的安全策略是否全面可靠。
13.在实现小程序相应功能并执行api调用时,不同api的功能会涉及到敏感的用户信息或操作系统级资源。因此超级应用程序需要对每次api调用实施访问控制,即判断此次api调用是否应该被允许,对应的资源是否应该被合理保护。对于此阶段,本发明提出了基于单一变量的动态测试模型,可以检测超级应用程序对于api访问控制的安全策略是否全面可靠。
14.本发明可以自动化识别集成了小程序框架的安卓应用程序(以下简称app)并检测其中小程序框架的两种类型漏洞:云侧软件成分加载漏洞和端侧应用程序编程接口(以下简称api)访问控制漏洞。现在市场上的超级应用程序为了尽可能地让用户的需求在当前app中形成闭环,即不再需要为了实现别的需求而切换到另一个app,集合了很多由其他各方开发的子应用程序。这种特性使其变得非常流行,从而越来越多的app接入了小程序框架。例如,在微信这个超级应用程序中,就托管了超过380万个子应用程序。针对小程序这种新兴的流行框架,本发明提出了一种基于静态程序分析和动态程序测试相结合的检测方法,用于检测小程序框架中两种类型的漏洞。
15.对于检测软件成分加载漏洞,本发明利用模糊测试技术,将启动小程序的链接中的部分字段进行变异,然后通过安卓中的intent机制启动对应的app并在其对应的小程序中加载相应的软件成分,通过加载结果来判断是否存在该类型的漏洞。
16.对于端侧应用api访问控制漏洞,本发明采用动态测试技术,在每次测试中控制单一变量,通过观察同一个敏感api的在不同实验环境下的调用结果来判断是否存在该类型
的漏洞。
17.本发明能够检测出app中(类)小程序框架中的两种漏洞,发现其在安全策略上存在的缺陷,从而阻挡攻击者的恶意攻击。
附图说明
18.图1为本发明基于小程序框架的漏洞检测方法流程图示。
具体实施方式
19.为了评估市面上使用了小程序框架的超级应用程序在这两个阶段上实施的安全策略,本发明提供的基于小程序框架的漏洞检测方法,分为四个步骤,参见图1所示。具体为:(一)收集端云结合的(类)小程序数据集本阶段中,通过静态分析尽可能地从普通的应用程序中过滤出集合了小程序框架的超级应用程序。
20.为了收集尽可能多的集合了小程序框架的超级应用程序,本发明从google play和豌豆荚上爬取了近6000个流行的免费的安卓应用程序。基于小程序渲染页面是通过安卓中的webview组件实现的,通过静态分析对初始的数据集进行过滤,如果在静态分析中发现该应用程序使用了webview组件则保留,否则丢弃。但是对于安卓应用程序来说,使用webview组件是一件比较常见的事情,例如,应用程序可以使用webview组件来加载隐私政策、广告页等等。对于这种仅使用webview组件来加载本地或外部内容的情况,对应的webview组件通常不会被开发者绑定javascript bridge,而小程序加载的页面需要和用户交互并且具有访问超级应用程序提供的api的能力,其webview就必然会被绑定javascript bridge。给webview组件绑定javascript bridge有两种方式,一种是使用addjavascriptinterface()方法将javascript bridge的实现类暴露给webview组件中运行的javascript代码,另一种是通过拦截javascript中的几种事件,例如console.log()、alert()、prompt()、confirm(),并重写java侧的回调函数实现相应功能。通过静态分析定位上述的这些特征,对于重写事件回调函数的情况,基于人工分析,增加以下约束:回调函数必须被重写且从回调函数开始的调用链长度必须大于n,这能更精确地保证事件的回调函数是用于实现javascript bridge,而不是仅用于记录webview组件中触发的javascript事件。
21.通过以上特征过滤出超级应用程序后,为了对云侧软件加载漏洞进行测试,本发明还需要收集运行在超级应用程序中的小程序资源,因为小程序能够加载什么样的外部web资源是由小程序的开发者决定的,所以云侧软件成分加载漏洞是否存在,是由小程序本身的代码逻辑决定的。在此步骤中,针对不同的超级应用程序使用以下三种方式来做对应的收集:(1)分析小程序启动时的流量,由于每个小程序都有一个唯一的id与其对应,用于识别该小程序,通过截获当移动端的超级应用程序根据该id从服务器下载对应小程序的资源时的流量,并修改其中的id字段,再将此条请求重放,就可以获取到存储在服务器上不同小程序的相关资源;
(2)某些超级应用程序对流量进行了加密导致无法抓取到对应的流量并修改字段进行重放,于是对这个超级应用程序进行逆向工程,定位到根据id构造请求获取服务器资源的前置函数,重放对该前置函数的调用,并向其中传入不同的小程序id,就可以获取到相应小程序的相关资源;(3)在以上两种方式都无法成功的情况下,通过ui automator模拟人工使用小程序,这个方法基于以下观察:当用户使用一个小程序时,超级应用程序必须将对应小程序的资源从服务器下载到本地;使用ui automator可以模拟人工不停地访问不同的小程序,这样不同小程序的资源就会被下载到移动端本地,从相应的存储目录中就可以获取到这些被访问过的小程序的相关资源。
22.(二)云侧软件成分加载漏洞的测试本阶段中,通过模糊测试来检测相应小程序是否存在云侧软件成分加载漏洞。
23.小程序能够加载什么样的外部web资源是由小程序的开发者决定的,所以云侧软件成分加载漏洞是否存在,是由小程序本身的代码逻辑决定的,因此本发明首先通过静态分析从小程序的代码资源中提取了小程序的id、该小程序包含的页面名称以及每一个页面启动时接收的参数字段名称,用于构造后续进行模糊测试的链接。
24.对于超级应用程序,要么从其官方文档中收集与小程序相关的deep link,要么通过静态分析从应用程序代码中提取可能的deep link。提取到deep link之后,deep link的格式如下:scheme://path/id/page key=value。其中scheme的值与超级应用程序一一对应,每一个超级应用程序都有自己的scheme值,指定了该值就指定了这个deep link将要启动哪一个超级应用程序。path字段也与超级应用程序强相关,超级应用程序通常使用该字段标识不同的业务。id、page以及key字段与小程序框架强相关,分别指定了该deep link要启动的小程序、对应的页面以及向该页面传递的启动参数key。对于这样一个deep link格式,本发明根据不同的超级应用程序,向对应的字段填充相应的值,并且变异其中的value字段。
25.对于变异出来的每一个不同的deep link,其对应的内容能否被相应的小程序成功加载,本发明通过hook住webview组件的loadurl()函数,通过该函数的执行结果来进行判断。如果该函数接收的参数与deep link中的内容一致,则说明该小程序存在云侧软件成分加载漏洞。
26.(三)端侧敏感api发现本阶段,通过静态分析和动态测试相结合的方式发现更多的端侧的敏感api。
27.为了测试超级应用程序是否存在端侧api访问控制漏洞,首先需要从超级应用程序中提取出对应的api列表。在此步骤中,本发明采用静态分析和动态分析相结合的方式。识别api框架基于以下观察:运行在webview组件中的javascript代码访问api时,会经过javascript bridge到达超级应用程序中的java代码,从控制流上分析,每次api调用都会到达api池(以下称为api pool),这个api pool中存储着小程序框架下的所有api,每次api调用都会从api pool中取出对应api的实现类,并进行后续的调用。因此,此步骤的目标是定位该api pool并提取出其中存储的内容。
28.识别api框架分为两步:第一步,识别webview组件并定位其绑定的javascript bridge入口,该入口函数接收的参数就是每次的api调用,因此对入口函数接收的参数进行
污点分析,当污染到api pool(在代码中的表现形式为java.util.map或其子类)时,将对应的api pool所在类以及访问到该api pool的方法签名输出成json格式的文件记录保存,用于后续的动态分析输入。至此,第一步静态分析的目标达成。第二步,使用基于xposed的hook框架,用于编写hook函数实时获取被触发的函数信息。将第一步的输出作为第二步的输入,通过读取json文件自动化hook住在第一步中被污染到的目标函数及可能的目标api pool;接下来启动不同的超级应用程序,使用其中的小程序功能,被hook住的函数,如果被触发,就会输出对应的信息,被触发的api pool也会被打印出其中存储的内容,从而获取到超级应用程序提供给小程序框架的敏感api。
29.(四)端侧api访问控制漏洞测试本阶段,通过动态测试来检测超级应用程序是否存在端侧api访问控制漏洞。
30.超级应用程序基于调用敏感api的小程序id或调用敏感api的页面所属者身份做权限校验,对于某些特权小程序或某些特权页面所属者,他们拥有调用所有敏感api的权力。但结合“云侧软件成分加载漏洞”,就可以将攻击者的身份提权到特权级别的身份,攻击者就拥有了调用敏感特权api的能力。
31.为了检测超级应用程序的api访问控制是否存在漏洞,本发明针对同一个api,将其在不同的身份(不同的小程序、不同的页面所属者)下进行调用,如果其调用结果出现差异,就判定该api的访问控制存在漏洞。
32.为了尽可能地保证测试api的完备性,本发明在小程序正常运行的过程中,收集不同api调用的示例,将其与端侧发现的敏感api求并集,将这个并集作为api调用库,建构测试用例。
33.对于同一个api,固定同一个小程序id,改变不同的页面所属者身份,在这种实验条件下进行测试,比较其调用结果;如果在某一个页面所属者a身份条件下调用成功,而在其他页面所属者身份下调用失败,则说明该页面所属者a是特权身份,结合“云侧软件成分加载漏洞”模拟该页面所属者a就可以使攻击者拥有调用敏感api的能力。
34.对于同一个api,固定页面所属者身份,改变不同的小程序id,在这种实验条件下进行测试,比较其调用结果;如果在某一个小程序id
ꢀ“
x”下调用成功,而在其他小程序id下调用失败,则说明该小程序id
ꢀ“
x”是特权身份,结合“云侧软件成分加载漏洞”向该小程序中加载受攻击者控制的恶意页面,就可以使攻击者拥有调用敏感api的能力。
35.模拟测试(一)测试环境准备为验证本发明方法的可行性、有效性,一切具体实施均在统一的服务器配置以及移动设备上开展。具体来说,本方法的模拟测试环境所依赖设备包括一台搭载安卓10.0系统的一加7手机,处理器为骁龙855,包含8gbram以及256gbrom。静态分析方法依赖于高性能服务器,在本测试过程中,采用的是安装了ubuntu18.04版本系统的x86_64位服务器,包含548.61gb的存储,共有10核39个处理器,cpu为intel xeon e7-4820 v4版本。
36.(二)模拟测试过程及结果首先,本方法通过静态分析,从6,000个流行安卓应用中,识别出了291个包含webview组件和复杂javascriptbridge实现的应用,通过相关文档介绍能够快速找到47个小程序超级应用,每一阶段过滤结果如下表所示。
37.。
38.进一步地,本方法能自动化从主流的微信、百度、支付宝应用中收集到上万数量的小程序,以进行后续的漏洞分析。
39.在端侧敏感api发现测试环节,本方法针对15个流行的应用展开分析,识别出上4038个端侧api,并且经过人工分析,确认接近50%为非公开文档的api。
40.。
41.本测试针对47个小程序均依据上述方法实现了相关漏洞检测代码。检测结果如下。
42.我们发现有9个超级应用没有采取任何安全措施来保护超级应用的敏感功能接口。剩下38个超级应用对资源加载的检查存在安全漏洞,15个超级应用采取了基于域名的访问控制机制并且都遭受webview组件漏洞的影响。还有两个超级应用中的凭据管控存在疏漏,也可能造成访问控制的失效。在漏洞影响方面,38个超级应用都可能遭受越权攻击,其中31个存在钓鱼,35个存在潜在的敏感信息泄漏。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1