之前有被这篇文章隔空 at,不过一直留到现在才炒冷饭。
陌陌安全获Apple致谢:CVE-2022-42837 - iTunes Store 之殇
这个 CVE 在 16.2 中修复,陌陌安全也在去年 12 月部分公开了这个漏洞马赛克后的细节。
实际上这个漏洞的最深层原因直到 macOS Sonoma beta 和 iOS 17 beta 才彻底修复。这个 CVE 只是堵住了其中一个利用点。在陌陌的文章发出来之后长达数月里,macOS 上一直有这个漏洞的一个变种。
这个 2022 年的 bug 已经是一个被变着花样利用过多次的点。可以参考之前的文章:CVE-2021-1748:从客户端 XSS 到弹计算器
还好我故意把这个二进制 XSS 的 poc 马赛克掉一部分,不然就成了扔 0day 了。
如果有一定的逆向基础,还原出这个 poc 是不难的。不完整公开细节主要还是防止被脚本小子满大街乱发。这个 bug 利用门槛太低,可以发链接也可以 AirDrop。
在公共场所给陌生人隔空投送恶作剧早已不是什么新鲜事。除了“这位同学,你的 AirDrop 忘记关”系列表情包,还有像这样的:
近期版本 iOS 的 “所有人” AirDrop 模式会在开启 10 分钟后自动关闭。国行从 iOS 16.0 开始,其他地区的系统则是 16.2。
陌陌报告的这个 CVE 正好是 16.2 修复的。
意味着什么?只要现在街上还能看到开着的 AirDrop,那就说明系统版本低于 16.2(甚至 16.0),也就是有 n day 可以被打的版本。
虽然包括各种碎片版 Android 在内,智能手机的 n day 多了去了,但利用门槛通常都比较高。这个 bug 说白了就是个可以 AirDrop 的 XSS,不能马上 RCE,但也可以实现一定的效果。
长点心吧,该升级升级,该关掉关掉。
下面来浅析一些技术细节,当然是带马赛克版本的。
陌陌安全找到的这个变种用了一个 CoreFoundation 里解析畸形 URL 的问题。在之前的 URI scheme poc 基础上,把 dataURI 的部分换成:
http://@www.apple.com:@www.hacker.com
CoreFoundation 和 WebKit 解析 URL host 的逻辑存在差异。校验白名单的业务逻辑认为这是一个合法的域名(www.apple.com);传给 WebView 之后,WebKit 却载入了 www.hacker.com。
到了 iTunes Store 这个上下文里直接一行代码就可以启动任意 app,以及干更多的事情。
以上截图是 2020 年的研究。
两年后到了陌陌的这个 CVE 时,iTunes 已经把 iTunes.telephony 下的 API 删除,无法再获取电话号码。不然真是可怕。想象一下在地铁里手滑或者好奇点接收了一个 AirDrop,你的号码直接被陌生人知道了。
然而枚举已安装应用(某些想提权的 app 大喜),获取 iCloud 账户名,甚至任意域名发送鉴权 HTTP header 的问题都还在。关于这个 WebView 请求任意网址都会带上 Apple ID token 信息的问题,能不能用来访问 iCloud,我对那边的协议不熟,至今没有定论。大概率是不行。
按理说有 X-Apple-I-MD-M 和 X-Apple-I-MD 这俩关键字段,是足以访问带两步验证的 API 的。但 App 端的协议还缺少一个 Authorization 字段,恐怕需要结合 RCE 才读的到。
这个点只要有 WebKit 的 bug,就可以取得很高的权限(类似沙箱逃逸)。当然,WebKit bug 就属于前文提到的有相当门槛的利用,普通人大可不必担心被针对。
前年 FORCEDENTRY 完整样本还没出来,有一些基于设备日志的分析,观测到 Pegasus 有启动 Music 应用访问 URL 的行为。那个 Recent research 的链接特么引用的是我之前关于 iTunes Store 研究的文章,猜测 Pegasus 有可能利用了系统 App 做提权。
世界上两件最重要的事,关你 p 事和关我 p 事,这个就属于后者。我还在这找选题蹭别人热度水公众号,一看热度自己来找我了。这可不兴蹭啊。
开头说到隔了很久才写这篇总结。
在陌陌安全那篇技术分析发出来的时候,这个漏洞最深层的原因实际上没有完全被修复,只是 16.2 之后无法再通过 iOS 系统 app 触发。
有 Xcode 环境可以运行如下代码:
NSString *host = [NSURL URLWithString:@"http://@www.apple.com:@g.cn/lol"].host;
在 macOS <= 13.x 上,也就是当前的正式版,这个 host 返回的是 www.apple.com。在测试版 macOS 14.0 上,返回的结果是 nil。彻底修复了 bug。
这就在 macOS 上造成一个 1 day,从 Safari 或者 AirDrop 跳到一个自带App 执行跨站脚本。虽然 XSS 之后能做的事不多,但其中一个接口可以打开前置摄像头并实时显示在屏幕上。js 其实不能获取摄像头数据,但效果颇为惊悚。
这个漏洞有可能会影响第三方 app,场景很有可能出现在二维码扫描和 URL scheme 入口上。只要有应用使用 NSURL 解析不可信的字符串,并尝试通过 host 字段来实现访问控制,就有可能被畸形 URL 绕过检查,从而用 WebView 打开不可信的网址。
随着 CoreFoundation 彻底修复,可以放心炒冷饭了。