謝謝大潘給我做的介紹,在演講的問題上,在中國可能沒有比大潘的能力更強了,大潘前陣子搞了極限演講的挑戰,就是站在臺上整整講了一天,挑戰下來了。今天我給大家講的內容是,之前講過一次,聽過的人舉下手,很好,只有幾個人,我又能拿這個混一下。“內存戰爭20年”,為什么用這個題目呢?我們看這個詞,內存·戰爭·20年。
內存怎么打仗?大家聽到這個名字的時候可能腦子里面浮現出來的是機箱里幾個人的內存條跳出來造反了,互相掐,是不是這個意思呢?實際內存在這兒它并不是戰爭的主體,它是個戰場,發生在內存當中的戰爭。為什么講個20年呢?IT技術是個日新月異,每天都有變化的領域,我們為什么要看一個20年這樣久遠的歷史?比如現在要提到ATP這個詞,大家耳朵都聽出繭子來,認為就像前幾年發生的Starnecape(音)、火焰。當時1986年,蘇聯還沒解體,克格勃的人,就是一個為克格勃服務的攻擊者,從西德不萊梅大學,因為1986年互聯網遠遠沒有今天這么發達,沒有那么便利,而且它也不太可能從蘇聯直接進入美國的網絡,所以他們通過西德當時德意志聯邦郵局,通過一條衛星鏈路接入到美國勞倫斯伯克利國家實驗室,這個實驗室是為軍方和國防做一些研究的,進入之后利用UNIX主機上的漏洞,獲得了系統root權限,在系統里試圖尋找和核有關的資料。
這件事情,在今天看來是不不是一個ATP事件?應該說相當得符合,但它發生在什么時候呢?1986年,而且這個事情最后被發現也是非常具有戲劇性,那時候大型UNIX主機是按照給每個用戶使用時間付費的,每個人是瘦終端,連接到大型主機上,用多長時間交多少錢。當時負責維護主機科學家,因為實驗室里沒有網管,網管也是科學家,是個天文學家,他們領導跟他說這個月的漲你看一下,有個0.75美元對不上,誰用的?沒交錢,就差0.75美元把這個人抓出來了,他用了0.75美元計算時間在系統里搜尋核技術有關的資料。
雖然說技術日新月異,但很多東西,幾十年來并沒有太大的變化,還可以再把時間往前推,推到1972年,James P·Anderson為美國空軍寫了一份文檔,有上下冊,有兩冊的文檔,名字叫《計算安全技術規劃研究》,想象一下1972年那時候IT技術是怎樣的背景,那份文檔里已經非常非常詳細地描述了我們今天已知的很多種漏洞類型,非常清晰地描述了關于木馬和后門的概念,甚至不僅僅是概念,非常詳細的技術細節,類似像我簡單翻譯的這么一小段,大家看這一段描述的是什么?緩沖器溢出,有些說法和今天的名詞不太一樣,但說的是這么一回事。也就是說在今天這件屋子里,很多人還沒有出生以前,他已經把這個東西講的很清晰了。
幸好這份文檔當時是技術的經典,但在美國沒有引起足夠的重視,沒有特別多的人把它當一回事,所以我說幸虧沒有人把它當一回事,否則今天我們和美國的差距會更大。因為有那樣一份文檔,大家去意識到理論上存在的可能性和做出實用的例子之間是有距離的。我們看到文字描述和看到真實的攻擊給人帶來的感受也是完全不同的。在我們看到這種現實的比較嚴重的有目的的攻擊例子之前,其實有非常多的人已經做出了預見,并且提出了警告。這些聲音都被忽視了。如果今天我問你有哪些比較嚴重的攻擊案例可能都能說出來,但哪些人注意提出過警告,可能沒有人說出來,因為沒有人進行主義。
1988年Morris蠕蟲在數小時內感染了當時互聯網所有服務器的10%,大家知道蠕蟲很多,剛才那份安德森的文檔大家聽說很少,因為只有真正出了事情才會知道這個事情的重要性,這是這個行業的悲劇。1988年Morris蠕蟲事件讓人們意識到漏洞的威力,也導致美國SEZ(音)的成立。這是當時電視臺播新聞的一位主持人,播新聞時截的圖,當時人們對Virus的認識還停留在幾個電阻和一個集成電路來表示,就是當時人們大腦里對這些東西是沒有什么概念的。蠕蟲利用了服務器上一個漏洞,對蠕蟲也沒有概念,所以它用Virus的詞,因為普通人對安全唯一的概念就是Virus,所以電視臺播這個新聞時不得不用大家熟知的概念介紹Morris蠕蟲。即使在Morris蠕蟲發生很長一段時間之后,很多程序員仍然認為緩沖區溢出類的用戶只是導致一部分程序崩潰的Bug。相關技術只在非常小的圈子里被討論。
1988年再往后,一直到1995年才出現了第一篇公開去討論漏洞利用技術的文章,這才把一直是在臺面之下的東西有人把它拖出來了,有人看一眼。我說的《內存戰爭20年》,這20年是從1995年開始算的。1995年到今天20年,因為戰爭要有交戰雙方。1995年這些東西都有了,但沒有交戰雙方,因為沒有防御者,只有攻擊者,一方對另外一方無情毆打,根本不存在攻防雙方的對抗,所以1995年之前是沒有戰爭的,1995年之后才有戰爭。
安德森在23年前,就是1995年之前的23年所寫下的那段話才真正被人們接受,攻防雙方在內存中的較量才展開。第一個向人們介紹相關技術的同志。左邊是他當程序員時的照片,右邊是他2009年加入國防部的照片。是不是很難想象之前搖滾青年很朋克的形象一下就站到國旗下了。他本命叫Peter Zato(音),加入國防部之后加入了Google的實驗室,昨天還是前天他又受到白宮的邀請,請他出來建立美國國家級信息產品的安全檢測實驗室。他應該是已經接受了這個工作邀請,從Google出來再走馬上任干這件事情。
到了1997年,Sun公司在Solaris2.6中借助SPARC處理器的新特性,實現了禁止執行堆棧上的代碼。大家在學校里學習安全編程相關課程時,有的教材會提到緩沖器溢出是由于馮·諾伊曼體系導致的。實際上Sun做的這些事情可以理解為在邏輯上讓馮·諾伊曼體系成為某種程度上的哈佛式體系。同樣,也在1997年,StackGuard技術誕生了,前面Sun技術是基于應盡做的,而StackGuard,非常有意思的是1997年基于軟件和硬件的兩套漏洞防御思路,也是我們今天沿用至今的兩大防御思路都在1997年誕生了。
也在1997年,在這兩種技術的對面,就是戰爭的另外一方,繞過這兩種技術的對抗技術也誕生了,1997年8月和12月,分別有兩個人提出了繞過硬件的內存不可執行位的對抗方法,以及繞過StackGuard的方法,尤其是第二個。前面大家寫的都是一些Paper,我深知沒辦法告訴你Paper的名字,因為Newsham在郵件列表里回的時候簡單提了一句話,簡單提了一下他的思路。今天郵件列表大家有點陌生了,早期大家認為郵件列表就是今天的BBS,今天BBS也逐漸走向夕陽西下,或者今天的微信群。就是他提了這么一句,他提的這樣一句話,在之后很多論文里,引用參考里會說某年某月某日在郵件列表里提了一下,甚至不是一篇正經的Paper,但有大量的Paper引用這個內容。
那段時間,整個安全研究界的氣氛是非常好的,非常多的聰明人在這個領域里,而且毫無保留地發表自己各種想法。但從整體上悶熱對漏洞的認識仍然前行的比較緩慢,包括一開始大家認為緩沖區溢出的問題只能在Unix系統上實現。1998年,1999年安全社區里出現了兩篇文章,提出了成熟的Windows緩沖區溢出漏洞利用技術。1998年DilDog寫的緩沖區溢出,這主要是棧溢出,1991年Shok寫的Windows的堆溢出。因為Windows堆棧系統不穩定,而且高位經常是零,利用起來和Unix系統是很不一樣的,這兩個文章里把這個技術做得相對比較實用了。
第二篇文章的標題叫“W00W00”那個年代比較活躍的黑客組織,Shok是這個組織的成員之一,他寫這篇文章時大概只有十幾歲,左邊穿藍色衣服金發的是他,這是2001、2012年的照片,那時候看上去也非常年輕,可以想見他1998年該有多大,大概15、16歲。“W00W00”組織也是國外黑客組織歷史上值得銘記的組織,Whatsapp創始人是W00W00這個組織的成員。ABO(音)這個廠商做抗拒絕服務的,ABO(音)廠商是W00W00的成員,這個成員還創建了很多其他的公司,它的CloudVolums被沃爾沃(音)收購了,成為沃爾沃(音)的一部分。該
Sun SPARPC的硬件體系中,存放位置由地址去確定的,也就是說計算機沒有辦法區分數據和代碼。Sun的這個硬件防護技術可以把地址和指向代碼的地址區分開,CPU可以拒絕職能那些指向數據區域的指針。這是內存不可執行技術的本質。繼Sun SPARPC處理器出來之后,出現了DEC alpha、IBM的、AMD Athlon64一系列面向服務器的CPU,都增加了類似的特性,直到2003年這項技術才出現在電腦里。
在2003年,微軟在新發布的Visual Studio中新增了類似StackGuard的軟件保護機制,1997年軟硬件防護措施和對抗措施同時出現,2003年又是很有趣的時間點,這些技術統統在個人電腦上出現了,一旦到了個人電腦上之后,這種對抗就就開始進入白熱化階段了,因為電腦影響面遠遠大于服務器的,各種各樣的技術,我們叫神仙打仗,各種各樣的技術在內存中混戰。
2009年,戰火從服務器燒到個人電腦,燒到了手機,Android系統在2009年引入了類似StackGuard的機制,2010年引入了內存不可執行(No-EXecute),2011年引入了地址隨機化(ASLR),2013年把SEAndroid技術引進進去。中國國產手機并不能打開,Android官方這些都提供了,我們國家很多手機廠商開安全特性會影響跑分。跑分背景下有關安全就沒有打開,總結一下漏洞相關的技術,可以粗略地去對照人類的文明發展,人類文明發展了上萬年,內存發生了相似的階段,如果我們把人類文明從原始、農業、工業這個過程,人們在原始文明進行狩獵采集,到了農業文明進行耕種養殖,到工業文明進行制造與合成。漏洞的挖掘、攻擊和防御這三塊領域其實也會有相關的關系,漏洞挖掘在早期都會有個人的能力,而且基本靠這個眼睛看,靠個人的經驗。逐步發展開始有一些自動化和工程化,到了今天,把這個已經發展成個非常成熟的工業體系。包括攻擊也是這樣,最早我們可以把早期的漏洞攻擊方法抽象成為利用內存中的數據,發展中期以黑伯斯布瑞(音譯)為主的創造數據的技術。到今天發展為在內存中進行字節級的控制。
相應的防御領域也是這樣,防御上,今天技術已經發展到什么程度呢?我們稱之為“縱深防御”,最典型的廠商就是微軟,以微軟為代表的。今天的思路是減少可利用的漏洞。
1、以微軟新推出的延遲釋放和隔離堆等技術為代表;
2、降低漏洞利用成功率,漏洞再怎么減少它是不可能杜絕的。那么對于實在存在的這些漏洞,降低利用成功率,再怎么樣降確實還有一些漏洞會被漏洞利用成功,怎么辦?
3、增加漏洞代碼編寫成本,再怎么對抗最后也是成本對抗。
4、你要不惜一切代價來攻擊,就假設你攻擊成功了,降低漏洞利用帶來的危害,以沙箱技術為代表。
從更大的視角來看,現在更大的漏洞防御已經從早期的單點發展到造的一個詞“全時視野”,從設計時到開發時、到編譯時、到運行時,每一時都有相應的技術體系和方法去保障。同時,通過業界合作,上游、下游,微軟相當于在中間,上游是英特爾,下游以Adobe為代表的開展業界合作。我們知道與Adobe合作,微軟把Adobe漏洞納入到自己的安全公告體系里。社區建設,包括贊助活動、舉辦會議、懸賞獎勵等等。
Intel近年為防御漏洞利用近期在他的Ivy Bridge處理器實現了SMEP或SMAP進行合作,這是在微軟的Haswell處理器里實現的。
即將面世的Intel Skylake處理器新增了MPX指令集,英特爾為了安全性在處理器里加上指令集和特殊性,唯一目的是為安全,這些年他做了很多事情,這和微軟的上游建設是分不開的,英特爾增加MPX指令集也不僅僅是這種因素,因為緩沖區溢出已經誕生幾十年,而且已經有StackCookie等軟件方案,為什么英特爾還要搞硬件方案呢?以前這些事兒靠微軟就行了,但因為英特爾要做移動市場。剛才我提到的一些原因,Android碎片化很嚴重,安全又沒有像微軟這種強有力的手在上面推動,在這種背景之下,英特爾自己如果想把這個生態做好自己得開始出手了。微軟為了推MPX在GCC社區里已經推了很長時間,把相關的指令集加到社群里面去了。
無論是攻擊還是防御技術,都已經進入綜合、融合、協同、多維度的發展階段。在內存戰爭進行了20年后的今天,我們會議一下這20年中發生和發展的事情,再去想象一下未來這種戰爭,首先沒有結束,其次會更加精彩!
謝謝大家!