内存随机化是否作为应用程序安全增强的一种方法?

7

我最近看到了一篇微软文章,宣传Windows 7的新“防御增强”功能,具体包括:

  • 地址空间布局随机化(ASLR)
  • 堆随机化
  • 栈随机化

文章继续说:“...其中一些防御措施位于核心操作系统中,而Microsoft Visual C++编译器提供其他防御措施”,但没有解释这些策略如何实际增加安全性。

有人知道为什么内存随机化会增加安全性吗?其他平台和编译器是否采用类似的策略?


2
一个小细节:ASLR是在Vista中添加的,而不是Win7。 - Larry Osterman
3个回答

10

它通过使内存中的位置难以预测来增加安全性。相当多的缓冲区溢出利用是将(例如)已知例程的地址放在堆栈上,然后返回该地址。如果不知道相关例程的地址,这样做就更加困难。

据我所知,在PC的众所周知操作系统中,OpenBSD是最早采用这种技术的之一。


请提供支持您观点的链接,我想要了解更多相关信息。 - Matt Joiner
1
http://en.wikipedia.org/wiki/Stack_buffer_overflow, http://kerneltrap.org/node/573 - Jerry Coffin
这个程序是为操作系统还是我的应用程序随机化DLL?还是两者都随机化? - C.J.
一定是操作系统动态链接库。对于您的代码,链接时必须指定 /DYNAMICBASE 以启用它。 - Jerry Coffin

2

它使得像返回到libc(或在后两种情况下返回到用户提供的数据缓冲区)这样的攻击变得更加困难。是的,它在Linux、BSD和Mac OS中都可用。正如您所期望的那样,细节因操作系统而异。请参阅维基百科介绍


0
通过随机化堆栈,您可以使像Aleph One's Smashing the Stack for Fun Profit这样的普通缓冲区溢出攻击变得不可能。原因是攻击依赖于将少量可执行代码shellcode放置在内存中可预测的位置上。函数堆栈帧被破坏,其返回地址被覆盖为攻击者选择的值。当受损函数返回时,执行流程移动到攻击者的shellcode。传统上,这个内存地址是如此可预测,以至于运行相同软件版本的所有计算机上都是相同的。
尽管Windows 7实施了先进的内存保护措施,但远程代码执行仍然是可能的。最近在CanSecWest上,一台运行Windows 7和IE 8的机器在几秒钟内被黑客攻破。这里有一个技术描述,介绍了一种利用悬空指针和堆溢出的现代内存破坏攻击。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接