[实时动态]3.8日苹果警告邮件事件
2017-03-08 by tdzl2003

发生了什么

一大早起来,几乎所有JSPatch使用者,和一部分RN、Weex开发者都收到了苹果的警告邮件,内容大致如下:

Dear Developer,

Your app, extension, and/or linked framework appears to contain code designed explicitly with the capability to change your app’s behavior or functionality after App Review approval, which is not in compliance with section 3.3.2 of the Apple Developer Program License Agreement and App Store Review Guideline 2.5.2. This code, combined with a remote resource, can facilitate significant changes to your app’s behavior compared to when it was initially reviewed for the App Store. While you may not be using this functionality currently, it has the potential to load private frameworks, private methods, and enable future feature changes.

This 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. Even if the remote resource is not intentionally malicious, it could easily be hijacked via a Man In The Middle (MiTM) attack, which can pose a serious security vulnerability to users of your app.

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.

Best regards,

如果您收到的警告或不过审邮件和以上内容完全无关,那您不属于此次事件影响范围。

有谣言传播苹果开始封杀所有混合开发模式和/或热更新。

实际上,邮件中强调的This 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. Even if the remote resource is not intentionally malicious,指的是诸如JSPatch这样的第三方库,具备通过热更新的代码访问新的API的能力,这拥有极大的危险性,这属于此次警告和封杀的重点范围。混合开发模式和热更新都不在打击之列。

相关安全隐患

JSPatch的安全隐患早在几个月前就有报道。此次封杀可以理解最主要就是针对JSPatch这样同时使用了热更新,以及“arbitrary parameters to dynamic methods ” 简单理解就是具备动态的访问系统API的能力。这二者结合在一起是相当危险的。

因此,如您的应用使用了JSPatch,或个推等使用了JSPatch技术的第三方库,需要等待相应库进行升级更新,移除对JSPatch的依赖。

另外,Bugtags声称他们的一段检测JSPatch的代码也被苹果误杀,因此他们也发布了一个新的版本来解决这个问题。

这次苹果发布的警告,主要通过自动化扫描ipa,检查是否同时使用了:1、网络/下载功能 2、内置脚本引擎 3、动态访问API。如果三个条件都符合,就很可能收到警告。

RN是否受影响

笔者已登录苹果网站确认最新的苹果开发者协议,有关混合开发和热更新部分的内容并未改变:

苹果开发者协议3.3.2节:

一个应用程序不应该下载或安装任何可执行代码。解释执行的代码可以在应用内使用,如果所有的脚本、代码、和解释器都被打包在应用内而没有被下载。前述内容的唯一的例外在于下载的脚本和代码使用了Apple内置的WebKit框架或JavascriptCore,并且对应的脚本或代码并没有改变这个应用提供功能和特性的主要目的,与提交到AppStore的版本以及相应的宣传描述相符。

其中重要的地方:

一个应用程序不应该下载或安装任何可执行代码(指二进制可执行代码)
React Native没有做这件事情。所以React Native不会让你受前述条款的影响。

另一方面,使用React Native,你还可能会使用叫做OTA更新的方式(俗称热更新),类似Code Push或中文网提供此热更新服务。这同样是被3.3.2章节的后续内容允许的:

前述内容的唯一的例外在于下载的脚本和代码使用了Apple内置的WebKit框架或JavascriptCore

所以这事情和React Native并无卵关系。我觉得收到邮件的人应该关注和苹果的交流,再次检查是什么导致了这个警告。

如果你的库使用了第三方插件,也要检查对应的第三方插件是否使用了对应的动态访问API、是否可能需要更新。


目前的反馈

目前较多反馈同时使用了RN 和 crash 收集统计插件的开发者更多的收到了此邮件。

大部分RN开发者表示暂未收到此邮件。

今天有多个使用RN开发的应用通过审核,包括使用了热更新功能的,暂未接到反馈有因为使用RN而被拒审的案例。

目前有未收到邮件的应用发布了热更新,暂未受到警告。

该做什么

如果您没收到对应的警告邮件,那可以先安心吃瓜,不必过于警惕。

如果您已经收到了对应的邮件,请首先排查第三方库,尤其是涉及统计分析、crash收集、以及性能分析的插件。

暂时避免或减少涉及功能变更的热更新。

禁止通过热更新彻底改变应用功能和应用目的。这是明确违反苹果开发者协议的。


[去论坛发表意见]