苹果爸爸放大招,禁掉JSPatch热更新(Apple爹已给回复)

这应该是软件开发最近两天最热的话题了吧。。。 O(∩_∩)O哈哈~
首先说一下这次受影响的第三方:
目前已经知道的有:
高德地图 已经更新了sdk V1.3.4 规避了问题
Bugtags 已经更新了SDK V2.2.1规避了问题 **
这里不得不说下,大厂就是效率啊,很快给出了解决方案。
还有
rollout,react native,weex,JSPatch,个推 ,bugly with hotfix
等。

也有说是使用dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations()这些个方法太多了。。具体原因不清楚,还得等苹果大大给出答案啊,谁让他是你亲爹来呢。。。

猜测的原因

苹果为什么这么做呢?苹果对热修复一直以来的态度都是不赞同也不拒绝,JSPatch 本身也并没有违反开发者条例,而且 JSPatch 大多数都用于修复 bug,提升 iOS 平台 App 的质量,对苹果也是件好事,为什么要禁?猜测原因有两点:可控和安全

可控

苹果一贯作风是让所有事情可控,开发者能用什么不能用什么都尽量在自己的控制范围内。大多数人使用 JSPatch 修复 bug,或者弄一些临时运营的小功能配置,这些没有问题,但总会有少数用户使用 JSPatch 去调用私有API做些事,这是苹果不可控的,也无法知道有多少人这样做了。
不过其实在代码这块苹果其实一直可控程度有限,他会在提交时扫描你有没有用某些私有方法,但只要你对这些私有方法调用做一些变化,加解密字符串拼接什么的,就能绕过扫描,再通过后台配置调用,是一样的。JSPatch 只是让调用私有 API 变得成本更低更方便点而已,可控这里只是个小理由。

安全

去年 FireEye 分析了使用 JSPatch 的安全问题,当时也有文章回应了,再复述一下,主要安全风险有三点:
开发者自己本身对 APP 下发恶意代码。
开发者没有做好加密传输和校验。
开发者接入的SDK里接入了JSPatch,SDK 作者可以对这些 APP 下发恶意脚本。
第一点其实不算安全风险,因为开发者自己有恶意的话完全不需要借助 JSPatch。
第二点大多数用户使用 JSPatch 时都做好了非对称加密,保证不会在传输过程被第三方篡改。但这里技术上没法保证用户一定使用正确的加密方式,苹果无法知道有多少接入 JSPatch 的用户没有正确加密和校验,这是未知的安全隐患。
第三点在当时并没有什么第三方 SDK 接入 JSPatch,但现在像高德地图/个推等都接入了,如果他们要作恶,或者他们本身服务端被入侵,确实是个安全隐患。
iOS 平台是最安全的,也是最注重安全的,即使热修复带来了 App 质量更高的好处,也无法无视这里的安全隐患,现在 JSPatch 国内覆盖面很大,若出一个安全问题,会影响 iPhone 的声誉,因为这个风险,所以考虑禁掉。

苹果爸爸还是爱我们的
是挑战也是机会

Apple大大终于给出了回复:

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.

意思是:代码中引用我们最初拒绝信息,包括任何代码传递任意参数动态方法如dlopen(),dlsym(),respondstoselectorismemberofclass:performSelector:,method_exchangeImplementations(),并运行远程脚本为了改变应用程序的行为或调用SPI,基于下载脚本的内容。 都是不允许的。但是objective - c方法respondstoselectorismemberofclass:和performSelector:仍然是支持和允许的。

建议最近风声很紧,还没有得到确定的解决方案的时候,还是暂时规避掉这些敏感东西吧,根据苹果要求,收到警告的同学只需要在下次提交版本时去掉相关框架就可以,没有时间期限,目前也不会强制下架。否则你的App可能会被拒甚至被下架。

目前不清楚的点:(已经给出了解决方案)

1、是否不允许使用JSPatch或Rollout.js、React Native、Weex等框架?

(只要是运行了远程脚本,为了改变应用程序的行为或调用SPI,肯定是不行的啦)

2、AFN和SDWedImage等部分包括 such as dlopen(), dlsym(), respondsToSelector:, performSelector:, method_exchangeImplementations(),但是没有远程更新,这样能否使用?

(objective - c方法respondstoselectorismemberofclass:和performSelector:仍然是支持和允许的。)

3、第三方SDK,比如统计分析、crash收集、以及性能分析等,我们怎么检查他们有没有使用非法的方法?

我的方法就是,自己细致检查,并且关注对应的第三方网站给出的信息。

4、后期的解决方案是什么?

请深入审查你的应用,删除任何代码,框架,或sdk只要是包含上面禁止的内容;然后提交更新你的应用程序。

马上提交版本了,里面只用了JSPatch用于热更新修复BUG,但是没有收到苹果下发的警告邮件,准备不下掉JSPatch 提交看看,到底会不会被拒。 提了之后再来补充结果。

不过第一版,我还是要冒险测试下这个问题,一旦通过了呢。并且,没有了热更新真的好方啊,等我的消息吧 O(∩_∩)O哈哈哈~

结果:没有下掉JSPatch直接被拒了,删除之后在提交通过了。其中MJ和AFN等这些第三方库是没有问题的。坐等可以替代热更新的方案。

Apple 爹给出的具体回复:

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 官方给出的解决方案:

目前的建议以及后期的改进方案

讨论还可以看这些地方,已经closed了;
JSPatch Issues
react-native :https://github.com/facebook/react-native/issues/12778
Weex :https://github.com/alibaba/weex/issues/2875
JSPatch作者的看法

所以,最后的结果以及我们应该做的就是:

请深入审查你的应用,删除任何代码,框架,或sdk只要是包含上面禁止的内容;确保符合要求之后,提交更新你的应用程序。

完!!! 继续关注中。。。

3月28日,JSPatch已经给出了解决方案:对应的解决方案

直接集成SDK的小伙伴可以更新了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容