操作系統(tǒng)/虛擬化安全知識域:系統(tǒng)強化之信息隱藏
大多數(shù)當(dāng)前操作系統(tǒng)的主要防線之一是隱藏攻擊者可能感興趣的任何內(nèi)容。具體來說,通過隨機化所有相關(guān)內(nèi)存區(qū)域(在代碼、堆、全局?jǐn)?shù)據(jù)和堆棧中)的位置,攻擊者將不知道在哪里轉(zhuǎn)移控制流,也無法發(fā)現(xiàn)哪個地址包含敏感數(shù)據(jù)等。術(shù)語地址空間布局隨機化(ASLR)是在PaX安全補丁發(fā)布時創(chuàng)造的,該補丁在2001年為Linux內(nèi)核實現(xiàn)了這種隨機化[72]—另見軟件安全CyBOK知識領(lǐng)域的討論。很快,類似的努力出現(xiàn)在其他操作系統(tǒng)中,第一個默認(rèn)啟用ASLR的主流操作系統(tǒng)是2003年的OpenBSD和2005年的Linux。Windows和MacOS在2007年緊隨其后。然而,這些早期的實現(xiàn)只是隨機化了用戶程序中的地址空間,隨機化直到大約十年才到達(dá)主要操作系統(tǒng)的內(nèi)核,以內(nèi)核ASLR(KASLR)的名義。在用戶程序中默認(rèn)啟用后。
這想法之卡斯?fàn)柺呛唵蔚抢锸嵌喾瞧椒苍O(shè)計決定自做。為實例如何隨機是隨機?在特定什么部分之這地址的我們隨機化?說你Linux目錄內(nèi)核有一地址范圍之1國標(biāo)(=230)為這法典和這法典應(yīng)該是一致自2兆字節(jié)(=221)邊界。這數(shù)之位可用為隨機化(的熵)是3021=9位。在其他的話我們需要在最512猜測自找到這內(nèi)核代碼。如果攻擊找到a脆弱性自轉(zhuǎn)移這內(nèi)核的控制流自a猜到地址來自a用戶空間程序和每錯猜導(dǎo)致自a系統(tǒng)崩潰它愿意足以滿足有用戶空間訪問自a少百機器自獲取它右在最小一次跟高概率(雖然多機器將崩潰在這過程)。
另一個重要的決定是隨機化什么。如今,大多數(shù)實現(xiàn)都采用粗粒度隨機化:它們隨機化代碼、堆或堆棧的基本位置,但在這些區(qū)域中,每個元素都與基本元素處于固定偏移量。這很簡單,而且非常快。然而,一旦攻擊者設(shè)法通過信息泄漏獲得哪怕一個代碼指針,他們就會知道每條指令的地址。對于堆、堆棧等,比照也是如此。毫不奇怪,這些信息泄漏是當(dāng)今攻擊者高度重視的目標(biāo)。
更細(xì)粒度的隨機化也是可能的。例如,可以在頁面級別或功能級別進(jìn)行隨機化。如果我們在內(nèi)存區(qū)域中打亂函數(shù)的順序,即使知道內(nèi)核代碼的基礎(chǔ)對于攻擊者來說也是不夠的。事實上,我們可以更細(xì)粒度地洗牌基本塊、指令(可能帶有從不執(zhí)行或無效的垃圾指令)甚至寄存器分配。許多細(xì)粒度隨機化技術(shù)都是以空間和時間開銷為代價的,例如,由于局部性和碎片化減少。
除了代碼之外,還可以對數(shù)據(jù)進(jìn)行細(xì)粒度隨機化。例如,研究表明,堆棧上的堆分配、全局變量甚至變量都可以分散在內(nèi)存中。當(dāng)然,這樣做會產(chǎn)生性能和內(nèi)存方面的成本。
考慮到KASLR,尤其是粗粒度的KASLR,作為我們抵御內(nèi)存錯誤攻擊的第一道防線,這不會離目標(biāo)太遠(yuǎn)。不幸的是,它也是一個非常薄弱的防御。許多出版物表明,通過從內(nèi)存、側(cè)信道等泄漏數(shù)據(jù)和/或代碼指針,KASLR可以相當(dāng)容易地被破解。