文档章节

linux保护机制整理

stormm
 stormm
发布于 2016/10/22 00:03
字数 1788
阅读 897
收藏 2

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函数的判断。


 

© 著作权归作者所有

stormm
粉丝 32
博文 22
码字总数 14557
作品 0
昌平
运维
私信 提问
Manjaro Linux 17.0.3,基于 Arch Linux 的操作系统

Manjaro Linux 17.0.3 已发布,本次更新带来了一些错误修复和已升级的软件包。 新版本改进了硬件检测机制,修复了安装程序(Calamares)中的一些功能,为安装介质添加了最新可用的软件包,并整...

局长
2017/09/04
817
2
x86架构的一个瑕疵--可执行保护

很久以前,曾经写过一篇关于如何保护栈不可执行的文章《栈的保护--windows和linux》,文章的最后谈到了一种很好的方式,就是不用段式保护机制而使用页式保护机制,在页表项中做文章,但是这种...

晨曦之光
2012/04/10
96
0
windows和linux的内存管理

windows的内存管理很是严谨,使用内存必须首先分配,当然每个操作系统都是这样,然而windows的严谨在于分配的过程,分为保留和提交两个阶段,其中保留的含义就是在进程的虚拟地址空间保留一块...

晨曦之光
2012/04/10
257
0
工作的前奏—关于目录保护与安全级别

单点安全策略单向安全策略是最安全的,安全监测点越多越容易造成漏洞,linux的策略很好,但是如果你将那个所谓的单点给突破了,那么不要试 图补救,如果补救,看似负责任,实际上往往会把问题...

晨曦之光
2012/04/10
103
0
BUF早餐铺 Linux 内核出现漏洞可触发远程DoS攻击;谷歌要求安卓9.0设备加入防回滚机制;顺丰上线下单“隐址件”,收寄双方均看不到对方信息

  各位 Buffer 早上好,今天是 2018 年 8 月 9 日星期四,农历六月二十八。今天份的 BUF 早餐内容有:墨西哥 200 万人的医疗保健数据在线上曝光;Linux 内核出现漏洞可触发远程 DoS 攻击;...

FreeBuf
2018/08/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

如何设计抗住100亿次请求的抢红包系统?(附GitHub代码)

1. 前言 前几天,偶然看到了 《扛住100亿次请求——如何做一个“有把握”的春晚红包系统”》一文,看完以后,感慨良多,收益很多。 正所谓他山之石,可以攻玉,虽然此文发表于2015年,我看到...

Java程序员之家
50分钟前
5
0
动图+源码,演示Java中常用数据结构执行过程及原理

最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList LinkedHashMap中的双向...

Java技术剑
今天
6
0
怎样在ps中制作对话气泡?一招教你轻松解决

PS是在工作中经常使用的平面设计软件,利用ps可以实现很多操作。换天,换发色,添加亮灯等操作都是比较常见的,今天将为大家分享怎样在ps中制作对话气泡的方法,希望能给大家带来帮助。 绘制...

干货趣分享
今天
2
0
EDI 电子数据交换全解指南

EDI(Electronic Data Interchange,电子数据交换)技术使得企业与企业(B2B)实现通信自动化,帮助交易伙伴和组织更快更好地完成更多工作,并消除了人工操作带来的错误。从零售商到制造商、物...

EDI知行软件
今天
3
0
CentOS7的LVM动态扩容

# 问题 CentOS7上面的磁盘空间有点紧张,需要扩容。 解决 查询当前磁盘状态 [root@xxx ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTfd0 2:0 1 4K ...

亚林瓜子
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部