换个SIM卡|安卓锁屏不到2分钟被破解,仅需换一张sim卡( 二 )


换个SIM卡|安卓锁屏不到2分钟被破解,仅需换一张sim卡
文章图片
时间又过了一个月 , 小哥收到安全团队的邮件 , 对方称漏洞还在修复中……
又又过了一个月 , 九月谷歌发布了新的补丁 , 但这个Bug依旧没有修复……
不过小哥也不是轻言放弃的人 , 他直接来到谷歌办公室 , 用谷歌Pixel手机演示了一下这个漏洞 。
而后他给安全团队定了个漏洞修复期限:10月15日之前 。 而对方的回复也很干脆:10月份这个Bug修不好!
换个SIM卡|安卓锁屏不到2分钟被破解,仅需换一张sim卡
文章图片
在拉扯一番后 , 小哥和谷歌建立了联系 , 能够实时得到漏洞修复的反馈 。
谷歌方也确定了修复工作的具体时间:11月份进行 , 现在这个漏洞已于11月5日谷歌的安全更新中被解决 。
值得一提的是 , 关于提交漏洞的奖励 , 小哥最终也拿到了7万美金 , 不过谷歌对此还做出了一番解释 , 用小哥的原话来说 , 就是:
尽管我的报告是重复的 , 但正是因为我的报告 , 他们才开始着手修复 。 正因为如此 , 他们决定破例一次 , 并奖励给我70000美元 。
小哥和谷歌的完整对话链接附在文末了 , 感兴趣的伙伴可以自行查看 。 (手动狗头)究竟为什么会出现这样的漏洞?
现在 , 谷歌的安卓工程师们终于把这个漏洞给补上了 。
然而让小哥惊讶的是 , bug修复远不止他想象的“一行代码补丁”那么简单 。
从提交的修改情况来看 , 光是要改动的文件数量 , 就达到12个:
换个SIM卡|安卓锁屏不到2分钟被破解,仅需换一张sim卡
文章图片
所以这个漏洞究竟是怎么出现的?
简单来说 , Android系统中有一个叫做“安全屏幕”(securityscreen)的概念 , 其中包含两种东西 , 一种是PIN、指纹、密码等各种直接解锁密保的屏幕操作 , 另一种是SIMPIN和SIMPUK等各种解锁手机锁定状态的操作 。
这些操作被放在一个栈(stack)中 。
正常解锁谷歌手机时 , 直接用PIN、指纹或密码都可以 , 但不能超过3次 , 否则就会被锁定 。
但如果忘记密码 , 手机(在输入3次错误密码后)被强制锁定了 , 同时SIMPIN条目可见 , 它就会被放置在其他屏幕解锁操作之上 , 用来让你解除手机的锁定状态 。
换个SIM卡|安卓锁屏不到2分钟被破解,仅需换一张sim卡
文章图片
△栈原理
这时候 , 如果使用SIM卡自带的PUK密码 , 就能通过一个叫“PUK重置组件”的模块调用.dismiss()函数 , 将手机锁定解除 , 并继续显示栈下面的其他屏幕解锁操作 , 在小哥的案例中是指纹锁屏 。
换个SIM卡|安卓锁屏不到2分钟被破解,仅需换一张sim卡
文章图片
△就是这个函数
这里注意 , .dismiss()函数可不是一个“专人专用”的函数 , 它并不只会解除SIM卡的手机锁定屏幕 , 连PIN、密码和指纹之类的正常锁屏也能解锁……
这就导致它极容易受到竞态条件影响 , 一旦两个线程执行顺序出现一点儿误差 , 就可能导致屏幕解锁出现问题 。
竞态条件即两个或者以上进程或者线程并发执行时 , 其最终的结果依赖于进程或者线程执行的精确时序 。
举个栗子 , 如果在“PUK重置组件”的模块调用.dismiss()函数之前 , 就有操作改变了当前的安全屏幕 , 那么.dismiss()函数就可能误解锁指纹锁屏 。
关键来了 , 由于手机SIM卡状态是随时更新的(系统一直在监视SIM卡状态) , 因此如果SIM卡状态发生变化 , 系统也会更新当前的安全屏幕 。