本文来自微信公众号:差评(ID:chaping321),作者:托尼,原文标题:《安卓重大锁屏密码漏洞,国产手机有几个中招了?》,头图来自unsplash


上周,一条新闻吸引了托尼注意。


只用一张 SIM 卡,1 分钟不到就能解锁你的安卓手机?


一个国外小哥发现,不要刷机,不要电脑连线折腾,只需要一张自己准备的 SIM 卡 ,就可以解锁别人的手机。


要知道这就意味着,如果你的手机丢了被人捡到,那陌生人可以用它自己的随便一张 SIM 卡就破解你们锁屏,数据安全形同虚设。



而且这个 BUG 会影响到的设备除了谷歌自家的 Piexl 以外,还包括开源的 LineageOS。



这空手套白狼的办法,让我有了一丝丝犯罪的念头。


打住,咱们还是先来看看这哥们是咋操作的吧。


因为手机没电而发现的 BUG


整件事情的起因非常简单,在小哥经过了长途跋涉的旅行之后,他的手机因为缺电而关机了,于是就顺理成章的充电重启。


恰巧他的手机开了 SIM 卡锁,每次重启手机或者插拔 SIM 卡后都需要验证。



需要输入自己设置的 PIN 码解锁,只有三次机会 。



更不巧的是,他忘了自己设置的 PIN 码,三次机会都浪费了。


这时候 SIM 卡就进入了一个“安全锁定” 模式,需要输入一个八位的 PUK 码才能解锁。


同时它还要求你重新设置这张 SIM 卡的 PIN 码。



而如果输入错了 10 次 PUK 码,那这张 SIM 卡就会销毁。



所以在小哥找到自己的 SIM 卡包装,输入 PUK 码,重置了新的 PIN 码之后,他终于成功的进入了自己手机的系统。


PUK 码一般写在 SIM 卡的包装卡套上或者可以打电话或者向营业厅查询。



进入了自己手机的系统。



发现问题了嘛,在整个过程中,他不需要输入自己手机锁屏密码,就可以解锁手机。


但是一般来说,手机在插拔 SIM 卡或者重启之后,都是要强制你手动输入一次密码才行的。



一张自己的 SIM 卡,这么简单就可以绕过别人手机的安全防线?托尼也找出了自己柜子底的 pixel 4a 试了试,按照小哥的教程一顿操作,结果真的打开了。


安卓的锁屏,就这?


此时已经输入了 PUK 码,重置 PIN 码中 。



谷歌的反应


按这 BUG 来说,那岂不是所有人的安卓设备都有安全性风险?


认识到这件事严重性的小哥也是第一时间把漏洞发给了 Google。


照到他自己的说法,这是他迄今为止最简单的一次报告了。一共就五个步骤,两分钟不到的时间就可以复现。


于是也顺便去查了一下谷歌的 “赏金榜单”,依据谷歌的说法,这种高危漏洞能拿到最高 10w 美元的奖励。



果然,比起一个大胆的想法。还是走正规路子来钱快。


但谷歌就不一样了,虽然收到这个堪称 “十万火急” 的 Bug ,但它的表现还是一如既往的风轻云淡。


开口就是 :“ 你这个 Bug 以前有人已经汇报过了( 虽然我们还没修 ),我们不鼓励重复的 Bug 汇报 ” ( 10W 美元别想了!


除了态度以外,行动也在摆烂,小哥提交 Bug 三个月后,谷歌依旧没有修好这个问题,一直到 9 月的安全补丁更新,小哥发现自己的问题还是能触发。


期间他自己还跑到谷歌办公室去了一趟,当场给员工当场演示此 Bug ,但依旧没说好什么时候可以修复。



最后忍无可忍的小哥给谷歌下了 “ 最后通牒 ”。


你再不修,我就准备在 10 月 15 号公布这个问题。



从这句话开始,谷歌的态度突然变了,不但改口说可以给小哥 7w 美元的奖励( 虽然你不是第一个发现的人,但是感谢有你我们才开始修理这个 Bug ),也开始积极沟通修 Bug  的时间。



最后,终于在 11 月 5 日的安全更新中这个问题得到了修复,漏洞编号 CVE-2022-20465。



我们的手机,大抵可能应该也许是更加安全了。


BUG 从哪里来?


手机看上去是告一段落了,那这 Bug 到底是个咋回事呢?


托尼自己也不是非常专业的程序员,在看了小哥总结 + 谷歌修改的 AOSP 源码之后,


试着稍微那么理解了一下下,抛砖引玉将给大家看看,感觉讲的不太好的差友,也欢迎在评论区补充。


这次谷歌改动的地方还挺多的 。



简单来说就是在安卓上有个叫做 “ 安全屏幕 ” 的概念,它包括了我们的锁屏密码,我们的指纹数据或者是面部数据,也包括今天的 “ 罪魁祸首 ” —— SIM 卡 PIN 码以及 SIM 卡的 PUK 码。


这些安全屏幕呢,是实时更新,覆盖显示,就像下图一样,虽然我的手机锁屏了,但是在插入加了锁的 SIM 卡之后,SIM 卡 PIN 码锁就覆盖了手机的密码锁。


反应有点慢,中间剪了一段加速 。



而当一个 “ 安全屏幕 ” 完成了它的历史使命之后就要被销毁,就比如说我们输入密码解锁屏幕,输入 SIM 卡的 PIN 码解锁手机SIM 卡锁。


负责销毁它的函数,叫做getKeyguardSecurityCallback().dismiss() 函数( 下面简称 dismiss( ) )。



但是到这问题出现了,.dismiss() 它虽然负责销毁安全屏幕,可是它不负责消除哪一个安全屏幕。


而偏偏这个安全屏幕会处在一个 “ 实时更新 ” 的状态 —— 因为手机会时不时检测 SIM 卡的状态。


所以在我们通过 PUK 锁重置完 SIM 卡 PIN 码之后,本来要销毁 PIN 码锁这个安全屏幕的.dismiss() 函数可能就会先撞上 “指纹锁屏” 或者 “密码锁屏” 这个安全屏幕,然后把它先行销毁。


啪,我们的手机就解锁了。



这就这次漏洞的成因,而安卓后续的 Bug 修改方式呢则是很简单,准备给 .dismiss() 函数增加 “ 认识能力 ”。



让它在销毁安全屏幕之前能认出来销毁的是谁,省的乱杀无辜。


面对 BUG,其它手机表现怎么样?


海外的故事告一段落了,Bug 得到了修改,我们的设备会更加的安全,发现问题的小哥也收获了收入。


不过托尼感觉比起听原生安卓的故事,大家可能更关心我们手上的系统表现的怎么样。


正巧今年新出的这几台手机我在柜子里吃灰,于是呢就给各位差友简单测试了一波。


手机的系统都展示在这里了,基本都是基于 安卓/AOSP 12 开发的。


都是刚拿出来直接测的,没有更新最新补丁 。



按照小哥的方法,托尼一顿操作猛如虎的测试下来,结果有点出乎意料。



除了用原生系统的 Pixel,每一台手机都守住了自己的 “ 安全底线 ” ,均在这个问题面前幸存了下来。


可能因为大家都是自己重写了锁屏吧。


所以,这个 Bug  虽然听起来挺离谱和危险,但是其实对咱们应该影响不大。


但还是希望谷歌未来上上心吧,这么简单的漏洞,还能活到 2022 。


本文来自微信公众号:差评(ID:chaping321),作者:托尼