安卓沦陷了:无视密码直接破解
为方便大家理解我临时用手机录了一个我手头这个安卓测试机的视频,这个测试机是 HMD Nokia X6 国行版,使用的是 Android 9.0 版,属于类原生系统,已经中招。有 PUK 码的小伙伴可以测试华为、小米、OPPO、vivo、OnePlus、魅族等其他机型是否中招。理论上说,深度定制的系统可能是不受影响的。
特别声明:
由于本漏洞已经完全公开且谷歌已经发布安全补丁修复漏洞,蓝点网录制本视频目的是提醒大家提高安全警惕,请勿利用此漏洞进行任何违法行为,否则一切后果自负。
概述部分:
David Schütz 是一名匈牙利的安全研究人员,在一次旅行中 David 发现自己竟然可以轻松绕过 Google Pixel 6 安全系统,在没有输入密码的情况下解锁设备。其原理是安卓系统的 SIM 卡 PUK 重置解锁与系统解锁部分存在漏洞和竞争问题,导致重置 PUK 后直接把系统 PIN 验证也给关了,直接进入系统无需密码或指纹。
这次意外发现让 David 获得谷歌破例提供的 7 万美元奖金,虽然过程非常曲折、中间各种扯皮,但最终这枚漏洞得到修复并且奖金也成功发放。
第一部分:忘记我的 SIM 卡 PIN
我在旅行 24 小时后发现了这个漏洞:旅行回家后我的 Pixel 6 电量为 1%,它即将关机的时候我正在发送一条短信,结果没电关机。
我赶紧找到充电器插上并重新启动手机,Pixel 启动时询问 PIN 码,我很清楚的记得我设置的 PIN 码,但这次不知道是为什么我竟然忘记了,在连续错误三次后 SIM 卡被锁定。
于是我又拿出 SIM 卡卡片提供的 PUK 解锁码,刮开涂层后我获得 PUK 码,输入 PUK 码即可解锁 SIM 卡并重新设定 PIN 码。(蓝点网注:PUK 码连续输错 10 次 SIM 卡将被永久锁定也就是作废,你的 PUK 码在 SIM 卡原始卡片里,你也可以从运营商 APP 里查询 PUK 码)。
在我输入 PUK 码解锁后系统要求我设置一个新的 PIN 码,然后我按照流程设置完毕后进入了系统。
桥豆麻袋:感觉好些不对劲!
这是一个全新的启动而不是系统已经启动后让我输入手机的 PIN 码或者密码进行解锁,此时系统也弹出指纹,在我认证指纹后系统卡在 Pixel is started 界面,直到我再次重启系统。
注:正常情况下系统重启后无法使用指纹或面容识别,必须先输入 PIN 码或其他自定义密码解锁后,才能在下次锁屏后使用指纹或面容解锁。从这里可以看出来使用 PUK 解锁 SIM 后系统直接跳过了最基础也是最重要的安全认证。
第二部分:刚刚发生了什么
虽然我心里感觉有点奇怪,认为这可能存在一些安全隐患,所以准备后面再测试看看。
第二天我故意输错 SIM 卡密码再使用 PUK 解锁,然后我看到了相同的启动界面。你以为这就完了吗?™的输入 PUK 解锁后再输入新的 SIM PIN 码后,手机竟然直接解锁了,连指纹都不用按了!!!
在我稍微平静一点后,我意识到这是一个该死的全锁屏绕过漏洞,在 Pixel 6 完全打补丁的情况下可以绕过锁屏。在我的 Pixel 5 进行测试后发现情况完全一样。
这意味着什么:任何人拿到你的安卓手机,只需要提前准备一张已知 PUK 的 SIM 卡,就可以直接把你的卡拔掉换上攻击者的,然后直接绕过安卓系统的启动锁屏。
这个漏洞太容易利用,因此是一个巨大的安全缺陷。
第三部分:谷歌的回应
我把漏洞报告给谷歌,这是我迄今为止提交的最短的报告,因为只需要五个简单步骤就可以复现漏洞。
谷歌在 37 分钟后就对我提交的漏洞进行分类和提交,那真是令人惊讶的速度。但随后情况就不对了,因为没有了回应。
在这个 bug 的生命周期里,由于官方回复没有什么值得关注的信息,实际上我更喜欢官方对漏洞的回复。由于缺少官方回复我只能从谷歌员工那里获得零碎的信息。
另外根据 Android VRP 的漏洞奖金制度,如果提交可以解锁 Pixel 设备的锁屏,按最多可以获得高达 10 万美元的奖金。由于我提交时也勾选了绕过锁屏的框,我有点认为我提交这个漏洞会让我获得 10 万美元的奖励。
在超过一个月没有回应后,我听说这个 bug 提交可能已经被关闭,显然在我之前已经有其他人提交了这个漏洞。
在漏洞提交后的 31 天,我收到了安卓团队发来的自动邮件,邮件称在我之前已经有研究人员提交了这个漏洞。所以,我的 10 万美元奖金直接变成了 0 美元,我真的什么也做不了,只能接受这个 bug 是一个已经重复的并且没有任何奖金的事实。
快进到九月份,也就是我提交漏洞的三个月后,我当时在伦敦,参加个 Google ESCAL8 的漏洞发掘活动,当时 2022 年 9 月版的 Android 补丁刚刚发布,我更新了收集,然后在酒店房间的一晚,我试图复现这个漏洞,我希望谷歌已经修复了这个漏洞。但该死,™的这个漏洞还是存在的。
这真把我吓坏了,我觉得我比谷歌还关心这个漏洞。所以从那天晚上,我开始联系我们一起参加活动的谷歌员工。
第二天,我最终向更多人解释了这个问题,我甚至在谷歌办公室(举办该安全活动的临时场所)里找了一些 Pixel 手机进行现场演示。由于没有卡针,我们尝试使用找来的针头,结果在操作过程中我的手指被割伤开始流血,我让一位谷歌工程师帮我贴了个创口贴。由于使用针头没用,我们四处打听,一位非常善良的女士把她的耳环取下来给我们使用。(要是在常规办公室里找个回形针或者订书机钉都很容易取下 SIM 卡)。
最终我们成功换下 SIM 卡,我感觉好多了,人们似乎开始关注了这个问题。
我将此漏洞的披露截止日期设定在 10 月 15 日,但 Android VRP 团队回复说不会在 10 月修复,他们的目标是在 12 月修复该漏洞。
考虑到潜在安全影响,我认为这对我来说似乎有点过分了,我坚持 10 月份是最后的期限,到期后我就会直接公开这枚安全影响非常大的漏洞。
在和一些 VRP 团队成员讨论后,一位 VRP 官方成员回复了 bug 报告,并让我留下电话进行沟通。
最后我与他们多人进行了一次当面沟通,他们非常友善,听了我在这几个月里的整个故事,包括只得到了邮件模板自动回复,奖金从 10 万美元变成 0 美元。
总体来说就像是我比谷歌更关心这个漏洞,他们说漏洞提前到 11 月修复,而不是 12 月,但我仍然坚持必须在 10 月修复。(实际上最终是 11 月 5 日修复的,坚持被钞能力打败了😂😂)
又过了两周我收到他们的电话,他们说即使我提交的漏洞是重复的,但因为我的坚持他们才修复这个漏洞。因此谷歌破例给我奖励 7 万美元。
我太害怕了,所以不敢提前公布漏洞了,毕竟距离修复已经非常近,所以提前公布漏洞可能不值得 (担心奖金没了?),最终我决定等待修复。
第四部分:漏洞怎么发生的
在安卓上有一个安全屏幕的概念。安全屏幕是多方面的,PIN 输入界面、指纹扫描、密码输入屏幕,或者本文中的 SIM PIN 和 SIM PUK 输入屏幕。
这些安全屏幕彼此是堆叠的,且都是堆叠在顶部,例如 SIM PIN 界面可见时,那说明这个界面是在锁屏界面的顶部。
SIM PUK 重置后,PUK 重置组件调用 .dismiss () 安全屏幕堆栈上的一个函数,导致设备关闭当前的安全屏幕并显示堆栈下方的安全屏幕,在本文案例中,PUK 堆叠在指纹扫描屏幕上。
由于这个函数只是简单的关闭了当前的屏幕,因此很容易受到竞争条件的影响。
想象一下,如果在 PUK 重置调用组件前,后台某些东西改变了当前的安全屏幕,那会发生什么?PUK 调用组件时会关闭其他不相关的安全屏幕吗?
这似乎是正在发生的事情,系统的其他部分正在监控 SIM 卡状态,当检测到变化时会立即更新当前活动状态的安全屏幕。所以在 PUK 调用重置组件时,才会出现连指纹界面都会关闭的情况。
而正常逻辑,PUK 重置后,SIM 卡默认解锁,此时下一个安全屏幕就是系统解锁。
为修复这个问题安卓工程师似乎准备重构函数并添加额外参数,调用者可以用来指定想要关闭的屏幕类型,在本文案例中,PUK 组件现在为执行.dismiss (SecurityMode.SimPuk),仅关闭 SimPuk 安全屏幕,而不会关闭其他任何无关的安全屏幕。
在我看来这是一个优雅且强大的解决方案,可以抵御这种情况或者未来其他类似的安全问题,我是真没想到这个错误会在安卓项目里引起如此大的代码更改。
注1:正常来说,首个提交漏洞的研究人员应该也会获得奖金,毕竟是谷歌没修复的,并不是漏洞不存在。
注2:如此严重的漏洞,此前有研究人员提交的情况下,Android VRP 竟然都没修复,这让人无法想象。
热门推荐☍双11各类会员优惠 网易云音乐68等