首页
社区
课程
招聘
[原创]linux漏洞缓解机制介绍
发表于: 2018-5-11 18:46 24574

[原创]linux漏洞缓解机制介绍

2018-5-11 18:46
24574

这只是一篇给我这种小白看的科普文,大牛绕道。

linux各种发行版众多,同样的内核同样的漏洞,往往某个发行版可以利用而另一个不能,要说起这些安全机制的演变显得有些复杂,本文的目的就是对它们做一个浅显的梳理。

ASLR(Address space layout randomization,地址空间布局随机化)通过随机放置数据区域的地址空间来防止攻击者跳转到内存的特定位置。在windows上ASLR主要包括堆栈随机化、PEB与TEB随机化、映像随机化,windows系统上虽然xp时代就提出来了,但是从vista开始ASLR才真正发挥作用。在linux上ASLR主要包括栈地址随机化、LIBS/MMAP随机化、EXEC随机化、BRK随机化、VDSO随机化。在没有ASLR的情况下让程序跳转到一个已经存在的系统函数的漏洞利用方式被称为ret2libc。

1.1栈地址随机化:2.6.15内核开始支持。

1.2LIBS/MMAP随机化:程序每次执行动态库都被加载到不同的内存位置。2.6.15内核开始支持。

1.3EXEC随机化:程序每次执行都将加载到不同的内存位置。2.6.25内核开始支持(会在第二点Built as PIE中详细讨论)。

可以这么理解,LIBS/MMAP随机化相当于windows中dll的随机化,而EXEC随机化相当于windows中exe的随机化。

1.4BRK随机化:linux系统中brk和mmap这两个系统调用用来分配内存。当brk ASLR关闭的时候,start_brk和brk都是指向bss段的尾部的;当brk ASLR开启的时候,start_brk和brk初始位置是bss段的尾部加一个随机的偏移。2.6.26内核开始支持。


1.5VDSO随机化:VDSO(Virtual Dynamically-linked Shared Object,虚拟动态共享库)将内核态的调用映射到用户态的地址空间中,使得调用开销更小,路径更好。拿x86下的系统调用举例,传统的int 0x80有点慢,Intel和AMD分别实现了sysenter/sysexit和syscall/sysret,即所谓的快速系统调用指令,使用它们更快,但是也带来了兼容性的问题。于是linux实现了vsyscall,程序统一调用vsyscall,具体的选择由内核来决定,vsyscall的实现就在VDSO中。执行ldd /bin/sh,会发现有个linux-vdso.so.1的动态文件,而系统中却找不到它,它就是VDSO。linux内核从2.6.18(x86/PPC)和2.6.22(x86_64)开始支持VDSO的随机化。


1.6linux中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()分配的内存空间也将被随机化。

NX(Non-Executable Memory,不可执行内存)类似于windows中的DEP(Data Execution Prevention,数据执行保护)。windows系统从xp sp2开始启用DEP。使用gcc在汇编时--noexecstack或在链接时-z noexecstack或者使用execstack修改ELF文件中PT_GNU_STACK中的p_flags可以设置程序是否需要具有可执行权限的堆栈。cat /proc/cpuinfo在flags中如果有NX表示CPU支持NX。

一些BIOS厂商可能默认会禁止这个功能,不过从Ubuntu 11.04开始内核就会忽略BIOS中关于NX的设置。下面这张图是在Ubuntu中NX的启用情况。


前面说了EXEC的随机化,实际上更准确的说法是PIE(Position Independent Executables,位置无关可执行文件)。PIE只有在系统开启ASLR和编译时开启-fpie -pie选项这两个条件同时满足时才会生效。最初因为在像x86这样通用寄存器较少的架构上PIE的性能损失比较明显,所以并不是所有的程序都启用了PIE。从Ubuntu 17.10和Fedora 23开始为所有的架构都启用了PIE。

RELRO(RELocation Read-Only,只读重定位)让加载器将重定位表中加载时解析的符号标记为只读,这减少了GOT覆写攻击的面积。RELRO可以分为Partial RELRO(部分RELRO)和Full RELRO(完整RELRO)。开启Partial RELRO的话GOT表是可写的;开启FULL RELRO的话GOT表是只读的。从Fedora 23开始所有软件包都已启用了Full RELRO。开启-Wl,-z,relro选项即可开启Partial RELRO;开启-Wl,-z,relro,-z,now选项即可开启Full RELRO。

Stack Protector又名canary,stack cookie……等等,类似于VS编译器中的GS。gcc4.2中添加了-fstack-protector和-fstack-protector-all编译参数以支持该功能,gcc4.9中添加了-fstack-protector-strong编译参数让保护的范围更广。


在dmesg里可以查看到开机信息。若研究内核代码,在代码中插入printk函数,然后通过dmesg观察是一个很好的方法。从Ubuntu 12.04 LTS开始,可以将/proc/sys/kernel/dmesg_restrict设置为1将dmesg输出的信息当做敏感信息(默认为0)。


在linux内核漏洞利用中常常使用commit_creds和prepare_kernel_cred来完成提权,它们的地址可以从/proc/kallsyms中读取。从Ubuntu 11.04和RHEL 7开始,/proc/sys/kernel/kptr_restrict被默认设置为1以阻止通过这种方式泄露内核地址。


今年年初的CPU漏洞让KPTI(Kernel PageTable Isolation,内核页表隔离)进入了人们的视野。进程地址空间被分成了内核地址空间和用户地址空间,其中内核地址空间映射到了整个物理地址空间,而用户地址空间只能映射到指定的物理地址空间。内核地址空间和用户地址空间共用一个页全局目录表。为了彻底防止用户程序获取内核数据,可以令内核地址空间和用户地址空间使用两组页表集。linux内核从4.15开始支持KPTI,windows上把这个叫KVA Shadow,原理类似。更多细节请见参考资料。


[注意]看雪招聘,专注安全领域的专业人才平台!

最后于 2018-11-15 18:04 被houjingyi编辑 ,原因: 更新关于KASLR的内容
收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 2694
活跃值: (80)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
2
2018-5-12 00:04
0
雪    币: 3846
活跃值: (702)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
楼主我想问下怎么关闭linux系统默认开启的NX
2018-5-12 09:26
0
雪    币: 5634
活跃值: (7509)
能力值: ( LV15,RANK:531 )
在线值:
发帖
回帖
粉丝
4
这我也不太清楚,网上说在启动时进入grub在命令行中添加noexec=off/noexec32=off,但是我试了试没有成功
最后于 2018-5-12 23:54 被houjingyi编辑 ,原因:
2018-5-12 23:53
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
S
5
最后于 2018-5-13 12:35 被S编辑 ,原因:
2018-5-13 12:35
0
雪    币: 4366
活跃值: (353)
能力值: ( LV10,RANK:160 )
在线值:
发帖
回帖
粉丝
6
谢谢分享。请问   三.内核安全防护  之前关于-fstack-protector  的表格是哪里找的呢?
最后于 2018-6-15 16:08 被心许雪编辑 ,原因:
2018-6-15 16:07
0
雪    币: 203
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
2018-7-4 13:14
0
雪    币: 5634
活跃值: (7509)
能力值: ( LV15,RANK:531 )
在线值:
发帖
回帖
粉丝
8
心许雪 谢谢分享。请问   三.内核安全防护  之前关于-fstack-protector  的表格是哪里找的呢?
参考资料里面
2018-7-27 16:22
0
雪    币: 1473
活跃值: (387)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
9
多谢楼主分享,对于楼上的问题 ,我说一下自己的情况。修改grup中的数据如果有多个的话,不要用"/",直接用空格隔开,如"nosmep nosmap nokalsr"这种,网上很多人说的用斜杠分隔,只能第一个生效。
2018-8-15 10:30
0
雪    币: 5634
活跃值: (7509)
能力值: ( LV15,RANK:531 )
在线值:
发帖
回帖
粉丝
10
skeep 多谢楼主分享,对于楼上的问题 ,我说一下自己的情况。修改grup中的数据如果有多个的话,不要用"/",直接用空格隔开,如"nosmep nosmap nokalsr&qu ...
是的
2018-8-30 18:35
0
雪    币: 6086
活跃值: (1117)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
收藏了
2018-9-2 17:07
0
雪    币: 17
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
写得不错! 感谢!
2019-4-10 16:50
0
雪    币: 1139
活跃值: (171)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
总结的好,感谢
最后于 2019-8-10 16:17 被孙小空-Liu编辑 ,原因:
2019-8-10 16:17
0
雪    币: 14893
活跃值: (18064)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
14
mark,楼主辛苦了
2019-8-13 15:15
0
雪    币: 159
活跃值: (695)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
感谢分享。
2019-12-2 15:37
0
雪    币: 192
活跃值: (286)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
mark
2020-4-3 12:16
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
17
mark
2020-4-15 21:02
0
游客
登录 | 注册 方可回帖
返回