英特爾宣布其下一代處理器芯片中的 “漏洞破解” 功能
英特爾在其即將推出的處理器中增加了兩個新的漏洞檢測系統。
根據芯片巨頭最近更新的規范文件,這項新技術已經醞釀了至少四年,其中包含的“版本1.0”發布日期是2016年6月。
一段時間以來,英特爾的PR機器一直在該系統上興風作浪,簡稱CET,或稱控制流實施技術,現在它正式發布,供你查看。(警告:規范文檔長達358頁。)
據我們所知,第一波將包含這些新保護的英特爾處理器是尚未完全成熟的處理器,綽號為“老虎湖”,所以如果你是一名程序員,你還不能真正開始修改CET功能。
然而,CET提醒我們所有人,計算機安全是一場貓捉老鼠的游戲,其中一輪安全改進引發了網絡終端行為的改變,這反過來又導致了新一輪的防御浪潮,等等。
簡單說,鑒于我們正在總結一份358頁的文檔——CET的目標是通過更嚴格地控制程序的行為,使遠程代碼執行漏洞比現在更難利用。
準確說,CET的目標是密切關注程序的不良行為,以便更容易發現程序何時崩潰,從而阻止騙子們想出卑鄙的方法來破壞并控制有缺陷的程序。

利用內存錯誤
內存使用中的錯誤是導致安全漏洞的軟件缺陷的主要原因之一,在行業中稱為漏洞。
例如,如果我要求操作系統提供64字節的臨時存儲空間,例如生成并存儲一個加密密鑰,但卻意外地將128字節的隨機數據保存到其中,我將會踐踏內存中接下來的所有內容。
分配給自己使用的內存塊通俗地稱為緩沖區,因此在自己的緩沖區之外寫入他人的緩沖區稱為緩沖區溢出。
另一種數據經常被踐踏的方式就是所謂的免費后使用,我不小心把數據保存到一個內存塊中,我已經告訴操作系統我不再需要它了,因此它可能已經被分發到其他地方使用了。
即使我小心地寫我的64字節限制,并避免緩沖區溢出錯誤,我仍然寫在我不應該寫的地方。
因此,即使免費使用后的bug在技術上并不被稱為溢出,您也可以這樣認為,因為我正在向一個緩沖區寫入64字節,而目前我應該根本不寫入任何字節。
記憶安全
內存安全漏洞,通常被稱為內存安全漏洞,是一種明顯的網絡安全風險,因為它們意味著攻擊者可能會巧妙地修改程序中其他部分認為可以信任的數據,從而在以后依賴這些數據。
這種記憶錯誤造成的危險當然取決于被踐踏的是什么。
如果被覆蓋的內存字節包含一個錯誤信息,只有在非常不尋常的情況下才會被打印出來,那么這個錯誤可能幾年都不會被注意到,即使它出現了,唯一不好的副作用可能是導致一個錯誤沒有被報告(或者被不可理解地報告)。
但是,如果被踐踏的內存包含任何數據,而軟件后來依賴這些數據來控制程序中的執行流程,那么攻擊者很可能會找到一種方法來濫用這個bug來植入惡意軟件。
防御內存缺陷
有兩種主要的方法可以利用內存覆蓋漏洞來轉移執行。
一種方法是修改所謂的堆棧,即CPU用來跟蹤軟件中子程序調用的內存塊。
當您調用一個程序子例程時,例如getch(),它通常從鍵盤讀入下一個輸入字符,處理器跟蹤您調用它的位置,以便子例程可以簡單地運行RETurn指令,返回到它之前的位置,并返回到call之后的下一個指令。
所以,如果你能弄亂堆棧,你通常可以弄亂下一個RET指令,這樣程序就不會回到它原來的地方,而是進入你選擇的未授權區域。
另一種bug涉及修改JMP或CALL指令使用的內存位置,告訴它下一步要去哪里——當程序從子程序返回時,不是轉移它,而是當它試圖調用或跳轉到一個子程序時轉移它。
各種各樣的保護措施已經存在,尤其是DEP和ASLR。
DEP代表數據執行預防,它假設當攻擊者修改一個返回地址、一個呼叫或JMP目的地時,他們需要將執行轉移到他們自己提供的一大塊代碼(稱為外殼代碼),通常是他們首先發送給出錯程序的數據的一部分。
但是,現代的中央處理器可以將數據緩沖區標記為“不執行”,這就阻止了作為數據提供的外殼代碼的運行,即使攻擊者設法對其進行RET、JMP或CALL。
Crooks對DEP的回應是使用兩級外殼代碼,其中第一部分依賴于將已經加載到內存中的代碼片段串在一起,例如作為運行程序的一部分或它使用的一個動態鏈接庫文件。
這些“已經可執行”的片段,行話稱為小工具,不需要做太多——通常,它們只是告訴操作系統將剩余外殼代碼所在的緩沖區從“不允許執行”切換到“允許這些數據作為代碼運行”。
然后,簡單地跳到外殼代碼的第二部分就完成了接管。
(請注意,這些小工具從來沒有打算以這種方式使用——騙子們通常會在系統動態鏈接庫中進行梳理,尋找恰好能夠反編譯成有用代碼片段(如“添加這個”或“比較那個”)的字節序列,即使這些小工具本身也是其他指令序列的一部分。)
當然,為了誤導正在運行的程序,使其將控制權轉移給“已經可執行”的小工具,攻擊者需要知道這些小工具的字節加載到什么內存地址。
ASLR,地址空間布局隨機化的縮寫,使得這變得更加困難,因為視窗和所有其他主流操作系統,現在每次重啟時都在不同的位置加載程序。
騙子可以很容易地猜出你有哪個視窗版本,但是他們不能很容易地猜出哪些小工具在你電腦的什么內存地址。
ASLR仍然不完美
ASLR的一個問題是,如果攻擊者能夠以某種方式找出你的計算機上正在使用的內存地址,即使他們是隨機選擇的,他們也可以通過調整他們利用的所有小工具地址來自動修改他們的攻擊。
不幸的是,關于系統內存分配的信息有時會由于其他無害的缺陷而泄露,這些缺陷被稱為信息泄露缺陷。
例如,有些程序編寫的日志文件在您需要支持時會很有用,意外地包含有用但應該是機密的數據,例如在地址0x7DEE找到的系統版本數據或在0x7EE3加載的內核動態鏈接庫。
換句話說,騙子們不應該為程序X找出的內存布局信息可能已經被程序Y脫口而出了。
進入CET
英特爾的新硬件解決方案旨在超越ASLR,采取兩種形式,稱為影子堆棧和間接分支跟蹤(IBT)。
實現很復雜,但概念很簡單:
影子堆棧將保存子程序可能返回的每個內存地址的兩個副本。
其中一個將被存儲在原來的位置,仍然容易受到緩沖區溢出的影響。另一個返回地址將保存在影子堆棧中,緩沖區溢出無法(或者不應該能夠)到達它。每當子程序試圖返回時,兩個棧將被比較。如果它們不同,那么常規堆棧上的返回地址一定是被錯誤地修改了。理論上,這將檢測和防止意外崩潰和蓄意利用企圖。IBT系統將引入一種新的機器代碼指令,稱為ENDBRANCH。
想要利用IBT的程序可以在允許JMP或CALL到達的每一點將這些指令編譯成它們的代碼——如果你愿意,創建合法分支目標的允許列表。任何JMP或CALL,如果被修改為在其他地方結束,比如在攻擊者選擇的“代碼小工具”上,都可以被檢測和阻止。因此,騙子們應該會發現,要找到他們想要的代碼工具是非常困難和不可能的。
如果你想知道IBT將如何以向后兼容的方式工作,英特爾為ENDBRANCH精心選擇了一個指令字節碼,它作為NOP在舊的處理器上執行,簡稱為“無操作”(即除了消耗少量的時間和內存之外什么也不做的指令)。
因此,在未來一年左右的時間里,為支持CET的處理器重新編譯的軟件仍然可以在舊電腦上正常運行。
這是開發的終結嗎?
答案肯定不是!
正如英特爾自己的新聞稿所指出的,“沒有任何產品或組件是絕對安全的。您的成本和結果可能會有所不同。”
話雖如此,我們懷疑CET總的來說會讓騙子們的日子更不好過,所以我們期待著它能更廣泛地普及。