英特爾釋出新的技術規範去防禦 ROP 攻擊

Baiju Patel發表於2016-08-30

英特爾長期同軟體社群合作,並且在執行在現代電腦系統上的作業系統和軟體的加固保護方面取得了很大進展。因為這些防禦發揮了作用,攻擊者們開始尋找創造性的替代攻擊方法來繞過這些防禦。Return Oriented Programming (也稱為 ROP)和 Jump Oriented Programming(也稱為 JOP)就是兩種正在日益流行的這類技術。JOP 和 ROP 特別難以檢測或防禦,因為攻擊者使用了可執行記憶體中的已有程式碼,以一種創造性的方式修改了程式的行為。ROP/JOP 難以防禦的原因就在於攻擊者使用的是可執行記憶體中的已有程式碼。已經開發和部署了一些基於軟體的檢測和防禦技術,只是收效甚微。

英特爾和微軟已經意識到 ROP 攻擊的危害性,以及開發防禦 ROP/JOP 的方法的難度。總之,我們評估過超過十項的技術創新來解決這些最近 7 年內新興起的威脅,並且將範圍縮小到 x86/x64 的 CET 標準來更有效地處理 ROP 威脅。基於之前定義指令集擴充套件方面的經驗,以及對採用新 ISA 帶來的挑戰,我們把目標定在一個用於 ROP/JOP 防禦而設計的 ISA,並且它對於大部分設計良好的軟體是透明的,只需要很小的修改,甚至零修改;也允許需要修改的軟體取消該功能。我們也想確認這個解決方案並不只是適用於應用,還適用於作業系統核心,並且對大多數程式語言寫的軟體也有益。我們也想確保開啟了 CET 的軟體可以無修改地在老的平臺系統上執行(雖然沒有任何安全益處)。最終,也是最重要的,我們想去解決所有已有的 ROP/JOP 攻擊。

雖然我們在這裡包含一個 CET 的簡要描述,但是並不應該取代對完整標準的仔細閱讀。這裡我們強調 ISA 的兩個關鍵方面來幫助你入門,即 shadow stack 和 indirect branch tracking。CET 是這兩者的結合,而這兩者都是為了處理 ROP 和 JOP 而設計的。

除了用於控制轉移和資料的傳統棧,CET 定義了第二個棧(shadow stack),專門用於控制轉移操作。當 CET 啟用的時候,CALL 指令除了完成把返回地址壓入普通棧的正常行為(對於傳統的棧操作沒有改變)之外,還把返回地址壓入到 shadow stack 中。而返回指令(比如說,RET)會將 shadow stack 和傳統棧上的返回地址彈出,同時只有當兩個棧的返回地址相同時才會執行控制轉移為彈出來的地址。對於 shadow stack 的寫操作有諸多的限制,使得攻擊者透過修改頁表來修改兩個棧上的返回地址變得更加困難。因此限制 shadow stack 僅用於 call 和 return 操作就是為了只儲存返回地址。透過防禦非計劃中的或者惡意的切換 shadow stack 或者對於 shadow stack 的 overflow 和 underflow,shadow stack 的頁表保護機制也是設計用於保護 shadow stack 的完整性。

ENDBRANCH 指令是為了標記一個間接分支或者跳轉而新新增到 ISA 的指令。因此如果 ENDBRANCH 不是一個間接分支或者跳轉的目標,CPU 生成一個表明非計劃中的或者惡意的行為異常。為了後向相容和在軟體中提前啟用,這個特定的指令已經在當前的 Intel 處理器被實現為 NOP 指令(類似於一些 MPX 指令)。

正如我們過去有的,英特爾努力去減少安全特性所帶來效能影響,CET 也不例外,然而,請記住效能影響高度依賴於特定軟體和工作內容。

最後,我們想承認一點,這個標準受益於同微軟大量的合作。

相關文章