安卓锁屏不到2分钟被破解,仅需换一张SIM卡

Python客栈

共 2969字,需浏览 6分钟

 · 2022-11-29

来源丨本文经AI新媒体量子位(ID:QbitAI)授权转载,转载请联系出处

作者丨Pine 萧箫 发自 凹非寺


换个SIM卡,就能解锁别人的手机?!

并且整个解锁过程不超过两分钟

一位外国小哥偶然间发现了谷歌Pixel手机上的这个漏洞:

能够直接绕过手机本身的指纹和密码保护,切换手机卡就能更改密码解锁屏幕。

严格来说,这个漏洞并非谷歌Pixel手机“独有”,而是Android系统中的一个bug,任何基于Android搭建的操作系统都可能受到影响。

例如有网友试了试开源安卓系统LineageOS(刷机党常用系统),就发现同样“中招了”:

还有网友在自己的Android12系统上试了下这种破解方式,“it works”!

不过这还不是最离谱的,更离谱的是这位小哥在向谷歌反馈之后,安全团队隔了近半年才修复这个漏洞。

在说小哥和谷歌关于这个漏洞的“拉锯战”之前,我们先回过头来看看这是个什么样的漏洞?

2分钟内就能破解手机锁屏

小哥“贴心”地上传了以破坏者视角破解漏洞全过程的视频,整个过程花了不到两分钟

话不多说,直接来看。

首先用错误的指纹和手机密码解锁手机,直至锁定。

然后用一张其他的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系统中都可能出现:

当然,也有网友测试发现,Android 11似乎不受影响,而是在Android 12中出现了。

还有网友发现三星手机也“逃过一劫”:

现在,安卓工程师们重构了.dismiss()函数,简单来说就是给它打个小小的补丁,让它只能解锁带有“SimPuk”标记的安全屏幕(也就是只能解除手机锁定屏幕)

小哥本人对此没有异议,但也有网友认为,这不是这次漏洞的最优解:

永远不要假设任何bug都只有一种特殊情况。如果不解决代码的根本逻辑,灾难就一直存在。

你的安卓手机中出现了这个bug吗?

对话传送门:
feed.bugs.xdavidhu.me

参考链接:
[1]https://bugs.xdavidhu.me/google/2022/11/10/accidental-70k-google-pixel-lock-screen-bypass/
[2]https://news.ycombinator.com/item?id=33544883

Wang
Qi
Tui
Jian


1、拔网线都不行?微软这招太狠

2、好家伙!一个敢教,一个敢用!

3、苹果,微软,Google终于决定要干掉密码了!

4、万万没想到,除了香农计划,Python3.11竟还有这么多性能提升!

5、世界杯将是压垮 Twitter 的最后一根稻草?历经马斯克“血洗”后,全世界在等 Twitter 宕机


点击关注公众号,阅读更多精彩内容


浏览 45
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报