内存随机化作为应用程序安全增强?

时间:2010-04-21 19:30:59

标签: .net c++ security memory windows-7

我最近发表了一篇微软文章,吹捧Windows 7的新“防御性增强”。具体来说:

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

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

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

3 个答案:

答案 0 :(得分:9)

它通过难以预测内存中的某些内容来提高安全性。相当多的缓冲区溢出漏洞通过将(例如)已知例程的地址放在堆栈上然后返回到它来工作。如果不知道相关例程的地址就很难做到这一点。

据我所知,OpenBSD是第一个这样做的,至少在众所周知的PC操作系统中是这样做的。

答案 1 :(得分:2)

它使return to libc之类的攻击(或者在后两种情况下返回用户提供的数据缓冲区)变得更加困难。是的,它可以在Linux,BSD和Mac OS中使用。正如您所料,详细信息因操作系统而异。请参阅维基百科an introduction

答案 2 :(得分:0)

通过随机化堆栈,您可以使Aleph One's Smashing the Stack for Fun Profit之类的香草缓冲区溢出攻击成为不可能。原因是因为攻击依赖于将少量可执行代码calld shellcode放入内存中的可预测位置。函数堆栈框架已损坏,其返回地址将被攻击者选择的值覆盖。当损坏的函数返回时,执行流程转移到攻击者的shellcode。传统上,这个内存地址是可预测的,它在运行相同版本软件的所有机器上都是相同的。

尽管在Windows 7上实现了高级内存保护,但仍然可以执行远程代码执行。最近在CanSecWest,一台运行Windows 7和IE 8的机器在几秒钟内被黑了。这是现代内存损坏攻击的technical description,利用悬空指针和堆溢出。