压在透明的玻璃上c-国产精品国产一级A片精品免费-国产精品视频网-成人黄网站18秘 免费看|www.tcsft.com

Intel李曉寧:漏洞攻擊防御技術探討

李曉寧:大家好,今天很榮幸在這里跟大家分享一些關于防御方面的經驗。我想大家也有看到,今天的話題很多都是關于攻擊,可以說在過去的幾年或者十年中,攻擊始終是主流,因為防御是一件非常困難的事情。

當你設計一個很復雜的系統的時候,你不可避免的會導致各種各樣沒有考慮全的或者說潛在的設計上的一些漏洞也好,原因也好,最終你會發現你設計了很復雜的系統,或者說很強的防御系統,最終會被攻擊者在一些點上輕易的繞過,所以這是一個非常挑戰的事情。

我來自于英特爾實驗室,在過去的10年里主要專注于利用硬件芯片技術去設計整個系統針對Zero Day和APT進行防御,今天我主要介紹一些我們做過的或者說相關的一些硬件的功能以及相關的防御思路。

首先我們看一下今天在Windows OS里面最流行的一些防御手段,我并沒有列出所有的防御手段,這里列出比較重要的。DEP就是執行防御,它解決了一個數據本身,作為開發者沒有允許它作為執行的情況下,

在過去的很多年里沒有DEP的時候,攻擊者可以很輕松的跳轉到控制的數據里面執行,這個問題就徹底杜絕了數據的存儲進行執行的這樣一個問題。其實這個從實現上來說是一個很的實現,但是從防御的角度是一個很重要的。

有了DEP之后,我們發現實際上很多時候攻擊者還可以用很多其他的方法,比如說IOP進行這些攻擊。怎么樣讓他們的攻擊成本更高,更困難,這個本身在地址空間訪問上就帶來了另一個防御手段叫ASLR,這里我用藍色標注的都是依賴于硬件的功能,

沒有標注的都是軟件,因為ASLR這個功能大家可能知道,這個就是軟件上的一些防御,然后怎么樣保證它每次加載的時候是隨機化的,去增加這個攻擊的難度。

在這個之后,我們又看到了很多,因為在相當長的一段時間里面,棧溢出是非常流行的,針對這些,軟件廠商也提出了很多新的功能,比如說Cookie這樣的,集成到軟件系統里面去,然后對它進行防御,這種防御手段更多的是針對特定的漏洞類型以及攻擊方式。

在這之后,我們在硬件層面上Windows集成了一個SMEP的功能,SMEP解決了一個當你在內核態不經允許,任意返回到用戶態去執行的時候,這一條路徑是一個非法路徑。在沒有SMEP的時候,這是一個非常經典的內核提權的方法,有了SMEP之后,這條路就不能用了。

當然攻擊者發現了很多途徑,比如怎么樣套到內核態去執行,這是一些新的攻擊法,但是這條路就不能用了。

當棧溢出已經不再是主流的時候,我們發現在相當長一段時間之內,尤其是過去幾年,這種漏洞非常流行,有很多人發現了各種各樣這樣的漏洞。在這個利用過程當中,你怎么樣控制這個內存把它Free掉,重新到你可以控制的地方,

然后很準確的控制這個內存當中的數據,這本身都是在你在成功的Explore過程當中都需要解決的問題。微軟有提供了這樣的功能,讓你的Explore變得更加的困難,當然設計本身也有很多的缺陷或者是漏洞。

今天CFG已經成為了一個非常流行的,你在Windows上進行跳轉這件事情,他提供了一些功能,保證不能在任何地方都跳轉過去,試圖增加攻擊者的難度。

這張圖我只是講了今天在Windows下面最主流,最流行的一個攻擊的方法和環境。實際上我們作為硬件廠商提供了很多底層的功能,都可以用來做一些防御,這里我列到一些我們非常經典的安全功能,是芯片級別提供的。

第一個是EDB,這個很簡單,就是最典型的第一批實現的硬件基礎,就是你想去防止這樣一個Memory去執行,你必須要告訴硬件這個Memory是否可以去執行,在傳統的架構里面是沒有這個Bit去做這個事情的,

通過EDB的項目,增加這個Bit可以保證我們可以很清晰的去讓這個Data和Memory不可執行,這是硬件上面提供的功能,軟件去執行,最終提供相應的解決方案。

SMEP是我剛才解釋過的,超級模式下的訪問,關鍵解決的問 就是,當你在內核態的時候,當你有一個漏洞,比如說你這個EDX被攻擊者控制,如果沒有SMEP這樣的Feature,可以直接把內核態指向用戶的地址,你可以非常容易的做提權,加一段代碼替換掉。

有了這個功能之后,這條路就不工作了,你必須要想別的辦法在內核態增加攻擊者的難度。

還有一條功能是SMAP,這個和SMEP非常一致,但是不太一樣的是在于,SMEP在于你在內核態的時候執行用戶態代碼,SMAP是說我在內核態的時候,我怎么樣保證對用戶態數據的訪問是受限的,并不是在任何地方都可以。

這個主要是在硬件里面提供相應的功能,有一些狀態說當你在內核里面需要訪問用戶態數據的時候,比如說最經典的Case就是說,你做了很多的參數,你需要靠一些Driver,需要從用戶態獲得數據。

在這種時候,因為這個Driver是開發者寫的,他可以通過這些補丁強制說我只有在這個地方才能訪問這些數據,其他的地方的訪問可能都是非法的。這樣的話,極大的降低了攻擊者利用任何一個地方都能進行訪問,比如說Time to choose的漏洞,就可以用來做這方面的防御工作。

下面一個叫做MPX,這個功能我想很多朋友都知道,它主要是我們提供了一組數據,可以讓你可能導致Fold的地方加特定的指令,這些指令在每次做這些Memory訪問的時候,可以通過預先已經配置好的數據,當然很多數據是編譯階段就已經獲得了,對這個Memory的訪問進行控制。

比如說一個數組只有10倍,在沒有這些指令的時候,你對這些數組進行訪問的時候,可能有一個變量,比如說這個變量可能是EVX。在這種情況下,我要做一個讀寫,當我的EVX被我控制之后,它可以不是10,如果是0到9的話,可能最大的值并不是9,可能是10或者說100。

如果你用了一套這樣的指令去加入進行數據訪問的地方,CPU就會自動的根據內存里面已經準備好的數據去對它進行一個檢查。當你說我要訪問的時候,CPU會根據預先配置好的數據去檢查,這個指征只能是0到9,你用100的時候,可能就不行。所以這個功能可以用來幫助大家預防一些漏洞,降低被利用的可能性。

后面一個叫SGX,我想很多朋友也知道,這是一個很大的功能。我們提供了SGX這樣一個功能,實際上它是說,有很多時候防御是很困難的,可能到最后一步的時候,的確病毒已經在運行了,我們并不能完全的停止Explore這個過程,

允許你把重要的數據,比如說銀行卡,比如說密碼這樣的數據放到TE里面做預算,當你離開了這個環境之后,這些數據在外面不可信的是不可訪問的,他沒有權限獲得這些敏感數。我們SGX已經發布了,后面有兩個Feature,

一個是最新的CPU很快就會有這樣的功能,主要是解決了一個Memory訪問的問題,后面有一張幻燈片會更詳細的講這個功能,講怎么樣利用這個功能我們去設計一些沙箱,去防止這種攻擊。

最后一個就是CET,這是一個非常重要的Feature去解決問題。怎么樣有一套解決問題的方案,實際上是非常挑戰的,這個我們和微軟一起合作,推出了這樣一個功能。

在此之外,我想各位朋友也知道,很多時候是他山之石可以攻玉,我們設計了一個功能可能并不是針對安全的,但是你可以用它來做一些安全防御上的事情,也許效果還非常好。

比如說這里面第一個例子是LBR,我想如果大家關注微軟的話,你會發現他們幾年前得第一名的項目最核心的技術就是利用LBR去記住當前執行PaaS過程中的執行信息,然后再根據一些Policy,這是今天已經非常流行的一個Policy,這是一個功能。

實際上LBR這個功能在我們的CPU里面已經存在了很多年,很多時候可能大家沒有想到這個功能實際上也能用來做防御。

第二個功能是BTS,LBR的限制是它是一組MSR,這些MSR在每一代CPU里面都是有限制的,比如說16個,32個,最多是這樣。你怎么樣做到我們能有更多的信息在里面,抓到更全的信息。

這個時候你可以利用一個叫BTS的功能,你可以有一段Memory。當你正確的配置完這樣一個功能之后,CPU會幫助你把所有執行過程當中的路徑,相關信息存到這個Memory里面,當然這個對性能是有影響的,如果你做終端的話并不可行。但是如果你做沙箱或者是后端的話其實也是一個很好的選擇。

在此之外,我們還提供一些很簡單的DB,在很多場合里面也可以用來做防御,也許也會做得很巧妙。比如說我們支持Single Step每一個你去做檢查不可能,我們同時還支持BTF,當你在Single Step的情況下,你獲得了一個機會,你可以很容易做檢查。

今年我們發過一個很小的工具,就是基于這個原理,每次發生的時候我們去做一下檢查,看看有沒有做。作為工具可能不可行,但是作為后臺工具是足夠的。

PT這個工具提供了一個更強大的功能,是說我怎么樣讓用戶可以定制,說什么樣的數據我要記錄,并且提供一個很好的性能,今天這個功能里面這個性能已經可以接受了,可以用來做很多的研究。

比如說前幾天有思科的同行發布了他們的研究工作,他們抓到了相關的數據。因為你知道,在沒有這樣的功能之前,大家很多人都是用的是其他的技術,但是實際上離這個技術還是有很多的限制。如果能夠很好的利用PT這樣一個功能,會獲得很理想的數據。

還有一個是PMU,最初我們設計的時候是為了做整個代碼的功能,但是你發現這個功能并不局限于它,你完全可以用它來做更多的防御上的工作。后面我還有一個幻燈片會稍微更詳細的講一講。

下面一個是VT,實際上VT是一個非常復雜的東西,整個英特爾的這套VT的架構,包括你怎么樣選,這是一個相對比較復雜的。這里面會有很多不同的Using,如果你關心最前沿的OS的動態的話,你會發現微軟實際上在Windows10里面做了一個功能,核心的就是用VT提供了各種安全上的加固。

后面我會有一個幻燈片,舉一些例子講我們做過的工作,在上面怎么樣做安全上的防御。

下一個很簡單是Memory Model,我想大家很多人都知道,在英特爾的CPU里面保持了相當長一段時間。但是你會發現,如果你設計的非常好的系統,微軟還沒有正式的發布的一個Feature,包括騰訊的朋友也有分析,TK他們都有分析,你會發現,他們實際上里面應該是碰到了一些技巧去做一些保護。

今天我們實際上面臨一個很大的問題就是Code Rease,實際上可以有很多的方式,它最核心的問題是說,我能夠Run一些我需要的代碼,同時能夠把很多代碼片拼在一起。

在這種情況下,這是一個簡單直接的方法,這些都可以把代碼拼在一起,做一個攻擊者需要的事情,這個有相當長的時間,是專注于ROP、JOP、COP的事情。如果你做了這些時候,可以調用的代碼實際上是受限的,必須在合法范圍內。

在這里我們簡單的回顧一下CFG,其實思想非常簡單,都檢查是不是合法,是不是應該跳到這個地方。通常這個OS里面都會很好的配置好,每次當你要到一個地方的時候,系統里面配置好的檢查函數會根據他自己的算法去利用你要到的那個地址進行一個運算,最后去檢查這個地址是一個合法的地址可以跳轉。

事實上CFG這個工作,從設計的角度非常簡單的漂亮,但是總有一些問題,很多人都在做這方面的研究工作。在這里我簡單列一個思路,CFG站在這個角度有很多問題需要解決。

當你提供了這樣一個很簡單的Feature的時候,你發現產品去配合它需要很長的路要走,有很多時候可能就是兼容性的問題,各種各樣兼容性的問題必須要去解決,去保證正確的Enable,如果你去看最新的Edge的進程的話,里面還是有這樣的問題在里面。

CFG你可以Call到系統準備好的檢查函數,可能是沒有做到位,或者是有Bug或者是實現上的問題,會有一個方法最后篡改了這些Setting。比如張云海幾年前就發布了這樣一個信息,一套很復雜的代碼操作流程,讓一個只讀的Memory變成可讀性的。

一旦你由只讀變成了可讀性之后,只要你有這樣一個功能,你可以很輕易的把CFG檢查的函數那個指征存在的位置,改成了一個非常簡單的,你跳到任何地方都沒有人去挑戰你。

在此之后,你會發現很多其實本身CFG生成的代碼有時候可能并沒有Enable非常到位,比如TK曾經講,當你沒有做出很好的準備的時候,你跳到一個Code里的時候,在用戶調用的時候可以進行控制,

你可能一樣還可以跳到其他的地方,有很多這樣的問題可能還需要解決。這里面可能會涉及到很多OS的環境,兼容性等很多問題在里面。

即便你解決了所有的這些問題,但是你還保留了很多合法的函數,這些函數本身串在一起,可能一樣可以提供一個強大的功能允許你去做By Pass。站在這個角度,CFG還有很長的路,還有很多問題需要解決。這就是為什么我們會有CET這樣的功能推出來。

首先在CET里面,CET其實包括了兩個功能,包括Shadow Stack和Indirect Tracking。如果CET有了之后,CPU會看這個過程,檢查是不是合法的地方。另外Indirect Tracking就是看你是不是可以跳到這個地方,告訴系統說這個地方可以做,那個不能做。

這是Shadow Stack,當你今天調用一個Cop的時候,CPU會調到一個站上。如果你Retent的地方并不契合,會給你一個信號,你可以抓住攻擊。

Indirect Tracking就是說,當跳轉指令發生的時候,我們會很好的去比對,跳轉到的地方有沒有這樣一個Tack,如果沒有這樣一個Tack就是一個非法的。我們把Shadow Stack和Indirect Tracking放在一起,試圖加強這個防御,讓攻擊成本更高。

即便有一天我們有了CET這樣的功能,你會發現所有沒有Tack,都會被防御掉,只要做得足夠好,保證你生成的這些里面沒有合法的這些Tack,我們還是可以防止住這些,可能編譯器編譯的時候并沒有告訴你說這個地方是可以跳轉的,

但是由于種種原因,最后在可執行數據里面還包含了這樣一個Tack,這個Tack一樣可以跳轉做一些事情。但是如果你做得足夠好的話,可能這樣一些東西可以避免掉。

反過來看,即便這些功能都在那里,有很多時候這些合法的函數跳出來,我們依然很難去控制。比如說最簡單的例子,很多年前在GS里面,因為他要有相同的代碼,通過一些Bit去強制一段上下文能不能執行一些敏感的函數,或者不能執行敏感的函數。

但是如果你擁有了這個之后,你可以很輕易的去修改,還可以跳到這些函數里面去。但是這個跳轉在這個當中是不是合法?實際上并不合法,這些問題依舊在那里,很難去解決。還有包括TK曾經講過的跨維度的攻擊,

其實核心思想就是在這樣的引擎里面,當你用合法的方法去操作或者是控制這個內存里面的時候,你可能就生成一組對應到底層一系列的API Copl。這些問題依舊在那里。包括Loop Cop,反復做一些事情,做各種防御,這些還都是在那里。

這是我們幾年前一起討論的,我們認為應該是有授權的。你看這張圖里面,API里面有一個Funtion1.1,又有2.1,這張圖的脈絡是非常清楚的。Function直接到1.1是沒有問題的,到2.1的時候是一個非法路徑,我們需要把這樣的看起來是合法的API的調用區分出來,利用完整的信息去停止這些攻擊。

在這里我簡單的列了一下,就是當你去判斷一個Branch Transfer的時候你應該看到什么?我想我們大家應該都知道,原端口、原地址、目標地址、目標端口,這是一個非常清晰的地圖。

反過來我們再看這里非常的相似,當你調一個指令的時候,你原地址是放的什么樣的指令,你的目標地址是什么,在什么樣的模式下面。當你把所有信息放在一起的時候,你會發現你會拼出一張很大的圖,發現這里面隱含的邏輯,幫助你很好的去得到這些轉換。

一旦你有了這樣的機制,你可以很好的防止這些,包括調用一些完整正確的函數,但是可能在上下文邏輯里面并不是真正的函數。

在這里我舉了一個例子,Branch Transfer Access Control是一套思路,如何做才能被產品和思路接受,因為性能是一個很可靠的衡量目標,PMU就是很好的讓你去做研究的。在英特爾的PMU里面有很多的事件,當每一個你管線的invent可能會發生一個PMI,在這個里面你就可以去Apply你的一些Policy。

這邊這個圖很簡單的講了一下這個思路,比如說一個PMI發生的時候,你有可能就掉到了你的這個里面,你可以去加一些可以做的防御手段或者說Policy。如果你覺得這個東西有點麻煩,或者說你需要更多的Context,你看到這個執行,當A要跳到B的時候,A觸發一個Interrup,檢查函數執行完了以后再到B。這個路徑本身可以看到,實際上很花時間。

作為一個防御手段或者說防御技術來說,在這個上面對于Invent選取非常講究,你會發現所有的都會觸發,我可以做攔截分析。這個在CPU里面是一個非常重要的單元,幫助提升處理器的性能。在這一層上,現有的這些信息非常好。

如果你說只在這個地方觸發的話,會發現你這個Invent急劇下降,在盡可能少的里面減少這些供給的Case,可以很好的防御。特別是你做APT或者是后端分析的時候。

前面我們梳理了一遍以前做過什么,以后會有什么樣的功能,包括再進一步說我們應該怎么樣思考這個防御工作。轉過來,Arbitrary Memory Access是一個很重要的,今天你說AMA,可能很多人通過這樣一些方法去進行By Pass。

我們如何防止這種Arbitrary Memory是一個很重要的問題。在這里我簡單介紹一下我們的一個Memory Protection Keys的功能,我們每一個島下面都對應著一個Memory的權限是不是可以訪問,大家知道,每一個地址在PTE里面都會有相應的PTE的項。

其中我們在這個上面加的一些新的Bit,讓它提供一些信息。舉一個最簡單的例子,今天你有一個代碼,這個代碼你可能去想說,我這個Bit已經有了,我想去修改掉,今天你是隨便去做,沒有任何防御。

但是如果你有這樣一個功能,你會發現,每次當我需要對重要的數據讀寫的時候,我切換到一個正確的模式,這個時候這個重要的數據所在的Memory對應的那個訪問的權限是可讀可寫的,或者說你需要的可讀或者說可寫,這個根據你的上下文去解決。

當你不需要的時候你把它切換回來,那個Domain是不可以訪問的。當你再去讀寫那個Memory的時候,因為那個Memory已經是不可訪問的了,你會直接導致一個異常,就不工作了。這是一個非常簡單輕量級的功能,我們可以用它來做一些重要的代碼的沙箱或者怎么樣,可以很好的提供防御,這是一個很典型的例子。

在這里我稍微延展一下講,一樣還是Memory Domain的問題,你可以有很多不同的方案去解決。EPT是一個基本的概念,就是針對于普通的OS,根據EPT這個值,對本身進行各種Memory的權限設置。

傳統的環境下面實際上我們是沒有這樣一個功能的,但是你在EVT下面,你會發現已經在那里了,我們提供三個,Read、Write、Executable,如果大家關注最新微軟發布的一些功能,有一個功能應該是在Edge里面提供了這種解決方案,我想可能EPT是一個很好的去做這個工作的。

在這里著重介紹兩個我們做過的工作,其中一個叫VMFUNC,這是一個新的架構,你可以想像,在OS、Hypervisor里面,你試圖保護一個重要的數據的時候,我們還舉一個例子,比如相關的一些Bit數據。

有了這樣的數據,你怎么樣很好的配置權限?這個可能相同的一個,最后是相同的,在這種情況下,如果你能很好的做一套Design,當重要數據訪問的時候,你切換到該有的,當結束之后你切換回來,當發生的時候是讀一些重要數據的時候,

那個時候Memory對你的權限已經不允許它被讀寫了,這個時候會觸發一個EPT Violation,會進行安全檢查,看看誰訪問了什么數據,是不是一個合法的攻擊。

但是這條路實際上花費是比較高的,當你對一個Memory反復的進行讀寫的時候,就會導致EPT Violation,如果這并不是一個攻擊的話,實際上對性能還是有很大的影響。雖然我們有這樣的功能,盡可能的去減少,基本上如果你設計的好,不可能導致是一個攻擊的Case,可能很好的提高性能。

如果這樣的Case發生的時候,我們也希望降低整個系統性能上面的影響。我們推出了另一個功能是20的相量,也就是說,當你在Hypervisor配置了這個功能的時候,如果你提前在這個相量表里面填入了正確的數據,這個就會結合,你可以更好的在當中進行安全防御。

我想這實際上是一個很重要的功能,這兩個功能,我們觀察了一段時間,這種底層的技術會需要很長的時間被使用或者是最后普及下去,這是一個很長的過程。現在應該是慢慢有人開始做這方面的研究,去提供保護。

我們看過所有已有的,或者將要發生的,以及將來可能會發生的一些防御手段。我們可以看到,實際上Mitigation這個方面,可能會進入更多的CFI、CET這種功能,這是一個方向,我想可能需要有這樣一個方向,最后很好的解決很多漏洞攻擊的問題。

在另一個角度,Memory Domain沙箱是另外一個方向。所以怎么樣提供一個沙箱的Domain,這是盡可能降低Explore攻擊的一個防御手段。

今天我主要是跟大家分享一些我們做過的技術,包括分享一些我對這個防御手段發展的看法。最后非常感謝大家的時間,謝謝!

上一篇:Nicholas Dean Stephens:Automating Exploitation – Shellphish Style

下一篇:同濟大學朱西產:道路交通“零愿景”——汽車變革的動力