换个 SIM 卡,就能解锁别人的手机?!
并且整个解锁过程不超过两分钟。
一位外国小哥偶然间发现了谷歌 Pixel 手机上的这个漏洞:
能够直接绕过手机本身的指纹和密码保护,切换手机卡就能更改密码解锁屏幕。
严格来说,这个漏洞并非谷歌 Pixel 手机“独有”,而是 Android 系统中的一个 bug,任何基于 Android 搭建的操作系统都可能受到影响。
例如有网友试了试开源安卓系统 LineageOS(刷机党常用系统),就发现同样“中招了”:
还有网友在自己的 Android12 系统上试了下这种破解方式,“it works”!
不过这还不是最离谱的,更离谱的是这位小哥在向谷歌反馈之后,安全团队隔了近半年才修复这个漏洞。
在说小哥和谷歌关于这个漏洞的“拉锯战”之前,我们先回过头来看看这是个什么样的漏洞?
小哥“贴心”地上传了以破坏者视角破解漏洞全过程的视频,整个过程花了不到两分钟。
话不多说,直接来看。
首先用错误的指纹和手机密码解锁手机,直至锁定。
然后用一张其他的 SIM 卡直接更换手机原来的 SIM 卡。
接下来再用错误的 SIM 卡密码(注意:这里的密码和手机密码不是一回事)锁定 SIM 卡。
SIM 卡被锁定后,手机便会索要其 PUK 密码,在这 SIM 卡的原始包装上,如果丢失也可直接打电话向运营商查询。
PUK(Personal Identification NumberUnlock Key),SIM 卡自带的 PIN 解锁码。
输入 PUK 密码后,直接重置新 SIM 的密码便能开锁,手机原有的密码和指纹都成功绕过。
bingo!
至于是如何发现这个漏洞以及为什么过了近半年才修复这个漏洞,也是个很有意思的过程。
以下是小哥的经历:
当时手机电量快耗尽关机了,他充上电重新启动后,手机要求提供 SIM 卡的 PIN 码,但却突然忘记了密码,在乱试一通之后“成功”把手机锁定。
要解开这个锁定便需要 PUK 密码,所幸他找到了原有包装并输入了 PUK 码。结果,重置 SIM 卡密码后,手机竟然直接解锁了!
发现这个大 Bug 之后,小哥向谷歌(Android VRP)提交了这个内部漏洞报告,也是从这时开始,小哥和谷歌的“拉锯战”开始了。
他仔细查看了 Android 和谷歌的设备安全奖励计划,发现自己最高可以获得 10 万美金的奖励,于是便申请了。
不过在报告提交一个月后,小哥收到了 Android 安全团队的一份邮件:
Android 安全团队认为,这个问题另一位外部研究人员之前已经报告过了。
对此小哥认为,这份回邮的言外之意就是,最高十万美金的奖励他一分钱都拿不到。
时间又过了一个月,小哥收到安全团队的邮件,对方称漏洞还在修复中……
又又过了一个月,九月谷歌发布了新的补丁,但这个 Bug 依旧没有修复……
不过小哥也不是轻言放弃的人,他直接来到谷歌办公室,用谷歌 Pixel 手机演示了一下这个漏洞。
而后他给安全团队定了个漏洞修复期限:10 月 15 日之前。而对方的回复也很干脆:10 月份这个 Bug 修不好!
在拉扯一番后,小哥和谷歌建立了联系,能够实时得到漏洞修复的反馈。
谷歌方也确定了修复工作的具体时间:11 月份进行,现在这个漏洞已于 11 月 5 日谷歌的安全更新中被解决。
值得一提的是,关于提交漏洞的奖励,小哥最终也拿到了 7 万美金,不过谷歌对此还做出了一番解释,用小哥的原话来说,就是:
尽管我的报告是重复的,但正是因为我的报告,他们才开始着手修复。正因为如此,他们决定破例一次,并奖励给我 70000 美元。
小哥和谷歌的完整对话链接附在文末了,感兴趣的伙伴可以自行查看。(手动狗头)
现在,谷歌的安卓工程师们终于把这个漏洞给补上了。
然而让小哥惊讶的是,bug 修复远不止他想象的“一行代码补丁”那么简单。
从提交的修改情况来看,光是要改动的文件数量,就达到 12 个:
所以这个漏洞究竟是怎么出现的?
简单来说,Android 系统中有一个叫做“安全屏幕”(security screen)的概念,其中包含两种东西,一种是 PIN、指纹、密码等各种直接解锁密保的屏幕操作,另一种是 SIM PIN 和 SIM PUK 等各种解锁手机锁定状态的操作。
这些操作被放在一个栈(stack)中。
正常解锁谷歌手机时,直接用 PIN、指纹或密码都可以,但不能超过 3 次,否则就会被锁定。
但如果忘记密码,手机(在输入 3 次错误密码后)被强制锁定了,同时 SIM PIN 条目可见,它就会被放置在其他屏幕解锁操作之上,用来让你解除手机的锁定状态。
这时候,如果使用 SIM 卡自带的 PUK 密码,就能通过一个叫“PUK 重置组件”的模块调用.dismiss() 函数,将手机锁定解除,并继续显示栈下面的其他屏幕解锁操作,在小哥的案例中是指纹锁屏。
这里注意,.dismiss() 函数可不是一个“专人专用”的函数,它并不只会解除 SIM 卡的手机锁定屏幕,连 PIN、密码和指纹之类的正常锁屏也能解锁……
这就导致它极容易受到竞态条件影响,一旦两个线程执行顺序出现一点儿误差,就可能导致屏幕解锁出现问题。
竞态条件即两个或者以上进程或者线程并发执行时,其最终的结果依赖于进程或者线程执行的精确时序。
举个栗子,如果在“PUK 重置组件”的模块调用.dismiss () 函数之前,就有操作改变了当前的安全屏幕,那么.dismiss () 函数就可能误解锁指纹锁屏。
关键来了,由于手机 SIM 卡状态是随时更新的(系统一直在监视 SIM 卡状态),因此如果 SIM 卡状态发生变化,系统也会更新当前的安全屏幕。
所以一旦“PUK 重置组件”成功调用了.dismiss () 函数,它就会在解锁 PUK 屏幕之前,直接先解锁了指纹锁屏!
根据谷歌公开的漏洞报告,它在 Android 10 到 Android 13 系统中都可能出现。
原文来自「安全圈」|侵删