DEP,ASLR,更強的Selinux,內核代碼段只讀,PXNlinux
DEP,ASLR,Selinux等技術在PC時代就已經比較成熟了。內核代碼段只讀也是能夠經過修改ptmx_fops指針表等方案來繞過shell
一、DEP(windows)、NX(linux)堆棧代碼執行保護
繞過方法:
使用 (ROP)Return-Oriented Programming.繞過 (如ret2data、ret2libc、ret2strcpy、ret2gets、ret2syscall)
gadget:virtualprotect、jmp esp、mona.py
二、ASLR 地址隨機化
繞過方法:
一、直接RET替換(通常進程也會加載沒有隨機化的模塊,能夠找到JMP ESP指令的跳板直接調用)
二、替換EIP一部分(找到沒有隨機化的模塊而後使用利息泄漏肯定EIP的位置,再算出模塊的基地址,最後算出要跳的函數地址)
三、NOP噴射(DEP沒開的狀況下,建立一大塊NOP+shellcode,Heap Spray是在shellcode的前面加上大量的slide code(滑板指令),組成一個注入代碼段。 而後向系統申請大量內存,而且反覆用注入代碼段來填充。這樣就使得進程的地址空間被大量的注入代碼所佔據。而後結合其餘的漏洞攻擊技術控制程序 流 ,使得程序執行到堆上,最終將致使shellcode的執行。
統slide code(滑板指令)通常是NOP指令,譬如0x0C(0x0C0C表明的x86指令是OR AL 0x0C),0x0D等等,不影響程序的執行的。)
四、暴力(若是漏洞不會形成程序崩潰,能夠暴力測試256種模塊基地址來測試,只到有知足的)最LOWwindows
三、Self-Protection Project(KSPP)安全
四、內核代碼段和常量數據只讀保護
mark_rodata_ro
寫保護的實現是經過set_memory_ro函數內部調用實現set_page_attributes來實現的。
攻擊方法:數據結構
針對這種頁保護的防護,較經常使用的方法是,從物理頁表中取相應的頁表條目,找到頁表描述符,修改相應的權限。咱們能夠經過利用內核中現成的代碼來完成 頁表屬性的修改。咱們發現能夠經過內核導出函數set_memory_rw來打開內核頁表的讀寫權限。set_memory_rw函數的定義以下:ide
int set_memory_rw(unsigned long virt, int numpages)函數
五、PXN( PrivilegedExecute-Never ) 「特權執行從不」
PXN的繞過方法:工具
利用ROP技術繞過PXN
ROP主要原理是經過控制內存中的一段數據,經過控制數據來控制代碼執行流,如組合執行內核中特定的代碼片斷,從而達到修改內核中的關鍵數據,達到提 權限的目的。這種攻擊方式是須要進行不一樣機型中查找到多段代碼片斷,若是須要root的機型較多,則須要攻擊者投入較多精力去作適配。
利用RET2DIR技術
利用原理是,Linux內核在設計的時候,在用戶空間映射內存的時候,爲了提升內存的操做效率,內核也相應地在內核的低端內存區地址映射一段影子內存。佈局
者利用該缺陷,將用戶空間的攻擊代碼映射到內核的低端內存可執行區或者將特定數據進行噴射到內核的低端內存,進行內存佈局,而後利用發現的漏洞, 讓內核執行攻擊代碼,從而達到提權的做用。這項技術在32位arm設備上有65%以上的成功率,而在64位arm中有96%的成功率。
與ROP不一樣,RET2DIR這項技術不須要對內核代碼進行重利用和組合,就能夠直接將攻擊代碼或數據映射到內核的低端內存。
因爲64位ARM內核的設備都已經開啓了PXN防禦,這項技術成爲通用root工具繞過64位ARM內核的PXN必備技術。在KingRoot的cve-2015-3636和cve-2016-1805 漏洞利用中都使用到了該技術繞過PXN防禦。測試
經過內核特定函數完成PXN繞過。
該技術在2016年MOSEC大會上由360團隊公開,該技術巧妙地利用kernel_setsockopt函數的特性,經過控制r0, 讓內核執行set_fs(KERNEL_DS),實現任意地址 讀寫權限的效果。
六、KNOX繞過
三星KNOX裏對內核保護主要由TIMA完成。TIMA 使用 ARM TrustZone硬件,持續的監控linux內核的完整性。
Linux內核採用的CRC完整性認證機制不一樣,TIMA採用了數字證書籤名技術對加載的內核模塊進行合法性驗證,以確保每一個加載的模塊都是合法的。
在2014年SyScan360大會上360團隊的陳章琪和申迪介紹了TIMA LKM驗證機制的繞過方法。他們的思路是經過Patch內核的代碼,繞過TIMA驗證。具體的攻擊方法以下:
if(memcmp(hdr->e_ident, ELFMAG, SELFMAG) != 0 || hdr->e_type != ET_REL || elf_check_arch(hdr) || hdr->e_shentsize != sizeof(Elf_shdr)){ err = -ENOEXEC; goto free_hdr; } if(len < hdr->e_snoff + hdr->e_shnum * sizeof(Elf_shdr)){ err = -ENOEXEC; goto free_hdr; } #ifdef TIMA_LKM_AUTH_ENABLED if(lkmauth_bootmode != BOOTMODE_RECOVERY && lkmauth(hdr, len) != RET_LKMAUTH_SUSSESS){ pr_err ("TIMA:lkmauth--unable to load kernel module;module len is %1u,\n",len); err = -ENOEXEC; goto free_hdr; } #endif info->hdr = hdr; info->len = len; return 0;
X2.0,TIMA引入了實時內核保護(RKP)技術。RKP可在TrustZone內對操做系統進行持續不斷且富有策略性的實時監控,以防止篡改內核。
RKP可對內核內部發生的重要事件進行審計(可在ARM中進行檢查)。若是肯定某個事件對 OS 內核的完整性具備影響,則 RKP 將會中止該事件,或記錄懷疑存在篡改行爲的認證結論,並將其發送至 MDM。這能夠防止惡意修改和注入內核代碼,包括強制內核破壞自身的數據。
在2.0版本的RKP除了保護頁表以外,還保護一些關鍵的內核對象(如cred,real_cred)。RKP將存儲關鍵安全信息對象的kmem_cache裏全部的頁都設爲只讀,只能在TIMA裏面對kmem_cache裏的頁進行寫操做。
在MOSEC2016大會上,科恩實驗室的方家弘介紹了KingRoot產品中修改這些關鍵安全數據,實現DKOM的方法。KingRoot的方法是利用cve-2015-1805的任意地址寫的漏洞,修改file_operations裏的int (*check_flags)(int) 函數指針,使得函數指針指向override_creds函數。
經過控制check_flags函數輸入參數,使得TIMA主動修改cred的值,從而繞過RKP防禦,達到提權的效果。
除了防止運行時修改關鍵的安全數據結構以外,RKP還對一些系統調用進行監控,如execve系統調用。
對於任何的ROOT進程,sec_restrict_fork函數將判斷是否該進程的路徑是來自/data目錄,正常狀況下,該目錄是存放用戶程序的惟一路徑。三星但願這樣能夠阻止相似SU這樣的程序能夠給/DATA/目錄下的用戶程序賦權限的狀況發生。可是,咱們能夠依然能夠修改一些關鍵數據來繞過sec_restrict_fork函數的判斷。