微架構安全(microarchitectural security)
指令集架構(ISA)是一份乾淨的契約:它承諾每條指令算出什麼,並刻意對它跑多快、牽涉哪些隱藏機制隻字不提(見 instruction-set-architecture)。底下,微架構——快取、管線、分支預測器、亂序引擎——是一座契約所隱藏、不停運轉的最佳化工廠。微架構安全研究的是:即使每條指令的官方結果都正確,那套隱藏機制如何透過它的物理副作用——時間、功耗與共享的快取狀態——洩漏秘密。
核心洞見是:ISA 的抽象是一種「省略式的謊言」,而攻擊正是利用它所略去的東西。兩個共享快取的程式會在彼此的時間裡留下痕跡:若一次依秘密而定的記憶體存取載入了某條快取列,稍後對那條列的存取就明顯更快,而能對記憶體計時的攻擊者就能讀出它本未被給予的秘密的某個位元。推測與亂序執行讓情況糟得多:處理器靠猜測一路向前衝,碰到它不該碰的資料,雖然它把錯誤路徑的結果從架構狀態丟棄,但微架構痕跡——一條被暖過的快取列——仍留著,且可被量測。Spectre 與 Meltdown 就是著名的例子(見 spectre-vulnerability 與 meltdown-vulnerability)。
誠實而令人不安的教訓是:效能與安全在此往往直接拉扯。正是那些讓現代 CPU 快的特性——快取、預測、推測、執行緒間共享資源——造就了這些通道。你無法直接把它們關掉而不放棄大半速度,而許多修補(清空預測器、切分快取、加入柵欄)都耗費實在的效能。這是一個年輕的領域,建立在一個發人深省的體認上:其中有些洩漏並非可以打補丁打掉的臭蟲,而是電腦被造得這麼快所帶來的後果,只能緩解、無法徹底根治。
兩台虛擬機共享一顆實體 CPU 及其快取。一台跑著受害者,存取一個依秘密而定的位址;另一台跑著攻擊者,反覆對自己的存取計時。每條指令的官方答案都正確、兩台 VM 也「隔離」著——然而靠觀察自己哪些快取列變快了,攻擊者純粹從時間就重建出受害者的秘密。沒有任何指令結果被洩漏;是微架構洩漏了。
結果正確、秘密卻外洩:ISA 契約被遵守了,但微架構的時間把故事說了出去。
這些不是受害者程式碼裡的軟體臭蟲——程式可以完全正確卻照樣洩漏。微架構安全之所以困難,正因為洩漏住在任何程式設計師平常推理層次的底下。