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