換個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嗎?