上周,一条新闻吸引了托尼注意。
只用一张 SIM 卡,1 分钟不到就能解锁你的安卓手机?
一个国外小哥发现,不要刷机,不要电脑连线折腾,也不要 999 的 AK 火麒麟,只需要一张自己准备的 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() 它虽然负责销毁安全屏幕,可是它不负责消除哪一个安全屏幕。
也就是说不论是锁屏,还是 PUK 锁,碰上哪个就会清理掉哪个。。。
而偏偏这个安全屏幕会处在一个 “ 实时更新 ” 的状态 —— 因为手机会时不时检测 SIM 卡的状态。
所以在我们通过 PUK 锁重置完 SIM 卡 PIN 码之后,本来要销毁 PIN 码锁这个安全屏幕的.dismiss() 函数可能就会先撞上 “指纹锁屏” 或者 “密码锁屏” 这个安全屏幕,然后把它先行销毁。
啪,我们的手机就解锁了。
这就这次漏洞的成因,而安卓后续的 Bug 修改方式呢则是很简单,准备给 .dismiss() 函数增加 “ 认识能力 ”。
让它在销毁安全屏幕之前能认出来销毁的是谁,省的乱杀无辜。

/

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

海外的故事告一段落了,Bug 得到了修改,我们的设备会更加的安全,发现问题的小哥也收获了收入。
不过托尼感觉比起听原生安卓的故事,大家可能更关心我们手上的系统表现的怎么样。
正巧今年新出的这几台手机我在柜子里吃灰,于是呢就给各位差友简单测试了一波。
手机的系统都展示在这里了,基本都是基于 安卓/AOSP 12 开发的。
都是刚拿出来直接测的,没有更新最新补丁 ▼
按照小哥的方法,托尼一顿操作猛如虎的测试下来,结果有点出乎意料。
除了用原生系统的 Pixel,每一台手机都守住了自己的 “ 安全底线 ” ,均在这个问题面前幸存了下来。
可能。。。因为大家都是自己重写了锁屏吧。
所以,这个 Bug  虽然听起来挺离谱和危险,但是其实对咱们应该影响不大。
但还是希望谷歌未来上上心吧,这么简单的漏洞,还能活到 2022 。。。
撰文:小陈   编辑:面线
图片、资料来源
Accidental $70k Google Pixel Lock Screen Bypasshttps://cs.android.com/android/_/android/platform/frameworks/base/+/18b88655a4d3d70733a9d12f740b6790f9061eaa:packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java;l=280;drc=a9143bf7bdf0b9c8bd5535485aee802ad0ad54be;bpv=0;bpt=0
Pixel 6 Full Lockscreen Bypass POC —— David Schütz
https://news.ycombinator.com/item?id=33544883
继续阅读
阅读原文