绕过地址随机化和堆栈粉碎保护的可行性 - 缓冲区溢出攻击

时间:2014-09-13 10:20:57

标签: c security unix assembly buffer

我刚刚介绍了UNIX中2.6以上内核版本中可用的缓冲区溢出攻击和相关保护机制的逻辑,以避免缓冲区溢出攻击(地址随机化和堆栈粉碎保护)。

每次我们继续禁用地址随机化(分配' 0'到内核地址随机化)和Stack Smash Protection(包括编译时的-fno-stack-protector)来分析缓冲区溢出攻击。

只是好奇才能知道,是否有任何旁路保护机制可用,而不必仅仅通过禁用它仍然强制执行上述两项活动。很高兴听到那里有任何这样的机制,你能帮忙吗?

1 个答案:

答案 0 :(得分:0)

我知道避免缓冲区溢出的最好方法是使用100%完全详尽的单元测试来检查任何处理任何大小和类型的缓冲区的函数。当然,这并不总是现实的。

  

"详尽"意味着所有可能的情况都会被考虑在内,无论您的应用程序是否会在您第一次编写代码时生成所有这些特定情况。

虽然有一些工具可以帮助你在那个舞台上。有些是自动化程度很高,会自动生成单元测试。我从来没有尝试过其中的任何一个,所以我不能保证其中任何一个,但如果你处于紧张状态,那可能会有所帮助。

另一种方法,有点工作是针对您的代码运行静态分析器。 Code Coverity是我过去使用过的,但也有很多其他的。在大多数情况下,静态分析只会捕获在堆栈上声明静态缓冲区的问题,如:

 char buf[256];
 ...
 char a = buf[256];  // <- bug here, although not too bad
 buf[256] = a;       // <- bug here, could be bad, you're writing to the stack!

现在......在Unix下你有两个缓冲区溢出问题。在大多数情况下,它会使您的系统崩溃。但是,如果黑客可以访问您的代码,他们可能能够调用特定的系统函数(内核函数,要清楚)。在这种情况下,可能存在问题的是,如果您的进程以提升的用户运行(即最坏的情况:root)。此时,黑客可能已经获得了一些权限,可以在未经您授权的情况下执行更多操作。为了消除这种风险,您有两个主要解决方案:

  1. 使用chroot环境;如果您不熟悉Linux,这可能很难设置,但这适用于虚拟所有Unices
  2. 使用虚拟机环境(或qemu等其他虚拟系统);获得这样的环境设置通常很容易,但如果你想自动生成新的环境......有一个API,它可能很乏味。
  3. 还有最后一种方法,但这可能很慢。 CPU有一个MMU。您可以使用MMU来保护/取消保护内存,并确保每次读取和写入都发生在已分配的缓冲区中(如果是堆栈,则使用帧缓冲区确保您位于正确的窗口内。)当您可以想象,对于每次写入(可能还有许多读取),您都会得到一个中断并且处理程序不小。调试具有许多缓冲区溢出的软件是一个很好的工具/想法,但通常它在生产中是不可用的。

    不幸的是,默认情况下,这些选项都不是g ++套件的一部分。