pax
1. Grsecurity/PaX
0x1: 什么是Pax
PaX是针对linux kernel的一个加固版本的补丁,它让linux内核的内存页受限于最小权限原则,是一个有效的防御"系统级别0DAY"的方案,第1版的设计和实现诞生于2000年,但是当年Linux内核不收PaX进入upstream是因为很多人觉得PaX不是那么的好维护,之后linux内核推出了LSM(Linux Security Module),LSM利用了一堆CAPAbility的机制提供了一些限制用户态程序访问控制的接口,selinux和APParmor就是基于LSM开发的。需要注意的是LSM并不是一个传统意义上的linux kernel module
1. 必须在bootloader启动内核时启动,不能在内核加载完后启动 2. 不能同时启动2个LSM的实现,当然后来有人实现了一套LSM stacking堆栈式调用方式,但是并没有进入Linux内核原生支持
当我们谈到PaX时都会写Grsecurity/PaX,这是因为PaX从一开始就主要关注如何防御和检测memory corruption,后来Grsecurity社区发现PaX和他们所关注的非常类似,所以就合并了,在很长的一段时间里PaX主要关注memorycorruption,而Grsecurity则实现其他的功能包括RBAC,但后来2个社区的工作开始模糊了:包括USERCOPY, STACKLEAK, RANDstruct, etc..都是整个Grsecurity/PaX共同实现的特性
PaX team认为会导致漏洞利用的bug给予了攻击者(区分攻击者和黑客是不同的term)在3个不同层面上访问被攻击的进程
1. 执行任意代码 2. 执行现有代码但打破了原有的执行顺序 3. 原有的执行顺序执行现有代码,但加载任意数据
0x2: PaX里vma mirroring的设计
在2003年的晚些时候PaX实现了虚拟内存空间的镜像( vma mirroring),vmamirroring的目的是为了在一组物理页上做特殊文件隐射时有2个不同的线性地址,这2个地址即使在swap-out/swap-in或者COW后依然是不会改变的。这样做的目的为了满足几种场景
1. 把可执行的区域在使用SEGMEXEC隐射进入代码段。在32-bit的linux内核里的4GB地址空间是其中3GB给用户空间,1GB给内核空间,而vma mirroring把用户空间的3GB划分成了2个1.5GB分别是给代码段和数据段,在可执行区域里包含的数据的部分(常量字符串,函数指针表等)都会mirroring到数据段里 2. 实现可执行区域的地址随机化(RANDEXEC) 3. 这个引出了第3种情况,就是SEGMEXEC和RANDEXEC同时激活,这个的效果和PIE+ASLR的效果类似,不同的不是整个elf binary的代码段随机化,而是在mirroring时对代码段和数据段进行随机化
Relevant Link:
https://raw.githubusercontent.com/citypw/dnfWAH/master/4/d4_0x01_DNFWAH_archeological_hacking_on_pax.txt https://wiki.gentoo.org/wiki/Hardened/PaX_Quickstart https://linux.cn/article-5750-qqmail.html