[转]微信小程序安全浅析

本文转自:http://blog.csdn.net/baize_security/article/details/54582854

引言

近期微信小程序重磅发布,在互联网界掀起不小的波澜,已有许多公司发布了自己的小程序,涉及不同的行业领域。大家在体验小程序用完即走便利的同时,是否对小程序的安全性还存有疑虑。白泽日前对微信小程序进行初步的安全技术分析,在此整理出来抛砖引玉,如有描述不当的地方,欢迎纠正,轻拍。

本文中,大白将从小程序的框架、功能模块安全、账户使用安全方面进行剖析,希望能为各位泽友带来不一样的认知。

一、小程序框架概述

在第一部分小程序框架概述中,将介绍小程序抽象框架、小程序调用框架和小程序初始化流程。下面让大白来逐一介绍。

1、小程序抽象框架

这里写图片描述

1.1视图层

包含WXML、WXSS和页面视图组件。

WXML是一种类似XML格式的语言,支持数据绑定、条件渲染、列表渲染、自定义模板、事件回调和外部引用;

WXSS是一种类似CSS格式的语言,用于描述WXML的组件样式,决定WXML中的组件如何显示;

组件是框架提供的一系列基础模块,是视图层的基本组成单元,包含表单组件、导航、地图、媒体组件等常用元素,如图1说明当前小程序支持的的视图组件;

这里写图片描述 图1 小程序视图组件

1.2逻辑接口

包含小程序注册、页面注册和功能API。程序注册代码位于app.js,页面框架注册位于app.json,如图2所示为官方示例小程序的app.js和app.json。功能API当前包含网络请求功能、文件处理功能、数据存储功能、微信的开放接口功能等,详见微信官方说明,如图3所示。

这里写图片描述 图2 小程序注册代码示例

这里写图片描述 图3 小程序功能API示例

1.3 原生实现层

承载小程序依赖的具体操作,由微信APP支撑实现,包括tbs内核、JSAPI框架、初始化小程序配置、功能接口实现等,实现代码主要位于com.tencent.mm.plugin.appbrand包,关联功能有微信平台原有的数据存储能力、二维码能力、网络请求能力、支付能力等。

2、小程序调用框架

这里写图片描述 图4 微信小程序调用框架简图

上图主要说明小程序功能逻辑框架流程,由顶层的小程序实现代码(类似js),到微信底层支撑实现模块的调用流程,通过微信JSAPI框架支撑页面到本地实现的桥接调用。小程序缓存数据存放在Storage中,对应文件为DB数据库;小程序文件操作通过Hash机制进行映射,并存储在外部存储空间。

承载小程序展示的组件有.plugin.appbrand.ui.AppBrandUI、.plugin.appbrand.ui.AppBrandUI1、.plugin.appbrand.ui.AppBrandUI2、.plugin.appbrand.ui.AppBrandUI3、.plugin.appbrand.ui.AppBrandUI4共五个组件,五个组件实现逻辑相同,AppBrandUI1- AppBrandUI4继承自AppBrandUI,图5为每个承载小程序的Android组件定义。

这里写图片描述 图5 承载每个小程序展示的组件定义

支持最多同时有五个小程序在加载运行状态,每个小程序使用独立进程运行,如果当前开启的小程序已位于缓存进程中,则无需重新加载直接开启(速度快),否则重新加载并替换(如果已有五个缓存进程存在)存在时间最久的缓存进程,若当前未满五个缓存进程,则从未用进程中随机取得一个使用。下图展示微信APP同时已开启过五个小程序的对应进程。

这里写图片描述 图6 小程序的进程缓存示意图

3、小程序初始化流程

小程序初始化流程可分为开发者后台控制关键配置和安全的配置更新流程。

3.1开发者后台控制关键配置

小程序后台控制的配置信息主要包括小程序名称、图标、最大webview深度、最大请求数、请求合法域名列表、下载合法域名列表和上传合法域名列表、socket合法域名列表以及APP包的基本信息等,动态加载的配置信息相关代码详见【附录1】。

3.2安全的配置更新流程

启动小程序检查是否需从服务端更新最新配置,如果需更新则下载最新配置到本地APP。在初始化阶段完成小程序的关键属性更新和配置,此部分属性配置完全由后端配置控制,在更新传输和本地存储被恶意篡改的可能性极低,提取配置信息的实现代码详见【附录2】。

综上内容,大白为泽友们介绍了小程序的框架部分,接下来,大白要讲的就是小程序功能模块安全分析了,来围观哦!

二、功能模块安全分析

功能模块安全分析大白将分为6小部分介绍,分别是: 1、网络传输安全 2、数据存储安全 3、文件存储安全 4、扫码二维码安全 5、微信开放接口安全 6、小程序钓鱼风险 7、泄露数据到微信隐患 下面我们先看一下网络传输安全。

2.1网络传输安全

支持发起通用请求、文件上传下载、WebSocket通讯机制。

Https校验安全

通用request网络请求仅支持采用https,处理请求的接口位于com.tencent.mm.plugin.appbrand.g.c中,包含url校验、域名校验、发起请求和处理响应结果。图7图8分别为官方正式DEMO和某银行APP请求包示意图。

这里写图片描述 图7 官方DEMO request功能请求包

这里写图片描述 图8 某银行APP request功能请求包

Https校验采用类似浏览器的策略,通过系统原生的URL.openConnection()方式请求,证书校验的策略为校验公钥证书的根证书是否在合法CA列表凭证中。因此自签名证书无法使用;针对特定终端设备,即是校验公钥证书的根证书是否在受信任的凭据中,在设备被恶意安装代理根证书的前提下,存在被中间人攻击的风险。Request网络请求实现代码详见【附录3】。

通过域名控制可以访问的url

由后台配置小程序支持的域名(见1.3),仅可访问已配置域名的url,校验过程会将配置的域名先下载到本地,然后每次请求时本地做域名检查通过后才发起。域名检查代码实现详见【附录4】,图9展示了域名不匹配进行错误请求的示例。

这里写图片描述 图9 小程序域名控制检查

此外,对于通用request请求平台会进行请求超时控制(当前应该是5s),当请求超过5s即会被中断(文件上传操作也有超时中断控制),如下图所示超时后请求将被抛掉。

这里写图片描述 图10 请求超时中断控制

网络下载

同样仅支持从含有已配置域名的url下载资源,不是走http/https协议。下载成功后临时存放,通过自定义协议wxfile进行访问,映射到SD卡上目录/sdcard/tencent/MicroMsg/wxafiles/wx_id/tmp_[hash_value]。

这里写图片描述 图11 网络下载文件示意图

文件上传

上传至小程序合法域名下的服务器上,并保存临时文件在SD卡的文件存储区域/sdcard/tencent/MicroMsg/wxafiles/wx_id/tmp_[hash_value]。

这里写图片描述 图12 文件上传示意图

小程序外链url规范

这里写图片描述 图13 小程序不允许外链url规定说明

小程序在微信的生态下运行,不开放给个人使用(需要企业)。在小程序中不允许调整到外部网站,也不允许放链接。同时微信在小程序发布前会对小程序进行审核。

2.2数据存储安全

以(key,value)形式存放在本地缓存,将小程序需要存储的key/value数据直接存储到Storage DB缓存,小程序进行数据保护需要自行做加密处理。数据存储在本地DB,微信APP会对DB数据整体做本地加密保护,所以小程序本地存储数据的安全性依赖于微信数据库加密方案的安全,策略与EnMicroMsg.db类似,如下图所示。

这里写图片描述 图14 本地数据存储示意

2.3 文件存储安全

文件保存在SD卡/sdcard/tencent/MicroMsg/wxafiles/wx_id/目录下,通过wxfile://协议指向SD卡目录下的文件。

这里写图片描述 存放SD卡的文件有做完整性校验,无法被篡改。首先,最终存储的文件名是:对称加密(文件流内容Alder32校验和|原始文件名)生成的,最终文件名和文件内容会通过自校验判断完整性;其次,本地缓存是通过HASH映射查找文件。所以即使能破解文件名和文件内容,绕过文件自身签名校验,篡改为攻击者的伪造文件,小程序APP也无法映射到该伪造文件进行使用。

2.4 扫码二维码安全

扫码功能(wx.scanCode)依赖微信APP的原生的扫码功能;生成小程序特定页面的直达二维码,依赖于ACCESS_TOKEN,而ACCESS_TOKEN是通过小程序(公众号)私有的APPID和appsecret请求得到,攻击者无法获知到该信息伪造生成二维码。

2.5 微信开放接口安全

用户信息获取,包含以下信息:

这里写图片描述

接口返回的明文数据会进行签名校验,需要依赖登录session_key;接口返回的敏感数据会通过密文返回,解密算法依赖登录session_key。攻击者无法获知用户的session_key进行破解,窃取用户数据。

此外分享、客服消息、模板消息中输入的内容仅会以文本形式输出;模板消息会将数据通过https传输到服务器,而后推送到客户微信服务通知;微信支付功能继承微信平台原有的功能,安全性较为可靠。

开放平台大部分功能会先通过wx.login获得code;然后使用该code换取openid;以此openid进行既定的微信功能操作,比如发送模板消息推送、发起微信支付等。

这里写图片描述 图15 开放平台发布模板请求示意图

2.6 小程序钓鱼风险

微信小程序以唯一appid标识身份,不同小程序拥有不同的appid。如果恶意开发者伪造流行的小程序APP,如美团、大众点评,制作一个仿冒的微信小程序,且使用不同的appid,有可能绕过微信的审核流程发布到市场。小白用户如无辨识能力,极可能被钓鱼受骗。但由于小程序无法嵌入url跳转,同时有访问域名的控制,使得钓鱼风险在一定程度上减轻。小程序钓鱼风险依赖于微信平台的发布审核、监管控制。

2.7泄露数据到微信隐患

微信小程序的网络请求通过微信APP实现转发,微信平台可能可以获取到小程序的所有网络请求和存储数据,因此对于小程序业务敏感的数据,建议由小程序再做一层保护;小程序的操作轨迹日志会加密传送到腾讯TBS后台,如下图所示。

这里写图片描述 图16 操作轨迹日志监控上传

三、小程序账户使用安全

通过目前使用体验,发现当前存在三种账户形式:

方式一:通过wx.getUserInfo获取的微信用户信息,以openid标识一个用户应用到小程序;

方式二:通过公众平台appid+appsecret+code,换取session_key/openid,并生成小程序第三方session,在小程序的服务器维护第三方session和微信session_key/openid的关联;客户端使用第三方session进行请求;

方式三:通过小程序内部自实现的登录模块,如手机号+动态验证码登录

方式一是一种弱账户体系设计,小程序本身无法获得微信用户的标识信息,如手机号、身份证或银行卡,依赖于微信开放平台接口可以提供的用户信息,详见2.5节,一般会在页面上展示微信用户昵称和头像,如下图17所示。

这里写图片描述 图17 使用微信信息登录

方式二和方式三是强账户体系,方式二类似微信公众号的授权机制,通过小程序获得的code和微信用户基本信息,到第三方服务器获取访问的token(第三方session),第三方服务器维护用户使用的session与微信session_key/openid的关联关系。图18为微信官方提供的登录实现时序图,图19为某餐饮小程序授权登录的请求过程。

这里写图片描述 图18 官方提供的授权登录实现方案

这里写图片描述 图19 某餐饮小程序授权登录过程

以上第一个请求通过code和微信基本用户信息到第三方服务器换取token,而后的请求通过token请求用户个人数据,如团购代金券使用历史记录。方式二不能将微信公众平台的appsecret或者session_key(属于敏感信息)传递到客户端,否则可能导致安全攻击。方式三属于小程序自身实现方式,依赖自身实现的安全性,与微信平台无关。

四、总结

说了这么多,大白也该总结一下了,大致如下8点:

1、框架上继承了微信成熟的JSAPI框架和底层的TBS浏览器内核;

2、小程序的关键信息完全由后台控制进行配置,如可访问的域名信息;

3、通用网络传输使用Https,并对访问域名进行校验控制,无法抵御攻击者在本地安装代理证书实施中间人攻击的威胁;

4、本地数据存储采用(KEY,VALUE)形式存放在DB,数据的保护继承了微信的数据库加密防护策略;

5、本地文件存储采用HASH映射机制进行文件定位,文件存储在外部存储,本身通过自定义算法实现完整性校验;

6、存在仿冒钓鱼小程序的可能,依靠于微信平台的审核监管能力;

7、针对特定小程序,由于是在微信平台生态中运行,小程序自身仍需对敏感数据进行安全防护;

8、小程序登录体系可以依赖微信接口和公众号平台,也可以由小程序自行实现。前者需要根据微信平台的安全规范实施,后者则由小程序自行控制安全性。

五、附录

下面大白补充一下上述文中4个附录内容:

附录1:小程序初始化后台配置信息

这里写图片描述

附录2:更新并提取后台配置信息逻辑

这里写图片描述

这里写图片描述

附录3:request网络请求实现

这里写图片描述

这里写图片描述

附录4:网络请求域名校验

这里写图片描述

这里写图片描述

本次小程序的安全策略解析分享完结,本文由白泽原创,欢迎各位转发分享~

END 如果您有任何关于互联网金融安全的任何问题,欢迎留言,我们将知无不言,言无不尽~

关注白泽安全团队  互金安全尽你掌握

这里写图片描述

 

转载于:https://www.cnblogs.com/freeliver54/p/6541158.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429552.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32 MDK编译后生成的 .map文件深入分析

.map文件是STM32开发中非常重要的一个文件,在该文件中可以详细的查看单个文件、函数及用户定义的全局变量等的占用RAM和ROM(一般为片内FLASH)的空间大小,通过了解这些信息可以很方便的进行代码的优化。 在MDK5中,生成…

C#程序的组织结构

C#程序的组织结构: namespace(命名空间): C#程序中的一种代码组织形式,主要用来标识类的可见范围。一个namespace中包含了一系列的类,一般一个文件中会使用多个using语句引入多个命名空间。 语法&#xff…

hihocoder1477 闰秒

地址:http://hihocoder.com/problemset/problem/1477 题目: 闰秒 时间限制:10000ms单点时限:1000ms内存限制:256MB描述 计算机系统中使用的UTC时间基于原子钟,这种计时方式同“地球自转一周是24小时”的计时方式有微小的偏差。为了弥补这种偏…

C#命名空间namespace中不能直接包含字段(变量)或方法(函数)之类的成员

C#命名空间即namespace中不能直接包含字段(变量)或方法(函数)之类的成员,须将字段或方法放到类class中,否则编译器会报错。 C#命名空间中不能直接定义字段(变量): 将val…

Lucene实战之初体验

前言 最早做非结构化数据搜索时用的还是lucene.net,一直说在学习java的同时把lucene这块搞一搞,这拖了2年多了,终于开始搞这块了。 开发环境 idea2016、lucene6.0、jdk1.8 使用lucene准备条件 1、pom.xml 2、测试数据。 我从博客园首页拿了几…

C#中变量(成员变量、局部变量、全局变量)的作用域

不管在任何编程语言中都有变量的定义,变量就像是一个容器,不同的变量会在内存中占据不同大小的内存空间。定义变量后会将分配的地址绑定在这个变量名上,以后对该变量名的操作就是对该内存地上存储内容的操作。 namespace test {class myTest…

Servelt中的ServletContext对象

转载于:https://www.cnblogs.com/yxh-only/p/6548046.html

export function函数传参_从底层看前端(七)—— JavaScript到底有多少种函数?

在上篇文章中我们了解到了执行上下文是什么,也知道了任何语句的执行都会依赖特定的上下文。一旦上下文被切换,整个语句的效果可能都会发生变化。那么,切换上下文的时机就显得非常重要。在JavaScript中,切换上下文最主要的场景就是…

liunx常用命令0

1 开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 点击“未列出?”-->输入root和密码 2 使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 ctrlaltf2 3 使用命令退出虚拟终…

2个td合成一个td_18个月16个爆款,合成类玩法的下一个机会在哪?

18个月16个爆款!近日,编者体验了近18个月爆款小程序榜单之中的游戏,体验之后编者发现,在这200多款游戏中,有16款都应用了合成类玩法,而且部分游戏是数次登榜,比如枪火工厂、全民养鲲、世界争霸等…

在线代码图片生成工具carbon

在日常工作中时常需要和同事间进行代码的沟通和交流,有时只是需要讨论某一段代码的内容,因此不必将整个文件发给同事。通常可以将部分代码进行截图,或者直接将部分代码复制粘贴发送给同事。但以上方法或因为代码太长需要多次截图,…

antd 日期时间选择_Excel最全时间类函数总结,有必要收藏一下哦

Excel数据格式中,一共分十一类,其中两类分别是日期与时间。Excel中存在大量公式用于处理这两个类型的数据,下面一一介绍与之相关的函数。年月日函数Excel函数中分别用year()、month()、day()函数返回一日期的年、月、日,这三个函数…

C#中的变量类型(值类型、引用类型)

C#中的变量类型: 值类型:值类型直接存储的是变量的值,变量空间在栈上分配,分配速度比较快。给变量赋值时需注意变量类型的取值范围,给变量赋不合理的值会导致编译器报错。布尔类型的变量只有两种可选择的值true/false&…

Java:IDEA下使用JUNIT

单元测试的基本使用 一、环境配置 使用idea IDE 进行单元测试,首先需要安装JUnit 插件。 1.安装JUnit插件步骤 File-->settings-->Plguins-->Browse repositories-->输入JUnit-->选择JUnit Generator V2.0安装。 2.使用JUnit插件 在需要进行单元测试…

arcore之路-unity开发从入门到实践_Unity游戏开发——单例模式的最佳实践

0.前言StarryFun:Unity游戏开发——关于单例模式的理解​zhuanlan.zhihu.com之前一篇文章讲了单例模式的简单理解,自知其中有很多不严谨的地方,由于本萌新也是在学习阶段,所以去翻看了开源的项目都是怎么实现的,发现了…

光耦的简介

光耦,光电耦合器的简称,它是以光信号作为介质传输电信号的元器件。光耦的输入端和输出端信号可以非常好的进行隔离,因此在隔离电路中经常会见到光耦。光耦合器一般由三部分组成:光的发射、光的接收及信号放大。输入的电信号驱动发…

接待员如何向客人upsell_客房留言卡也能收获好评,看看高情商酒店如何做的?...

客人对酒店最客观的评价从点评中就能看到,那酒店服务如何才能被客人看到呢?可不可以通过一张留言卡,被客人感知到呢?本文整理了多个客房服务实际场景案例,帮助酒店了解如何写好这张留言卡。一、什么场景下放置留言卡&a…

“2020 RT-Thread开发者大会” 思考感悟

从2019年开始参加RT-Thread的一次线下培训活动后,就深深的喜欢上这个国产的RTOS,之后RT-Thread举办的活动基本都有参加(但每次活动抽奖都抽不到!)。当然,最为盛大的还属一年一度的RT-Thread开发者大会&…

小红书笔记_小红书的沙雕笔记,害人不浅啊

话说,当代人的十大必备软件是什么?要猫姐来说的话。除了微信微博抖音,小红书也肯定少不了!它简直就是大部分PLMM的“种草神器”。就连明星都纷纷入驻小红书变身为“美妆博主”。前一阵上了热搜榜和李晨分手的范冰冰也是小红书的一…