解析Unix下的緩沖區溢出防御體系 續
Unix下的緩沖區溢出防御分析如下:
一、數據段不可執行
kNoX
Linux內核補丁,功能:數據段的頁不可執行,撤銷共享內存,加強對execve系統調用的限制,對文件描述符0、1、2的特殊處理,/proc目錄的限制,FIFO限制,符號鏈接限制,該補丁只支2.2內核。
RSX
Linux內核模塊,數據段(stack、heap)不可執行。
Exec shield
Exec-shield從內核態顯示的跟蹤一個應用程序所包含的可執行映像的最大虛擬地址,動態的維護這個“可執行虛擬地址的最大值”稱為“可執行限界”,每次發生進程切換的時候調度進程就會用這個值更新代碼段描述符寫入GDT,exec-shield動態的跟蹤每個應用程序,所以每個程序運行時都有不同的“可執行限界”,因為可執行限界通常是個很低的虛擬地址,所以除了stack以外mmap()映射的區域以及malloc()分配的空間都處在可執行限界之上,因此都是不可執行的。當然Exec-shield無法防御跳轉到低16M地址空間和return-to-libc的攻擊,不過還是能阻止絕大多數把shellcode安置在數據段的攻擊。
二、增強的緩沖區溢出保護及內核MAC
OpenBSD security feature
OpenBSD和Hardened Gentoo、Adamantix、SELinux都是屬于默認安全等級非常高的操作系統。OpenBSD經過代碼審計,
漏洞非常少。同樣他具有很多安全特性:
使用strlcpy()和strlcat()函數替換原有的危險函數
內存保護:W^X、只讀數據段、頁保護、mmap()隨機映射、malloc()隨機映射、atexit()及stdio保護、
特權分離
特權回收
BSD chroot jail
其他的很多特性
其中W^X有不少內容:stack、mmap隨機映射,只讀GOT/PLT/.ctor/.dtor等。雖然理論上OpenBSD無法阻止所有類型的攻擊,
但已經阻斷了不少攻擊手法。
PaX
PaX是個非常BT的東西,好像天生就是緩沖區溢出的死對頭,他嚴厲的審視每一種攻擊方式,予以阻斷。
基于x86段式內存管理的數據段不可執行
基于頁式內存管理的數據段的頁不可執行
內核頁只讀{
-Const結構只讀
-系統調用表只讀
-局部段描述符表(IDT)只讀
-全局段描述符表(GDT)只讀
-數據頁只讀
-該特性不能與正常的LKM功能共存 }
完全的地址空間隨機映射{
-每個系統調用的內核棧隨機映射
-用戶棧隨機映射
-ELF可執行映像隨機映射
-Brk()分配的heap隨機映射
-Mmap()管理的heap隨機映射
-動態鏈接庫隨機映射 }
還有諸如把動態鏈接庫映射到0x00開始的低地址的其他特性
這里順便提一下Phrack58上Nergal寫過的<>,這篇大作里提到用偽造棧楨(Fakeframe)和dl-resolve()技術突破PaX若干保護的方法,這極有可能*nix應用層exploit技術中最高級的技術,Nergal解決了幾個問題:Stack/Heap/BSS不可執行、mmap隨機映射,顯然這種高級的技術仍然無法無條件的突破PaX,所以在一個運行完全版PaX的Linux上,你想發動緩沖區溢出可能是沒有機會的!!!
Grsecurity
Grsec內含PaX和Lids一樣grsec支持內核MAC(Madatory Access Control,強制訪問控制)
Unix下的緩沖區溢出防御體系的解析就向大家介紹完了,希望大家已經掌握。
【編輯推薦】