緩解措施

應用層安全防護

1、Aslr(地址空間佈局隨機化)隨機防止數據區域的地址空間來防止攻擊者跳轉到內存的特定位置。在windows上ASLR主要包括堆棧隨機化、PEB與TEB隨機化、映像隨機化。Linux Alsr主要包括棧地址隨機化,LIBS/MMAP隨機化,EXEC隨機化,BRK隨機化、VDSO隨機化。在沒有ASLR的情況下讓程序跳轉到一個已存在的系統函數的漏洞利用方式被稱爲ret2libc

LIBS/MMAP隨機化:程序每次執行動態庫都被加載到不同的內存位置

EXEC隨機化:程序每次執行都將加載到不同的內存位置

Brk隨機化:brk用來分配堆空間,當brk aslr關閉時,start_brk和brk都是指向bss段的尾部的;當brk ALSR開啓的時候,初始位置變爲bss段尾部加上一個不確定的偏移地址

VDSO隨機化: VDSO(虛擬動態共享庫)將內核的調用映射到用戶態的地址空間,使得調用開銷更小,路徑更好 相當於共享庫地址隨機化

Linux中的ASLR的等級:在linux系統中ASLR被分爲0,1,2三個等級,可以通過sudo bash -c "echo 2 > /proc/sys/kernel/randomize_va_space"設置。

0:沒有隨機化。即關閉ASLR。

1:保留的隨機化。共享庫、棧、mmap()分配的內存空間以及VDSO將被隨機化。

2:完全的隨機化。在1的基礎上,通過 brk()分配的內存空間也將被隨機化

2、NX(內存不可執行)類似於windows中DEP

 

編譯器安全防護

1、Built as PIE:    就是前面說的EXEC的隨機化,實際上更準確的說法是PIE(Position Independent Executables,位置無關可執行文件)

2、Built as RELRO:RELRO(RELocation Read-Only,只讀重定位)讓加載器將重定位表中加載時解析的符號標記爲只讀,這減少了GOT覆寫攻擊的面積。RELRO可以分爲Partial RELRO(部分RELRO)和Full RELRO(完整RELRO)。開啓Partial RELRO的話GOT表是可寫的;開啓FULL RELRO的話GOT表是隻讀的

3、Stack Canary(Protector):類似於GS,在棧中加入一段驗證,在函數返回時對這段cookie值進行驗證,

 

內核安全防護:

  1. KPTI:(Kernel PageTable Isolation,內核頁表隔離),進程地址空間被分成了內核地址空間和用戶地址空間,內核地址空間映射到了整個物理地址空間,而用戶地址空間只能映射到指定的物理地址空間,內核地址空間和用戶地址空間共用一個頁全局目錄表。爲了徹底防止用戶程序獲取內核數據,可以領內核地址空間和用戶地址空間使用兩組頁表集
  2. KASLR:K指kernel,也就是內核地址,也就是內核地址空間佈局隨機化
  3. SMAP/SMEP:SMAP(Supervisor Mode Access Prevention,管理模式訪問保護)和SMEP(Supervisor Mode Execution Prevention,管理模式執行保護)的作用分別是禁止內核訪問用戶空間的數據和禁止內核執行用戶空間的代碼。arm裏面叫PXN(Privilege Execute Never)和PAN(Privileged Access Never)。SMEP類似於前面說的NX,不過一個是在內核態中,一個是在用戶態中。和NX一樣SMAP/SMEP需要處理器支持,可以通過cat /proc/cpuinfo查看,在內核命令行中添加nosmap和nosmep禁用。windows系統從win8開始啓用SMEP,windows內核枚舉哪些處理器的特性可用,當它看到處理器支持SMEP時通過在CR4寄存器中設置適當的位來表示應該強制執行SMEP,可以通過ROP或者jmp到一個RWX的內核地址繞過。linux內核從3.0開始支持SMEP,3.7開始支持SMAP。

在沒有SMAP/SMEP的情況下把內核指針重定向到用戶空間的漏洞利用方式被稱爲ret2usr。physmap是內核管理的一塊非常大的連續的虛擬內存空間,爲了提高效率,該空間地址和RAM地址直接映射。RAM相對physmap要小得多,導致了任何一個RAM地址都可以在physmap中找到其對應的虛擬內存地址。另一方面,我們知道用戶空間的虛擬內存也會映射到RAM。這就存在兩個虛擬內存地址(一個在physmap地址,一個在用戶空間地址)映射到同一個RAM地址的情況。也就是說,我們在用戶空間裏創建的數據,代碼很有可能映射到physmap空間。基於這個理論在用戶空間用mmap()把提權代碼映射到內存,然後再在physmap裏找到其對應的副本,修改EIP跳到副本執行就可以了。因爲physmap本身就是在內核空間裏,所以SMAP/SMEP都不會發揮作用。這種漏洞利用方式叫ret2dir

  1. Stack canary(protector):內核地址隨機化,內核隨機化選項
  2. Address protection:由於內核空間:由於內核空間和用戶空間共享虛擬內存地址,因此需要防止用戶空間mmap的內存從0開始,從而緩解NULL解引用攻擊。windows系統從win8開始禁止在零頁分配內存。

 

系統調用API函數,棧空間的分配情況,開闢棧空間,然後爲eax分配一個系統調用的API的序號,然後執行int 0x2e指令自陷進入內核態

Int中斷指令,進入內核執行真正的代碼

SafeSEH 需要 OS 和 Compiler 的雙重支持,該選項會將所有異常處理函數地址提取出來,編入 SEH 表中,並將這張表放到程序的映像裏。異常調用時,就與這張預先存好的表中的地址進行校驗。

 

繞過 SafeSEH

方法一:覆蓋函數返回地址。若攻擊對象啓用了 SafeSEH 但是 沒有啓用 GS 或者存在未受 GS 保護的函數,則可用這個方法。

方法二:攻擊虛函數表來繞過 SafeSEH。

方法三:將 shellcode 部署在堆中以繞過 SafeSEH。

方法三:利用未啓用 SafeSEH 的模塊繞過 SafeSEH。(針對上述的 RtlIsValidHandler() 函數的第二種放行可能)

方法四:DEP 關閉時,可以利用加載模塊之外的指令作爲跳板

 

SEHOP的全稱是Structured Exception Handler Overwrite Protection(結構化異常處理覆蓋保護),SEH攻擊是指通過棧溢出或者其他漏洞,使用精心構造的數據覆蓋結構化異常處理鏈表上面的某個節點或者多個節點,從而控制EIP(控制程序執行流程)。而SEHOP則是是微軟針對這種攻擊提出的一種安全防護方案。

現在看看SEHOP的新穎之處:程序中的各S.E.H函數是以單鏈表的形式存放在棧中的,而這個鏈表的末端是程序的默認異常處理,它負責處理前面S.E.H函數都不能處理的異常

SEHOP的核心任務就是檢查這條S.E.H鏈的完整性,在程序轉入異常處理前SEHOP會檢查S.E.H鏈上最後一個異常處理函數是否爲系統固定的終極異常處理函數。如果是,則說明S.E.H鏈沒有被破壞,程序可以去執行當前的異常處理函數;如果檢測到最後一個異常處理函數不是終極BOSS,則說明S.E.H鏈被破壞,可能發生了S.E.H覆蓋攻擊,程序將不會去執行當前的異常處理函數。

 

繞過SEHOP

  1. 覆蓋函數返回地址。若攻擊對象啓用了 SafeSEH 但是 沒有啓用 GS 或者存在未受 GS 保護的函數,則可用這個方法。
  2. 攻擊虛函數表來繞過 SafeSEH。
  3. 利用未啓用 SafeSEH 的模塊繞過 SafeSEH。(針對上述的 RtlIsValidHandler() 函數的第二種放行可能)
  4. 僞造SHE鏈表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章