delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

23 Sep 2011

W^X (可写与可执行互斥)

Von Neumann体系结构的计算机系统的一项特点是使用内存来保存程序和数据。这种设计减少了制造计算机的成本,但是也带来了一个弱点:因为事实上程序也是一种数据,如果这些"数据"在运行时可写,程序便有可能修改其本身,而如果这一特性被误用,例如由于程序本身的设计缺陷,攻击者便可以利用它来执行攻击者希望的任何事情。

直观上,解决这个问题的方法是让应用程序可写的位置都不可执行,或者说,应用程序新写的数据,在获得更高权限实体核准之前(例如,这些实体可以验证这些数据是生成自可信来源的输入),不允许作为程序执行。

实践上,需要考虑的问题则比乍看起来要复杂的多。例如,在比较新的处理器上,在虚拟内存子系统可以实现在映射内存页时让 w 和 x 互斥(即可写的内存页就不可执行),来让攻击者利用缓冲区溢出问题,覆盖返回地址令进程跳转到其指定的地址时触发保护异常,但这种做法并不能阻止因为程序本身的设计缺陷导致这些数据被写盘,然后再被解释或执行的问题。举例来说,如果攻击者掌握两项安全弱点,一项是可以执行文件系统中任意位置的php脚本但不能指定任何参数,另一项是可以在临时目录中写一个扩展名为.jpg的文件,那么利用这两项漏洞就可以实现以Web应用的身份执行任意代码的目的了。对于某些每个月都会出现一个本地特权提升问题的操作系统而言,这很可能会带来更加灾难性的后果。通过umask的设置,以及对脚本路径进行限制,可以解决绝大多数情况下的这类问题,但并不总能解决问题—-对所有输入进行验证和检查,并尽可能限制 Web 应用,或其它与用户输入交互的组件的执行权限,仍然是非常必要的。


Archived: 2 Comments

snnn | October 13, 2011 7:11 PM

Java中new出来的对象,所在的那个heap,在向Windows申请内存的时候,是RWX的。一直到JRE 6 Update 18才变成了RW的。别的OS下我没查过带不带X。

Xin LI replied to comment from snnn | October 21, 2011 12:01 AM

这个是设计需要吧,早期的 JVM 甚至要求堆是可执行的。。。