軟件防護擴展指令( Software Guard Extensions:SGX )本應隱藏數據,但“質數+探查”的攻擊方法搞定了它。
1月,英特爾SGX輸入輸出防護被曝存在可能缺陷,現在,應受保護的SGX飛地上又出現了惡意軟件。
奧地利格拉茲科技大學的研究人員寫了概念驗證程序(PoC),不用SGX保護系統,卻用來隱藏惡意軟件,并在5分鐘之內,就從SGX管轄范圍內獲取到了RSA密鑰。
設計SGX就是為了避免出現這種情況。SGX是隔離機制,本應防止代碼和數據不被窺探——惡意特權用戶也不行。研究人員所用邊信道攻擊被他們稱為“質數+探查(Prime+Probe)”,對原生英特爾環境或Docker容器都有效。
該PoC包含復雜的3步過程,專門用于在別人領地恢復出RSA密鑰:首先,發現受害者的高速緩存組地址;然后,在受害者觸發RSA簽名計算時窺探緩存;最后,抽取密鑰。
論文中,研究人員寫道:
我們開發了目前為止英特爾CPU上最精確的時序測量技術,專為英特爾CPU硬件量身定制。我們結合了DRAM和緩存邊信道,打造出無需猜測頁面大小便可恢復物理地址位元的尖端方法。OpenVPN等工具采用mbedTLS協議,其中的RSA實現,就是我們的攻擊目標。盡管有使用定時乘法原語的邊信道攻擊防護,我們的攻擊還是成功了。單次 Prime+Probe 追蹤,就能抽取4096比特RSA私鑰的96%,僅11次追蹤,就可在5分鐘之內完全恢復出密鑰。
該攻擊甚至能跨不同Docker容器進行,因為Docker引擎調用的是同樣的SGX驅動。
Docker容器共享相同的SGX驅動模塊
定時:加密邊信道攻擊需要高分辨率定時器,也就是SGX中被禁止的東西。但研究人員梳理了英特爾的規范,將目光鎖定在inc和add指令上——因為這倆指令有1個周期的延遲,且在寄存器作為操作數的時候有0.25周期/指令的吞吐量。
為模擬遭禁定時器,研究人員使用了如下x86指令:
mov &counter , %rcx
1: inc %rax
mov %rax , (%rex)
jmp lb
“回收集”生成:該步驟用于發現映射到同個高速緩存組的虛擬地址:我們順序掃描內存,搜索可致行沖突的鄰近地址對。由于SGX內存是連續分配的,我們可在虛擬地址中進行該項掃描。
以上兩步完成后,便可開始監視脆弱的高速緩存組,尋找RSA密鑰計算的特征簽名。
這部分攻擊必須離線完成。也就是說,與收集數據的緩存監視過程是分開的。因為數據中包含了太多噪音(來自定時錯誤、上下文切換、非RSA密鑰活動、電源管理引發的CPU時序改變等)。
密鑰恢復分3步完成。首先,預處理跟蹤。其次,每次跟蹤抽取出部分密鑰。最后,融合各部分密鑰恢復出私鑰。
在帶SGX功能,安裝 Ubuntu 16.10 的聯想 ThinkPad T460s 上,他們發現:
340次嘗試后,他們的惡意軟件從2048個可用高速緩存組中找出了可利用的那個;從脆弱高速緩存組捕獲一個密鑰追蹤平均耗時72秒;一次高速緩存追蹤,可獲得4096比特RSA密鑰的96%,11次追蹤,即可恢復出完整RSA密鑰。研究人員稱,該攻擊可被阻止,但漏洞修復應來自英特爾,因為對操作系統的修改會有弱化SGX模式的風險。