linux保护机制整理

原创
2016/10/22 00:03
阅读数 3.6K

DEP,ASLR,更强的Selinux,内核代码段只读,PXN

DEP,ASLR,Selinux等技术在PC时代就已经比较成熟了。内核代码段只读也是可以通过修改ptmx_fops指针表等方案来绕过

1、DEP(windows)、NX(linux)堆栈代码执行保护 
   绕过方法:
    使用 (ROP)Return-Oriented Programming.绕过 (如ret2data、ret2libc、ret2strcpy、ret2gets、ret2syscall)
    gadget:virtualprotect、jmp esp、mona.py
2、ASLR 地址随机化 
   绕过方法:
    1、直接RET替换(一般进程也会加载没有随机化的模块,可以找到JMP ESP指令的跳板直接调用)
    2、替换EIP一部分(找到没有随机化的模块然后使用利息泄漏确定EIP的位置,再算出模块的基地址,最后算出要跳的函数地址)
    3、NOP喷射(DEP没开的情况下,创建一大块NOP+shellcode,Heap Spray是在shellcode的前面加上大量的slide code(滑板指令),组成一个注入代码段。      然后向系统申请大量内存,并且反复用注入代码段来填充。这样就使得进程的地址空间被大量的注入代码所占据。然后结合其他的漏洞攻击技术控制程序          流    ,使得程序执行到堆上,最终将导致shellcode的执行。
      统slide code(滑板指令)一般是NOP指令,譬如0x0C(0x0C0C代表的x86指令是OR AL 0x0C),0x0D等等,不影响程序的执行的。)
    4、暴力(如果漏洞不会造成程序崩溃,可以暴力测试256种模块基地址来测试,只到有满足的)最LOW

3、Self-Protection Project(KSPP)

4、内核代码段和常量数据只读保护
    mark_rodata_ro
    写保护的实现是通过set_memory_ro函数内部调用实现set_page_attributes来实现的。
    攻击方法:

    针对这种页保护的防御,较常用的方法是,从物理页表中取相应的页表条目,找到页表描述符,修改相应的权限。我们可以通过利用内核中现成的代码来完成    页表属性的修改。我们发现可以通过内核导出函数set_memory_rw来打开内核页表的读写权限。set_memory_rw函数的定义如下:

    int set_memory_rw(unsigned long virt, int numpages)

5、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),实现任意地址    读写权限的效果。
6、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函数的判断。


 

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部