8

防止缓冲区溢出攻击的想法是什么?我听说过 Stackguard,但到目前为止,这个问题是通过应用 stackguard 或与其他技术结合来完全解决的吗?

热身后,作为一个有经验的程序员

为什么你认为为缓冲区溢出攻击提供足够的 防御如此困难?

编辑:感谢所有答案并保持安全标签处于活动状态:)

4

6 回答 6

4

你可以做很多事情。没有特别的顺序...

首先,如果您的语言选择在允许直接内存访问的语言和不允许直接内存访问的语言之间平均分配(或接近平均分配),请选择不允许直接访问的语言。也就是说,在 C/C++ 上使用 Perl、Python、Lisp、Java 等。这并不总是一种选择,但它确实有助于防止你在脚上开枪。

其次,在您可以直接访问内存的语言中,如果有可用的类可以为您处理内存,例如 std::string,请使用它们。与用户较少的课程相比,更喜欢锻炼良好的课程。更多使用意味着更简单的问题更有可能在常规使用中被发现。

第三,使用 ASLR 和 DEP 等编译器选项。使用您的应用程序提供的任何与安全相关的编译器选项。这不会防止缓冲区溢出,但有助于减轻任何溢出的影响。

第四,使用 Fortify、Qualys 或 Veracode 的服务等静态代码分析工具来发现您无意编码的溢出。然后修复发现的东西。

第五,了解溢出是如何工作的,以及如何在代码中发现它们。你所有的同事也应该学习这一点。创建一个组织范围的政策,要求人们接受超限(和其他漏洞)如何工作的培训。

第六,将安全代码审查与常规代码审查分开。定期的代码审查可确保代码正常工作、通过功能测试并符合编码策略(缩进、命名约定等)。安全代码审查是明确的、明确的,并且只是为了寻找安全问题。尽可能对所有代码进行安全的代码审查。如果您必须确定优先级,请从关键任务开始,可能出现问题的地方(跨越信任边界的地方(了解数据流程图和威胁模型并创建它们),使用解释器的地方,尤其是传递用户输入的地方/存储/检索,包括从您的数据库中检索的数据)。

第七,如果你有钱,请聘请像 Neohapsis、VSR、Matasano 等优秀的顾问来审查你的产品。他们会发现远不止超支,而且您的产品会因此而变得更好。

第八,确保你的 QA 团队知道溢出是如何工作的以及如何测试它们。QA 应该有专门设计的测试用例来发现所有输入中的溢出。

第九,做fuzzing。Fuzzing 在许多产品中发现了大量的溢出。

编辑添加:我误读了这个问题。标题说,“技术是什么”,但正文说“为什么这么难”。

这很难,因为很容易犯错。小错误,如非一错误或数字转换,可能导致溢出。程序是复杂的野兽,具有复杂的交互。哪里有复杂,哪里就有问题。

或者,把问题转回到你身上:为什么编写没有错误的代码这么难?

于 2010-09-14T02:22:46.773 回答
2

可以防止缓冲区溢出漏洞。如果程序员是完美的,就不会有未经检查的缓冲区,因此也不会有缓冲区溢出漏洞。然而,程序员并不完美,未经检查的缓冲区仍然比比皆是。

于 2010-09-14T01:43:27.300 回答
2

安全没有灵丹妙药:您必须仔细设计、仔细编码、进行代码审查、测试并安排修复出现的漏洞。

幸运的是,缓冲区溢出的具体情况已经解决了很长时间。大多数编程语言都有数组边界检查,并且不允许程序组成指针。只是不要使用允许缓冲区溢出的少数,例如 C 和 C++。

当然,这适用于整个软件堆栈,从嵌入式固件¹ 到您的应用程序。

¹ 对于那些不熟悉所涉及技术的人,此漏洞可以让网络上的攻击者唤醒并控制已关闭的计算机。(典型的防火墙配置会阻止有问题的数据包。)

于 2010-09-15T07:21:47.310 回答
2

只有一种技术是必要的:不要相信来自外部来源的数据。

于 2010-09-14T02:08:03.583 回答
1

您可以在代码投入生产之前运行分析器来帮助您发现问题。我们的内存安全检查器将在 C 代码中发现缓冲区溢出、错误指针错误、数组访问错误和内存管理错误,方法是检测您的代码以在错误发生时观察错误。如果您希望 C 程序不受此类错误的影响,您可以简单地将内存安全分析器的结果用作代码的生产版本。

于 2011-03-10T15:22:13.973 回答
0

在现代开发中,三巨头是:

ASLR

金丝雀

NX 位

GCC 的现代版本默认应用 Canaries。并非所有 ASLR 都是平等创建的,Windows 7、Linux 和 *BSD 拥有一些最好的 ASLR。OSX 有迄今为止最糟糕的 ASLR 实现,绕过它是微不足道的。一些最先进的缓冲区溢出攻击使用奇异的方法绕过 ASLR。NX Bit 是迄今为止最容易绕过的方法,return-to-libc 风格的攻击使其对漏洞利用开发人员来说不是问题。

于 2010-09-14T05:32:18.307 回答