深度分析:手游熱更新技術(shù)會被蘋果禁止么?
最近不少 iOS 開發(fā)者都收到蘋果的警告郵件,在郵件中,蘋果稱開發(fā)者使用了動態(tài)代碼更新技術(shù),要求開發(fā)者刪除相關(guān)代碼,并重新提交一個新的 App 版本以供審核。
郵件原文翻譯如下:
尊敬的開發(fā)者,
您的應(yīng)用,擴(kuò)展程序和/或鏈接框架似乎包含明確設(shè)計的代碼,能夠在應(yīng)用審核批準(zhǔn)后更改應(yīng)用的行為或功能,這不符合Apple開發(fā)人員計劃許可協(xié)議和應(yīng)用的第3.3.2節(jié)商店審查指南2.5.2。此代碼與遠(yuǎn)程資源相結(jié)合,可以幫助對應(yīng)用程序的行為進(jìn)行重大更改,與最初對App Store進(jìn)行審核相比。雖然當(dāng)前可能不使用此功能,但它可能會加載私有框架,私有方法,并支持未來的功能更改。
這包括將任意參數(shù)傳遞給動態(tài)方法(如dlopen(),dlsym(),respondingToSelector :, performSelector :, method_exchangeImplementations())和運(yùn)行遠(yuǎn)程腳本以便更改應(yīng)用程序行為或調(diào)用API的任何代碼,下載的腳本。即使遠(yuǎn)程資源不是故意惡意的,它也可能很容易被劫持通過中間人(MiTM)攻擊,這可能對您的應(yīng)用程序的用戶造成嚴(yán)重的安全漏洞。
請對您的應(yīng)用執(zhí)行深入審核,并刪除符合上述功能的任何代碼,框架或SDK,然后再提交下一個更新以供審核。
而上文提到的蘋果開發(fā)者協(xié)議3.3.2節(jié)具體內(nèi)容如下:
一個應(yīng)用程序不應(yīng)該下載或安裝任何可執(zhí)行代碼。解釋執(zhí)行的代碼可以在應(yīng)用內(nèi)使用,如果所有的腳本、代碼、和解釋器都被打包在應(yīng)用內(nèi)而沒有被下載。前述內(nèi)容的唯一的例外在于下載的腳本和代碼使用了Apple內(nèi)置的WebKit框架或JavascriptCore,并且對應(yīng)的腳本或代碼并沒有改變這個應(yīng)用提供功能和特性的主要目的,與提交到AppStore的版本以及相應(yīng)的宣傳描述相符。
白鷺引擎的原生打包方案使用的就是JavascriptCore,所以對于使用白鷺引擎打包的原生游戲沒有影響,請大家正常使用。
截止目前為止,我們也沒有收到使用白鷺引擎打包游戲的開發(fā)者收到了蘋果警告郵件的消息。
一句話總結(jié):使用白鷺引擎并通過 Egret-iOS-Support 發(fā)布原生游戲,目前并不會收到影響。
以下內(nèi)容為白鷺引擎架構(gòu)師的個人觀點,歡迎在技術(shù)層面進(jìn)行討論。
蘋果是不是完全禁止了熱更新技術(shù)?
并不是,目前為止收到警告郵件的開發(fā)者絕大部分使用了 JS-Patch 或 Rollout 類庫,剩下未直接使用這些類庫的開發(fā)者,目前初步估計很可能是在集成的第三方SDK 中使用了上述框架。而未采用上述框架的熱更新技術(shù),目前為止并未收到影響。而絕大部分游戲引擎由于并沒有調(diào)用這些類庫,也自然沒有受到影響。
當(dāng)然,后續(xù)事態(tài)會不會進(jìn)一步擴(kuò)大,還需要看蘋果接下來的策略。但是筆者認(rèn)為,游戲中的熱更新技術(shù)并不會受到蘋果的禁止,作為一名技術(shù)人員,我們不討論產(chǎn)品、商業(yè)等問題,只從技術(shù)角度來看,為什么 JSPatch蘋果認(rèn)為是不允許的,而游戲引擎的熱更新技術(shù),蘋果目前認(rèn)為是可以的
蘋果為什么要禁止 JSPatch 等熱更新技術(shù)?
JSPatch 的原理是,開發(fā)者編寫 JavaScript 代碼,利用蘋果內(nèi)置的 JavaScriptCore.Framework 執(zhí)行,以實現(xiàn)熱更新功能。這一點看似也符合標(biāo)準(zhǔn),但是在技術(shù)上,存在著重大安全隱患,參考 JSPatch 的業(yè)務(wù)邏輯:
- require('UIView')
- var view = UIView.alloc().init()
- view.setBackgroundColor(require('UIColor').grayColor())
- view.setAlpha(0.5)
簡單理解,JSPatch可以理解為所有的 Objective-C 的 API 進(jìn)行了映射,允許開發(fā)者在 JS 端調(diào)用任意原生代碼。這顯然是極其危險的。假設(shè)這段代碼是通過熱更新技術(shù)下載執(zhí)行的,如果在中間存在黑客,把這段代碼動態(tài)替換掉,比如修改為獲取用戶通訊錄并上傳到黑客的服務(wù)器,就會造成重大的安全問題。
為什么游戲熱更新技術(shù)可以被理解為是安全的
與 JSPatch 不同的是,游戲熱更新技術(shù)主要的實現(xiàn)方式是把動態(tài)腳本下載之后,讓動態(tài)腳本調(diào)用游戲引擎提供的接口實現(xiàn)缺陷修復(fù)。與 JSPatch不同的是,動態(tài)腳本并不能任意調(diào)用全部原生代碼,而是只能根據(jù)游戲引擎提供的接口調(diào)用相關(guān)功能。在這個過程中,游戲引擎的原生端作為一個安全沙箱,提供了一個安全的保護(hù)層,只要游戲引擎不要對外提供獲取通訊錄的接口,黑客就無法通過替換動態(tài)腳本的方式獲取用戶的隱私資料。進(jìn)而可以被認(rèn)為是安全的,自然不在蘋果的禁止范圍內(nèi)。
小結(jié):
- 蘋果認(rèn)為熱更新技術(shù)容易被黑客利用,造成重大安全問題。在官方警告郵件中,也是在進(jìn)行如此描述。
- JSPatch 這種基于反射,允許獲取全部系統(tǒng)接口 的方式,確實存在著一定的安全風(fēng)險。雖然可以通過安全策略去防范,但是蘋果決定一刀切,嚴(yán)格禁止
- 游戲引擎由于不是利用反射機(jī)制實現(xiàn)的熱更新,不能獲取全部系統(tǒng)接口,所以目前蘋果認(rèn)為是安全的,無需警告
- 筆者作為一名技術(shù)人員,以上所有內(nèi)容,都是基于客觀的技術(shù)層面進(jìn)行討論,請不要上升到“商業(yè)模式”、“生態(tài)閉環(huán)”等層面的“高度”。
相關(guān)鏈接
- React-Native 開發(fā)者收到了蘋果警告郵件。React-Native 官方辟謠,確認(rèn)不是 React-Native 的問題,而是 JSPatch / Rollout 的問題 https://github.com/facebook/react-native/issues/12778
- JSPatch 開發(fā)者收到了蘋果警告郵件,引發(fā)大量開發(fā)者圍觀https://github.com/bang590/JSPatch/issues/746
- 2016年有安全公司發(fā)布報告,指出 JSPatch 存在安全漏洞,影響了超過1000款 AppStore 上的應(yīng)用。 http://www.baijingapp.com/article/3876