操作系統/虛擬化安全知識域:保護環以及低端設備與物聯網
保護環
Multics引入的最具革命性的想法之一是保護環的概念——一種特權的分層,其中內環(環0)是最有特權的,并且外環的特權最低[41]。因此,不受信任的用戶進程在外環中執行,而直接與硬件交互的受信任和特權內核在環0中執行,其他環可用于或多或少特權的系統進程。
保護環通常采用硬件支持,這是當今大多數通用處理器提供的功能,盡管保護環的數量可能有所不同。例如,霍尼韋爾6180支持多達八個環,英特爾的x86四個,ARMv7三個(加上TrustZone的額外一個)和PowerPC兩個。但是,正如我們將看到的,故事變得有點混亂,因為一些現代處理器也引入了更多不同的處理器模式。現在,我們只是觀察到大多數常規操作系統只使用兩個環:一個用于操作系統,一個用于用戶進程。
每當權限較低的代碼需要需要更多權限的函數時,它就會“調用”下環以請求將此函數作為服務執行。因此,只有受信任的特權代碼才能執行最敏感的指令或操作最敏感的數據。除非具有較少權限的進程誘騙更多特權的代碼執行它不應該做的事情(作為困惑的副手),否則環會提供強大的保護。Multics的最初想法是,環之間的轉換將通過實施嚴格控制和調解的特殊呼叫門進行。例如,外環中的代碼不能只調用內環中的任何指令,而只能調用第一個調用的預定義入口點經過審查,看看它及其參數是否不違反任何安全策略。
雖然像x86這樣的處理器仍然支持呼叫門,但很少有操作系統使用它們,因為它們相對較慢。相反,用戶進程通過執行操作系統處理的軟件中斷(“陷阱”)或更常見的是通過特殊的高效操作來過渡到操作系統內核(“系統調用”)。系統調用指令(名稱如SYSCALL,SYSENTER,SVC,SCALL等,具體取決于體系結構)。許多操作系統將系統調用的參數放在一組預定義的寄存器中。與調用門一樣,陷阱和系統調用指令也確保在操作系統中的預定義地址繼續執行,代碼在其中檢查參數,然后調用相應的系統調用函數。
除了用戶進程調用操作系統外,大多數操作系統還允許內核調用用戶進程。例如,基于UNIX的系統支持操作系統用來通知用戶程序“有趣的事情”的信號:錯誤,過期的計時器,中斷,來自另一個的消息工藝等如果用戶進程為信號注冊了一個處理程序,操作系統將停止進程的當前執行,將其所有處理器狀態存儲在進程堆棧上,形成所謂的信號。幀,并在信號處理程序上繼續執行。當信號處理程序返回時,進程執行sigreturn系統調用,使操作系統接管,還原堆棧上的處理器狀態并繼續執行進程。
安全域(如操作系統內核和用戶空間進程)之間的邊界是檢查系統調用本身及其安全性參數的好地方違反。例如,在基于功能的操作系統中,內核將驗證功能,而在MINIX3等操作系統中,只允許特定進程進行特定調用,因此任何嘗試撥打不在預先批準列表中的呼叫將被標記為違規。同樣,基于Windows和UNIX的操作系統必須檢查許多系統調用的參數。例如,考慮常見的讀寫系統調用,通過這些調用,用戶請求將數據從文件或套接字讀取到緩沖區中,或者從緩沖區分別到文件或套接字中。在執行此操作之前,操作系統應檢查要寫入或讀取的內存是否實際歸進程所有。
執行系統調用后,操作系統將控制權返回給進程。在這里,操作系統還必須注意不要返回危及系統安全性的結果。例如,如果一個進程使用mmap系統調用來請求操作系統將更多內存映射到其地址空間,則操作系統應確保它返回的內存頁不再包含來自另一個進程的敏感數據(例如,首先將每個字節初始化為零).
零初始化問題可能非常微妙。例如,編譯器經常在數據結構中引入填充字節以對齊。由于這些填充字節在編程語言級別根本不可見,因此編譯器可能認為沒有理由將它們初始化為零。但是,當操作系統返回此類數據結構以響應系統調用并且單元化填充包含來自內核或其他進程的敏感數據時,就會發生安全違規。
順便說一下,即使是我們前面提到的UNIX系統中的信令子系統也是一個有趣的安全案例。回想一下,sigreturn采用堆棧上的任何處理器狀態并恢復該狀態。現在假設攻擊者能夠破壞進程的堆棧并在堆棧上存儲虛假信號幀。如果攻擊者也能夠觸發sigreturn,他們可以一舉設置整個處理器狀態(包括所有寄存器值)。這樣做在熟練的攻擊者手中提供了一個強大的基元,被稱為Sigreturn導向編程(SROP)。
如前所述,如今有關保護環的情況稍微令人困惑,因為最近的CPU為虛擬機管理程序提供了虛擬化指令,允許它們控制硬件在環0處訪問。為此,他們添加了乍一看看起來像底部額外戒指的東西。由于在x86處理器上,術語“ring0”已成為“操作系統內核”的同義詞(以及“環”與“用戶進程”的同義詞),因此這種新的虛擬機管理程序環通常稱為“ring–1”。它還指示其各自虛擬機中的操作系統可以繼續在本地執行環0指令。然而,嚴格來說,它的目的與原始戒指大不相同,雖然環-1這個名字已經卡住了,但它可能有點像用詞不當。
為了完整起見,我們應該提到事情可能會變得更加復雜,因為一些現代處理器仍然具有其他模式。例如,x86提供所謂的系統管理模式(SMM)。當系統啟動時,固件控制硬件,并為操作系統接管系統做好準備。但是,啟用SMM后,固件會在向CPU發送特定中斷時重新獲得控制權。例如,固件可以指示每當按下電源按鈕時它都希望接收中斷。在這種情況下,常規執行將停止,固件將接管。例如,它可以保存處理器狀態,執行任何需要執行的操作,然后恢復操作系統以進行有序關閉。在某種程度上,SMM有時被視為比其他環(環-2)低的水平。
最后,英特爾甚至以英特爾管理引擎(ME)的形式增加了環-3。ME是一個完全自主的系統,現在幾乎存在于英特爾的所有芯片組中;它在單獨的微處理器上運行一個秘密且完全獨立的固件,并且始終處于活動狀態:在啟動過程中,當機器運行時,當它處于睡眠狀態時,即使斷電。只要計算機連接到電源,就可以通過網絡與ME通信,例如安裝更新。雖然非常強大,但它的功能在很大程度上是未知的,除了它運行自己的小型操作系統11,研究人員發現其中包含漏洞。主CPU附帶的附加處理器(無論是ME還是Apple的T2和Google的Titan芯片等相關處理器)都提出了一個有趣的一點:在主CPU上運行的操作系統是否能夠滿足當今的安全要求?至少,這種趨勢似乎通過專用系統(硬件和軟件)來增強它的安全性。
低端設備和物聯網
上述許多功能都可以在大多數通用處理器體系結構中找到。然而,在物聯網或一般的嵌入式系統中不一定如此,并且通常使用定制的操作系統。簡單的微控制器通常沒有MMU,有時甚至沒有MPU、保護環或我們在常見操作系統中依賴的任何高級功能。系統通常很小(減少攻擊面),應用程序受信任(并可能經過驗證)。然而,設備的嵌入式性質使得很難檢查甚至測試其安全性,并且無論它們在安全敏感活動中發揮作用的何處,安全性隔離/遏制和調解的手段應由環境在外部強制執行。更廣泛的物聯網問題在網絡物理系統安全CyBOK知識領域得到解決。