标题: ExecShield原理及相关技术 [打印本页] 作者: lenin 时间: 2005-08-22 06:55 标题: ExecShield原理及相关技术 Redhat ExecShield whitepaper翻译
前一段时间事情一直比较多,昨天抽空读了一下Redhat关于exex-shield的whitepaper,个人感觉收获不小,解决了不少疑问,所以花了一些时间将其翻译了出来,和大家分享,翻译中如果有错漏指出请大家帮忙指正。
//------------------------------------------------------------------------------------
New Security Enhancements
in Red Hat Enterprise Linux
v.3, update 3
Remaining Randomization: PIE Binaries
到现在,我们已经讨论了应用程序代码本身在内存中地址的随机化。但在Linux中
应用程序通常是以一种预选定地址的形式被编译成二进制码的(即ELF中的可执行
文件格式)。如果这样,内核便无法将其地址随机化。而缺乏随机化正是缓冲区
溢出保护的弱点。
因此Red Hat开发并贡献给了GNU Compiler Collection toolchain一项称为PIE即position
Independent Executable的技术。PIE二进制文件以一种特殊的形式被编译,使它们可以在
整个程序地址空间中随机定位。有ExecShield技术的内核,这些二进制文件被加载的地址
是随机的,而在没有ExecShield和PIE支持的内核中这些二进制文件加载的地址是可预测的。
并不是所有的程序都适合被编译为PIE格式。因为PIE二进制文件必须可以被重定位,
所以他们必须被编译为Position Independent Code (PIC)(注:废话,作者没有言明,应该
就是ELF三种格式中的可重定位文件格式吧)。PIC代码就像共享库一样(共享库也是被编译为
PIC格式,即ELF三种格式中的共享object文件)对于运行时效率有一些影响。
想要将文件编译为PIE格式,需要对编译器和连接器分别添加-fpie 和-pie命令行参数。
因为PIE是一项新的技术,所以并没有在RHEL3中对所有软件用该技术编译。Red Hat将在
以后的升级中增加PIE技术的使用。在RHEL3 update3中,几个使用率很高的程序被编译为
PIE格式,包括:
1 The Bind DNS nameserver
2 The Samba SMB/CIFS fileserver
3 The Squid HTTP proxy
4 The vsftpd FTP server
除此以外,几个小一些的程序也被编译为PIE(rusers and cron, the NFS RPC daemons)。
想要查看一个程序是否被编译为PIE,使用以下命令:
#readelf -h -d /usr/sbin/smbd | grep 'Type:.*DYN'
#Type: DYN (Shared object file)
Compatibility(兼容性)
在对RHEL3的新安全特性进行设计时,对已有应用程序的兼容性被优先考虑,以使新的改变
不会对已有应用程序造成影响。使堆栈不可执行的主要兼容性问题是对那些需要依赖堆栈
段或堆可执行来运行的程序。很多种原因造成了这种行为,包括incorrect
assumptions in the application(???) 的情况(例如JVM的缓存,其它动态语言
也可能有这种问题), 或是某些特定的programming constructs(???)或是编程语言
出于某些实际的原因需要堆栈段可执行。
对这个兼容性问题的解决方案,可以通过在二进制文件或库中添加特定的flag来实现。
这个flag值表示了该程序或库是否依赖堆栈段可执行机制来运行。
Red Hat通过向GCC贡献的代码,使程序在编译时自动根据使用的programming constructs
或是程序设计语言添加该flag。
而且,没有该flag标志的二进制程序或是库,内核会假定其需要堆栈可执行机制来运行
从而保证最大向下兼容性。
Table 1. Overview of ELF flag behavior
-----------------------------------------------
Flag value Resulting behavior
-----------------------------------------------
Flag present, RWE Stack is executable
Flag present, RW Stack is not executable
Flag absent Stack is executable
-----------------------------------------------
想要查看一个二进制文件或库是否有该标志值,输入以下命令:
#eu-readelf -l /bin/true | grep GNU_STACK
GNU_STACK 0x000000 0x00000000 0x00000000 0x000000 0x000000 RW
#eu-readelf -l /usr/bin/eu-nm | grep GNU_STACK
GNU_STACK 0x000000 0x00000000 0x00000000 0x000000 0x000000 RWE
0x4
系统管理员,想要查看一个进程是否有堆栈段执行保护,可以访问
http://people.redhat.com/arjanv/lse...略豯sexec脚本。
How Well Does It Work(效果如何)
在2003年11月1日至2004年8月11日,在16个安全等级高于DoS的漏洞中,四个
内核安全性漏洞ExecShield没能提供保护,但成功的阻止了11个缓冲区溢出漏洞
,并且还成功的阻止了一个堆溢出漏洞。因此ExecShield得到了75%的成功率。
值得注意的是这些exploits程序在没有NX技术支持的处理器上依然得到了阻止
(因为Randomization和PIE)。作者: weiweinews 时间: 2010-11-22 11:11
谢谢分享,学习中!!!