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