CVE-2016-0844,這串毫不性感的代碼是一個漏洞的名字。
通過這個漏洞,黑客可以拿到 Android 手機內核最高權限,在主人不知情的情況下翻看查看聊天記錄、銀行卡密碼、隨時靜默拍照、向任意號碼發信息、打電話。
為此,谷歌向這個漏洞的發現者——冰刃實驗室——發去了一封致謝函。如果你是網絡安全愛好者,冰刃(IceSword)這個字眼一定在你心中占據著一席神壇。2004年,這款幾乎可以查殺所有木馬的軟件在圈子里聲名鵲起,引起了各大網絡安全公司的注意。而它的作者,竟然是一位在校的學生。他就是潘劍鋒。
冰刃的簡潔和靈性散發出一種出只有黑客們才可以欣賞的美。如今在各大論壇上,還依然有諸多仰慕者追隨著潘神的名號,傳揚著他的傳說。而潘神卻低調地走出光環之外,修煉至今。
冰刃實驗室,正是他的回歸。
【IceSword 冰刃軟件截圖】
{潘神的迷宮}
潘劍鋒坐在雷鋒網(搜索“雷鋒網”公眾號關注)記者對面,一臉平靜地說,其實這個漏洞并沒有太多可說的,只是一個新的“系統提權漏洞”而已。
事實上,“系統提權漏洞”是拿到Root權限的最后也是最難的一躍,在谷歌的評價體系里毫無爭議地屬于高危級別漏洞。根據谷歌的致謝數據,每年這一級別的漏洞致謝仍是屈指可數。但在潘神眼里,這種形式的漏洞是一個經典形式,他只是為這個漏洞家族又添了一個新丁而已。這大概像一個學霸,看到大家都考95分,自己又有什么可高興的呢?
對于這個曾經把對X86操作手冊倒背如流,對系統內核技術如癡如醉的“技術宅”來說,他的目標并不是找到那個最堅固的攻城武器,而是制造出無人可破的防御系統——一個讓圖謀不軌的黑客永遠迷失的迷宮。
對系統底層技術的了解,增加了他制定這個目標的底氣。他把操作系統被拆分為邏輯背后的一組組代碼。就好像一位建筑家,可以把摩天大廈拆分成鋼筋水泥肌理下的每一條磚。
既然如此,他必須解釋一個終極問題——漏洞因何而存在?
【Android 系統內核,一般指最底層的 Linux Kernel】
{漏洞的本質}
任何程序都是交互的過程:輸入信息,得到反饋。而從本質上來說,這些交互可以被拆分為“一問一答”,也就是“輸入輸出”的單元。
黑客往往通過構建一些異常的輸入。只要程序處理不正確,就會產生相應的問題,例如造成程序的崩潰。而通過精心構造提問的方式,可以實現意想不到的效果,甚至讓程序走入你制定的邏輯。
這是漏洞的基本邏輯。
當然,現在越來越完善的系統對于絕大多數的“問題”都能夠給出毫厘不差的“答案”。只有在極其特殊的情況中,才會出現漏洞。例如:
某次會議規定,與會者必須喝光面前的水才能離開,而偏偏有一個遲到的童鞋沒有聽到這個規矩,在杯中留了半杯水。當會議結束后,有機器人自動把所有杯子重新填滿。這時,在原本沒有喝光的水上面再加一杯水,就會造成溢出。整個桌子都會因此被打濕,設定好的程序就會發生錯亂,漏洞出現。
某個電梯規定,不能同時容納兩個人。所以每當一個人進去之后,應當首先鎖好電梯的門。但是如果一個人忙得暈頭轉向,忘記鎖門,就可能出現第二個人突然闖進來的結果。這樣一來電梯就會發生墜落。漏洞又出現了。
雖然沒有鎖門、沒有喝水,這樣的“失誤”發生概率非常小,然而它們發生的條件卻是確定的,只不過這種條件相當苛刻,在正常的運行過程中幾乎不會發生。所以,尋找漏洞變得很簡單:只要把一個程序運行過程中的所有“偏執”的可能性都一一嘗試,就可以排查掉所有意外發生的條件。這種情況下,這套系統不就成為了一個沒有漏洞的完美系統嗎?
{世界上所有的回答}
好了,接下來我們要做一件浪漫的事,問出“這個世界上所有的問題”。
面對一個系統,我們原則上可以畫出它的“控制流圖”。也就是說,假設我們的計算能力無限,對于每一個邏輯,我們輸入不同的值,計算出在怎樣的值下面,系統會給出怎樣的回答,把這些回答歸納為所有的可能性,再進一步對每一種可能性重復如上的操作。
如此一來,我們就可以畫出巨幅的邏輯樹,見到一個分叉路口就嘗試每一個可能,最終我們的足跡會遍及邏輯樹的所有枝杈,把從一個原點開始的所有可能都囊括進去。
【邏輯樹示意圖】
潘神解釋,這種方法被稱為“約束求解下的具體執行”,在這種情況下,會把所有的情況——哪怕是概率極小的事件——都進行預演。從而排查是否存在程序錯亂的情況,進而發現漏洞所在。
然而,這樣的計算遠不像說起來這么簡單。潘神說:
看到岔路,計算什么情況下往左跑,什么情況下往右跑。是一個特別難于解決的問題。而且如果完全計算所有邏輯上的可能性,對于數十萬行代碼的操作系統來說,時間要求過大。縱然在理論上成立,在現實中也沒有可能實現。
所以,潘神實際上給出了一個悲傷的答案:
我們沒辦法窮盡世界上所有的問題,也就沒辦法驗證世界上所有的答案。
在現實世界里,安全仍然必須有所取舍。用有限的資源去對抗無限的可能。而正因為安全是一個無法抵達,只能無限接近的頂峰,它才變得無比迷人。