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