是的你没听错,最近有个国外的小哥给别人的手机换了一张sim卡,2分钟就解锁了安卓系统的锁屏。接下来再用错误的sim卡密码锁定sim卡。sim卡被锁定后,手机便会索要其puk密码,puk密码一般在这sim卡的原始包装上,在卡套的背面会有一个图层,刮开就可以看到密码,如果丢失也可直接打电话向运营商查询。如果解开这个sim卡就要输入puk密码,他找到原来的卡套包装后输入了puk码。结果,重置sim卡密码后,手机竟然自动解锁了。不过在报告提交一个月后,小哥收到了android安全团队的一份邮件内容大概是:这个问题另一位外部研究人员之前已经报告过了。也就是说这位小哥拿不到10万美金了。另一种是simpin和simpuk等各种解锁手机锁定状态的操作。正常解锁谷歌安卓手机时,直接用pin、指纹或密码都可以,但不能超过3次,否则就会被锁定。关键地方在于,由于手机sim卡状态是随时更新的,因此如果sim卡状态发生变化,系统也会更新当前的安全屏幕。根据谷歌公开的漏洞报告,它在android10到android13系统中都可能出现:也有网友测试发现,android11似乎不受影响,而是在android12中出现了。不过有网友认为,这不是这次漏洞的最优解,因为这不算彻底解决了这个问题。

是的你没听错,最近有个国外的小哥给别人的手机换了一张sim卡,2分钟就解锁了安卓系统的锁屏。

小哥最先是在谷歌pixel手机上发现这个bug的,这个bug的原理是切换手机sim卡然后直接绕过手机本身的指纹解锁和密码保护。

而且这个bug并不是谷歌pixel手机才有的,其他安卓手机上也会有,

例如有网友试了试开源

安卓

系统

lineageos

,就发现同样问题:

还有网友在自己的android12系统上试了下这种破解方式:

具体的破解方式如下:

首先用错误的指纹或手机密码解锁手机,直到锁定手,也就是故意输错3次密码让手机锁住。

然后找一张新的sim卡,替换换原理手机上的sim卡。

接下来再用错误的sim卡密码(注意:这里的密码是sim卡密码)锁定sim卡。

sim卡被锁定后,手机便会索要其puk密码,puk密码一般在这sim卡的原始包装上,在卡套的背面会有一个图层,刮开就可以看到密码,如果丢失也可直接打电话向运营商查询。

puk码又叫做

sim卡自带的pin解锁码,假如pin密码忘记了,可以用puk码解锁。

输入puk密码后,直接重置新sim的密码便能开锁,手机原有的密码和指纹都成功绕过。

那么这个漏洞是如何发现的呢?

据说当时小哥的手机电量快没了关机了,他充上电后重新启动,手机要求输入sim卡的pin码,但是他忘记了这个卡的pin密码,就乱输入了几个密码导致把sim卡锁定了。

如果解开这个sim卡就要输入puk密码,他找到原来的卡套包装后输入了puk码。结果,重置sim卡密码后,手机竟然自动解锁了。

小哥发现这个bug之后立马向谷歌提交了这个内部报告,因为谷歌是有一个叫做设备安全奖励计划的,如果第一个提交bug给谷歌的人最高可以获得

10万美金的奖励。

不过在

报告提交一个月

后,小哥收到了android安全团队的一份邮件内容大概是:

这个问题另一位外部研究人员之前已经报告过了。

也就是说这位小哥拿不到10万美金了。

但是据说这个小哥向谷歌反馈这个bug之后,谷歌的安全团队半年才修好这个漏洞,因为修复这个漏洞并没有那么简单,

从提交的修改情况来看,光是要改动的文件数量,就达到12个:

这个漏洞究竟是怎么出现的?

简单来说,android系统中有一个叫做“安全屏幕”的东西,其中包含两种东西:

一种是pin、指纹、密码等各种

直接解锁密保

的屏幕操作。

另一种是simpin和simpuk等各种

解锁手机锁定状态

的操作。

这些操作被放在一个栈(stack)中。

正常解锁谷歌安卓手机时,直接用pin、指纹或密码都可以,但不能超过3次,否则就会被锁定。

但如果忘记密码,手机(在输入3次错误密码后)被强制锁定了,同时simpin条目可见,它就会被放置在其他屏幕解锁操作之上,用来让你解除手机的锁定状态。

栈的原理

这时候,如果使用sim卡自带的puk密码,就能通过一个叫“puk重置组件”的模块调用

.dismiss()

函数,将手机锁定解除,并继续显示栈下面的其他屏幕解锁操作,在小哥的案例中是指纹锁屏。

就是这个函数

这里注意,

.dismiss()

函数可不是一个“专人专用”的函数,它不仅会解除sim卡的手机锁定屏幕,连pin、密码和指纹之类的正常锁屏也能解锁……

这就导致它极容易受到竞态条件影响,一旦两个线程执行顺序出现一点儿误差,就可能导致屏幕解锁出现问题,也就是说这个bug并不是必现的,有可能同样的环境下你测试的时候没有这个漏洞。

举个例子,如果在“puk重置组件”s()函数之前,就有操作改变了当前的安全屏幕,s()函数就可能误解锁指纹锁屏。

关键地方在于,由于手机sim卡状态是随时更新的(系统一直在监视sim卡状态),因此如果sim卡状态发生变化,系统也会更新当前的安全屏幕。

所以一旦“puk重置组件”s()函数,它就会在解锁puk屏幕之前,

直接先解锁了指纹锁屏

根据谷歌公开的漏洞报告,它在android10到android13系统中都可能出现:

也有网友测试发现,android11似乎不受影响,而是在android12中出现了。

还有网友发现

三星手机

没有这个问题:

也就是说并不是所有的安卓系统都会出现,可能在某个版本上或者机型上才会出现这个bug。

现在,s()函数,给它打了个小补丁,让它只能解锁带有“simpuk”标记的安全屏幕(也就是只能解除手机锁定屏幕)。

不过有网友认为,这不是这次漏洞的最优解,

因为这不算彻底解决了这个问题。

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