微信小程式應用安全分析及設計
針對微信關於小程式安全設計的分析
針對微信小程式開發配置及部分配置機制分析微信小程式安全設計:
- AppSecret
管理員生成AppSecret,在與微信後台交互過程中部分介面使用,如 auth.code2Session 獲取會話密鑰session_key
安全分析
AppSecret維護必須為小程式管理員維護,默認微信側管理安全
❗ AppSecret在生成後需要後台應用保存維護,存在泄漏風險,AppSecret後台留存安全性需後台應用考慮。❗
Tips: AppSecret的保存需作為後台應用安全設計的考慮項。
- session_key
通過小程式獲取客戶敏感資訊時需使用會話密鑰對數據進行解密,詳見 微信開放平台
安全分析
- session_key獲取需後台獲取,依賴於AppSecret、小程式wx.login操作
- 小程式組件獲取敏感資訊需獲取客戶明示同意,且獲取資訊為加密資訊,加密資訊解密需後台通過session_key解密,session_key獲取依賴AppSecret
✊ 敏感資訊獲取涉及wx.login、加密數據、AppSecret、session_key、客戶明示同意,環環相扣。
- 伺服器域名
添加伺服器域名白名單,必須通過ICP備案且為HTTPS,設置後小程式可與該域名進行資訊交互
Tips: 小程式image src不受伺服器白名單限制。
安全分析
- 即使小程式內採用不安全的JS組件(如通過NPM導入開源組件)也可控制請求鏈路限制資訊外泄,將不安全限制在小程式內
- 常規WEB不安全組件,獲取頁面敏感資訊後通過構造script、image等標籤發起網路請求,傳輸非法數據,微信小程式通過域名白名單機制,結合小程式不支援通過JS動態WXML構造image等標籤,即使組件獲取到資訊通過網路請求向外推送
- 強制HTTPS確認通訊通道安全
✊ 通過白名單配置從傳輸通道控制資訊外傳風險。
Tips: 未來小程式是否支援類似於JS操作DOM方式通過JS動態修改WXML不可預知,若支援可能會引入其他的安全設計。
❗ HTTPS不安全網路下仍可被抓包查看,介面許可權控制、敏感數據保護等仍需通過應用安全設計控制。
- 版本管理
版本提交可設置提交版本IP白名單,限制訪問策略
安全分析
通過該機制防止APPID丟失時惡意修改程式碼上傳
- 開發安全
提供官方微信開發者工具,保證開發工具安全
通過以上提到的開發配置及小程式機制結合分析,微信針對小程式準備了前端應用基礎環境的安全保障,小程式開發者主要需要關注應用安全設計,如介面許可權控制、敏感數據保護等,接下來需要考慮如何防範小程式基礎環境外的安全保護。
微信小程式應用安全考慮點
針對以上分析,在小程式基礎環境安全體系內,首先需要開發人員關注點包括兩部分:
1、不安全網路HTTPS抓包,交易敏感資訊明文傳輸
HTTPS抓包分析
HTTPS抓包主要通過代理軟體欺騙客戶端隱藏真實服務端、偽造客戶端訪問後台服務方式實現HTTPS報文抓取,如BurpSuite Proxy,通過代理模擬服務端證書抓包
在HTTPS抓包下,服務端被偽造,暴露交易明文,故需通過合理的安全設計防範被抓包後的敏感資訊泄露,個人考慮可以參考HTTPS握手機制,模擬敏感資訊會話密鑰交換,保護交易報文敏感資訊
- 敏感數據傳輸設計
首先可了解一下HTTPS握手機制 HTTPS加密(握手)過程
接下來對小程式敏感數據傳輸進行討論:
參考HTTPS握手過程,計劃採取同樣方式完成敏感資訊會話密鑰交換
- 基礎
- 小程式內置RSA公鑰,服務端留存RSA私鑰
- 小程式內置RSA加密演算法、AES加解密演算法、AES隨機密鑰生成演算法、BASE64演算法、SHA256演算法
- 會話密鑰交換
- AES隨機密鑰生成演算法生成會話密鑰,小程式保管會話密鑰
- RSA演算法通過內置RSA公鑰加密會話密鑰,用於會話密鑰明文傳輸
- wx.login獲取loginCode作為密鑰交換時的簽名驗證資訊部分原文
- 對 loginCode+會話密鑰 SHA256 HASH演算法計算會話密鑰交換握手摘要資訊,用於後台驗證密鑰傳輸是否安全
- 拼接會話密鑰交換握手資訊,格式為
loginCode|sha256(loginCode+會話密鑰)
- 採用會話密鑰加密握手資訊,格式為
aes(握手資訊)
- 組裝會話密鑰交換報文,與後台通訊交互進行密鑰交換,格式為:
{"client_hello":"握手資訊", "secret":"rsa加密完的會話密鑰"}
- 後台接受報文,解析報文,並驗證會話密鑰交換是否有效,驗證方式如下:
a. 後台應用內置RSA私鑰解密獲取會話密鑰明文
b. 通過會話密鑰解密握手資訊獲取握手明文
c. 對解密完成的明文進行校驗簽名資訊是否正確,獲取明文竄loginCode及會話密鑰通過sha256計算簽名資訊,判斷是否與客戶端上送一致
d. 一致情況下對loginCode與微信服務端進行轉換,調用服務端API auth.code2Session 介面校驗loginCode是否有效
e. 會話密鑰校驗成功,後台生成會話標識,用於後續敏感資訊傳輸時標識會話資訊
- 安全介面設計
- 通過上述會話密鑰交換機制,完成了安全介面的基礎保障
- 在具備會話密鑰後,設計安全介面交互保障敏感資訊,設計流程如下:
a. 前端生成交易明文 json_data
b. 組織安全介面報文,包含要素:
- 會話標識 s_session_key 來源為密鑰交換成功後服務端響應給客戶端的會話標識
- 交易時間戳 s_time_stamp
- 交易數據密文 s_data 來源為 aes(json_data) aes加密密鑰為會話密鑰
- 交易報文摘要 s_mac 來源為 sha256(會話密鑰+json_data+s_time_stamp)
c. 後台報文解密及驗證,驗證流程如下:
根據s_session_key獲取會話密鑰 –> 解密s_data獲取交易明文 –> 服務端計算 s_mac_server (獲取服務段留存會話密鑰及報文時間戳,按照前端演算法及明文拼接方式一致計算) –> 比對計算結果
- 設計分析
通過敏感資訊會話密鑰機制,可以保護交易敏感數據不被泄露,分析如下:
- 內置RSA公鑰,客戶端僅包含RSA公鑰,在會話密鑰交換過程成只有服務端留存有RSA私鑰,故即使抓包,會話密鑰也無法被截取
- 採用微信loginCode作為會話密鑰交換時的驗證因子,這樣後台會話密鑰交換成功時通過loginCode與微信後台進行介面交互,
確保會話交互時是通過小程式官方生成的會話,通過微信介面獲取到OpenId留存會話,用於後續會話許可權控制使用- s_session_key會話標識後台未採用隨機演算法生成,通過 sha256(UUID+會話密鑰) 保證不可預知
2、安全參數保護
針對以上內容,在應用程式中存在一個風險點為應用程式敏感配置泄漏,故需針對敏感配置進行保護
敏感配置包括:AppSecret、RSA私鑰 等其他需保護的配置資訊
方式1: 對配置文件進行加密保護,防止直接泄漏,但是在使用過程中仍需應用程式解密。
方式2: 採用Vault或類似方案存儲敏感參數,僅了解可通過該方式實現,具體實現自行學習。
針對以上設計,已開發程式Demo上傳至Gitee
通用WEB安全設計
以上安全設計僅對基礎環境、通訊鏈路、通訊報文進行安全防護,針對WEB應用通用安全設計,需再行擴展。
許可權控制:
- 身份標識與數據範圍綁定,限制操作數據範圍
- 身份標識不可信任客戶端,由服務端維護
- 操作中鑒定每個身份欄位域與當前身份一致
客戶端不可信:
- 一切客戶端請求源數據不可信任,數據格式不可信任,數據內容不可信任
防重放:
- 對交易進行數據標記,同標記控制交易重放
注入攻擊:
- SQL注入,Mybatis框架#{}參數可以防範
- XSS注入:任意客戶端上送資訊需進行轉碼存儲及展示
Tips: 常見防護原則包括:最小授權、客戶端不可信。
推薦讀《白帽子講web安全》
應用安全審計簡介
有安全設計,才有安全審計
審計需準確每一筆請求記錄操作時間、操作人、行為、操作數據。
總結
web應用安全涉及方方面面,包括網路安全、應用安全、系統安全等,開發人員作為應用開發專業人員,需關注應用安全,具備基本的安全底線。
各項安全面需緊密結合,才可構造出一個安全的應用環境,比如網路設備再安全,應用層開發一個簡單的SQL查詢功能,查全庫數據,那整個應用環境也是不安全的。
Tips: 作為應用開發人員,安全底線不可失,研究防範,不可研究破壞。