[轉]微信小程序安全淺析

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

引言算法

近期微信小程序重磅發佈,在互聯網界掀起不小的波瀾,已有許多公司發佈了本身的小程序,涉及不一樣的行業領域。你們在體驗小程序用完即走便利的同時,是否對小程序的安全性還存有疑慮。白澤日前對微信小程序進行初步的安全技術分析,在此整理出來拋磚引玉,若有描述不當的地方,歡迎糾正,輕拍。數據庫

本文中,大白將從小程序的框架、功能模塊安全、帳戶使用安全方面進行剖析,但願能爲各位澤友帶來不同的認知。json

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包,關聯功能有微信平臺原有的數據存儲能力、二維碼能力、網絡請求能力、支付能力等。

二、小程序調用框架

這裏寫圖片描述 圖4 微信小程序調用框架簡圖

上圖主要說明小程序功能邏輯框架流程,由頂層的小程序實現代碼(相似js),到微信底層支撐實現模塊的調用流程,經過微信JSAPI框架支撐頁面到本地實現的橋接調用。小程序緩存數據存放在Storage中,對應文件爲DB數據庫;小程序文件操做經過Hash機制進行映射,並存儲在外部存儲空間。

承載小程序展現的組件有.plugin.appbrand.ui.AppBrandUI、.plugin.appbrand.ui.AppBrandUI一、.plugin.appbrand.ui.AppBrandUI二、.plugin.appbrand.ui.AppBrandUI三、.plugin.appbrand.ui.AppBrandUI4共五個組件,五個組件實現邏輯相同,AppBrandUI1- AppBrandUI4繼承自AppBrandUI,圖5爲每一個承載小程序的Android組件定義。

這裏寫圖片描述 圖5 承載每一個小程序展現的組件定義

支持最多同時有五個小程序在加載運行狀態,每一個小程序使用獨立進程運行,若是當前開啓的小程序已位於緩存進程中,則無需從新加載直接開啓(速度快),不然從新加載並替換(若是已有五個緩存進程存在)存在時間最久的緩存進程,若當前未滿五個緩存進程,則從未用進程中隨機取得一個使用。下圖展現微信APP同時已開啓過五個小程序的對應進程。

這裏寫圖片描述 圖6 小程序的進程緩存示意圖

三、小程序初始化流程

小程序初始化流程可分爲開發者後臺控制關鍵配置和安全的配置更新流程。

3.1開發者後臺控制關鍵配置

小程序後臺控制的配置信息主要包括小程序名稱、圖標、最大webview深度、最大請求數、請求合法域名列表、下載合法域名列表和上傳合法域名列表、socket合法域名列表以及APP包的基本信息等,動態加載的配置信息相關代碼詳見【附錄1】。

3.2安全的配置更新流程

啓動小程序檢查是否需從服務端更新最新配置,若是需更新則下載最新配置到本地APP。在初始化階段完成小程序的關鍵屬性更新和配置,此部分屬性配置徹底由後端配置控制,在更新傳輸和本地存儲被惡意篡改的可能性極低,提取配置信息的實現代碼詳見【附錄2】。

綜上內容,大白爲澤友們介紹了小程序的框架部分,接下來,大白要講的就是小程序功能模塊安全分析了,來圍觀哦!

2、功能模塊安全分析

功能模塊安全分析大白將分爲6小部分介紹,分別是: 一、網絡傳輸安全 二、數據存儲安全 三、文件存儲安全 四、掃碼二維碼安全 五、微信開放接口安全 六、小程序釣魚風險 七、泄露數據到微信隱患 下面咱們先看一下網絡傳輸安全。

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 操做軌跡日誌監控上傳

3、小程序帳戶使用安全

經過目前使用體驗,發現當前存在三種帳戶形式:

方式一:經過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(屬於敏感信息)傳遞到客戶端,不然可能致使安全攻擊。方式三屬於小程序自身實現方式,依賴自身實現的安全性,與微信平臺無關。

4、總結

說了這麼多,大白也該總結一下了,大體以下8點:

一、框架上繼承了微信成熟的JSAPI框架和底層的TBS瀏覽器內核;

二、小程序的關鍵信息徹底由後臺控制進行配置,如可訪問的域名信息;

三、通用網絡傳輸使用Https,並對訪問域名進行校驗控制,沒法抵禦攻擊者在本地安裝代理證書實施中間人攻擊的威脅;

四、本地數據存儲採用(KEY,VALUE)形式存放在DB,數據的保護繼承了微信的數據庫加密防禦策略;

五、本地文件存儲採用HASH映射機制進行文件定位,文件存儲在外部存儲,自己經過自定義算法實現完整性校驗;

六、存在仿冒釣魚小程序的可能,依靠於微信平臺的審覈監管能力;

七、針對特定小程序,因爲是在微信平臺生態中運行,小程序自身仍需對敏感數據進行安全防禦;

八、小程序登陸體系能夠依賴微信接口和公衆號平臺,也能夠由小程序自行實現。前者須要根據微信平臺的安全規範實施,後者則由小程序自行控制安全性。

5、附錄

下面大白補充一下上述文中4個附錄內容:

附錄1:小程序初始化後臺配置信息

這裏寫圖片描述

附錄2:更新並提取後臺配置信息邏輯

這裏寫圖片描述

這裏寫圖片描述

附錄3:request網絡請求實現

這裏寫圖片描述

這裏寫圖片描述

附錄4:網絡請求域名校驗

這裏寫圖片描述

這裏寫圖片描述

本次小程序的安全策略解析分享完結,本文由白澤原創,歡迎各位轉發分享~

END 若是您有任何關於互聯網金融安全的任何問題,歡迎留言,咱們將知無不言,言無不盡~

關注白澤安全團隊  互金安全盡你掌握

這裏寫圖片描述

相關文章
相關標籤/搜索