這應(yīng)該是軟件開發(fā)最近兩天最熱的話題了吧。实幕。吝镣。 O(∩_∩)O哈哈~
首先說一下這次受影響的第三方:
目前已經(jīng)知道的有:
高德地圖 已經(jīng)更新了sdk V1.3.4 規(guī)避了問題
Bugtags 已經(jīng)更新了SDK V2.2.1規(guī)避了問題 **
這里不得不說下,大廠就是效率啊昆庇,很快給出了解決方案末贾。
還有rollout,react native整吆,weex拱撵,JSPatch,個推 ,bugly with hotfix等表蝙。
也有說是使用dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations()這些個方法太多了拴测。。具體原因不清楚府蛇,還得等蘋果大大給出答案啊集索,誰讓他是你親爹來呢。欲诺。抄谐。
猜測的原因
蘋果為什么這么做呢?蘋果對熱修復(fù)一直以來的態(tài)度都是不贊同也不拒絕扰法,JSPatch 本身也并沒有違反開發(fā)者條例蛹含,而且 JSPatch 大多數(shù)都用于修復(fù) bug,提升 iOS 平臺 App 的質(zhì)量塞颁,對蘋果也是件好事浦箱,為什么要禁吸耿?猜測原因有兩點:可控和安全。
可控
蘋果一貫作風(fēng)是讓所有事情可控酷窥,開發(fā)者能用什么不能用什么都盡量在自己的控制范圍內(nèi)咽安。大多數(shù)人使用 JSPatch 修復(fù) bug,或者弄一些臨時運營的小功能配置蓬推,這些沒有問題妆棒,但總會有少數(shù)用戶使用 JSPatch 去調(diào)用私有API做些事,這是蘋果不可控的沸伏,也無法知道有多少人這樣做了糕珊。
不過其實在代碼這塊蘋果其實一直可控程度有限,他會在提交時掃描你有沒有用某些私有方法毅糟,但只要你對這些私有方法調(diào)用做一些變化红选,加解密字符串拼接什么的,就能繞過掃描姆另,再通過后臺配置調(diào)用喇肋,是一樣的。JSPatch 只是讓調(diào)用私有 API 變得成本更低更方便點而已迹辐,可控這里只是個小理由蝶防。
安全
去年 FireEye 分析了使用 JSPatch 的安全問題,當(dāng)時也有文章回應(yīng)了右核,再復(fù)述一下慧脱,主要安全風(fēng)險有三點:
開發(fā)者自己本身對 APP 下發(fā)惡意代碼。
開發(fā)者沒有做好加密傳輸和校驗贺喝。
開發(fā)者接入的SDK里接入了JSPatch菱鸥,SDK 作者可以對這些 APP 下發(fā)惡意腳本。
第一點其實不算安全風(fēng)險躏鱼,因為開發(fā)者自己有惡意的話完全不需要借助 JSPatch氮采。
第二點大多數(shù)用戶使用 JSPatch 時都做好了非對稱加密,保證不會在傳輸過程被第三方篡改染苛。但這里技術(shù)上沒法保證用戶一定使用正確的加密方式鹊漠,蘋果無法知道有多少接入 JSPatch 的用戶沒有正確加密和校驗,這是未知的安全隱患茶行。
第三點在當(dāng)時并沒有什么第三方 SDK 接入 JSPatch躯概,但現(xiàn)在像高德地圖/個推等都接入了,如果他們要作惡畔师,或者他們本身服務(wù)端被入侵娶靡,確實是個安全隱患。
iOS 平臺是最安全的看锉,也是最注重安全的姿锭,即使熱修復(fù)帶來了 App 質(zhì)量更高的好處塔鳍,也無法無視這里的安全隱患,現(xiàn)在 JSPatch 國內(nèi)覆蓋面很大呻此,若出一個安全問題轮纫,會影響 iPhone 的聲譽,因為這個風(fēng)險焚鲜,所以考慮禁掉掌唾。
Apple大大終于給出了回復(fù):
The code referenced in our initial rejection message includes any code which passes arbitrary parameters to dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script.
意思是:代碼中引用我們最初拒絕信息,包括任何代碼傳遞任意參數(shù)動態(tài)方法如dlopen(),dlsym(),respondstoselectorismemberofclass:performSelector:,method_exchangeImplementations(),并運行遠(yuǎn)程腳本為了改變應(yīng)用程序的行為或調(diào)用SPI,基于下載腳本的內(nèi)容恃泪。 都是不允許的郑兴。但是objective - c方法respondstoselectorismemberofclass:和performSelector:仍然是支持和允許的。
建議最近風(fēng)聲很緊贝乎,還沒有得到確定的解決方案的時候,還是暫時規(guī)避掉這些敏感東西吧叽粹,根據(jù)蘋果要求览效,收到警告的同學(xué)只需要在下次提交版本時去掉相關(guān)框架就可以,沒有時間期限虫几,目前也不會強制下架锤灿。否則你的App可能會被拒甚至被下架。
目前不清楚的點:(已經(jīng)給出了解決方案)
1辆脸、是否不允許使用JSPatch或Rollout.js但校、React Native、Weex等框架啡氢?
(只要是運行了遠(yuǎn)程腳本,為了改變應(yīng)用程序的行為或調(diào)用SPI,肯定是不行的啦)
2枯跑、AFN和SDWedImage等部分包括 such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(),但是沒有遠(yuǎn)程更新旷坦,這樣能否使用?
(objective - c方法respondstoselectorismemberofclass:和performSelector:仍然是支持和允許的搀崭。)
3叨粘、第三方SDK,比如統(tǒng)計分析瘤睹、crash收集升敲、以及性能分析等,我們怎么檢查他們有沒有使用非法的方法轰传?
我的方法就是驴党,自己細(xì)致檢查,并且關(guān)注對應(yīng)的第三方網(wǎng)站給出的信息绸吸。
4鼻弧、后期的解決方案是什么设江?
請深入審查你的應(yīng)用,刪除任何代碼,框架,或sdk只要是包含上面禁止的內(nèi)容攘轩;然后提交更新你的應(yīng)用程序叉存。
馬上提交版本了,里面只用了JSPatch用于熱更新修復(fù)BUG度帮,但是沒有收到蘋果下發(fā)的警告郵件歼捏,準(zhǔn)備不下掉JSPatch 提交看看,到底會不會被拒笨篷。 提了之后再來補充結(jié)果瞳秽。
不過第一版,我還是要冒險測試下這個問題率翅,一旦通過了呢练俐。并且,沒有了熱更新真的好方啊冕臭,等我的消息吧 O(∩_∩)O哈哈哈~
結(jié)果:沒有下掉JSPatch直接被拒了腺晾,刪除之后在提交通過了。其中MJ和AFN等這些第三方庫是沒有問題的辜贵。坐等可以替代熱更新的方案悯蝉。
Apple 爹給出的具體回復(fù):
The code referenced in our initial rejection message includes any code which passes arbitrary parameters to dynamic methods such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(), and running remote scripts in order to change app behavior or call SPI, based on the contents of the downloaded script. The Objective-C methods respondsToSelector: and performSelector: are still supported and allowed. For example, they can be used to check OS compatibilty before using a selector. However, you should only pass selectors to these methods, which are specified at compile time. If you think you are using static selectors, it’s possible a third-party framework you’ve added to your app is not in compliance.
Please perform an in-depth review of your app and remove any code, frameworks, or SDKs that fall in line with the functionality described above before submitting the next update for your app for review
JSPatch 官方給出的解決方案:
討論還可以看這些地方,已經(jīng)closed了托慨;
JSPatch Issues
react-native :https://github.com/facebook/react-native/issues/12778
Weex :https://github.com/alibaba/weex/issues/2875
JSPatch作者的看法
所以鼻由,最后的結(jié)果以及我們應(yīng)該做的就是:
請深入審查你的應(yīng)用,刪除任何代碼,框架,或sdk只要是包含上面禁止的內(nèi)容厚棵;確保符合要求之后蕉世,提交更新你的應(yīng)用程序。
完?吒小L直恕! 繼續(xù)關(guān)注中柿祈。哈误。。
3月28日躏嚎,JSPatch已經(jīng)給出了解決方案:對應(yīng)的解決方案
直接集成SDK的小伙伴可以更新了蜜自。