缓冲区溢出攻击的预防技术有哪些?

时间:2010-09-14 01:22:00

标签: security programming-languages buffer-overflow

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

热身后,作为一名经验丰富的程序员

  

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

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

6 个答案:

答案 0 :(得分:4)

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

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

其次,在您具有直接内存访问权的语言中,如果可以为您处理内存的类(如std :: string)使用它们。优先考虑使用较少用户的类。更多使用意味着在常规使用中更容易发现更简单的问题。

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

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

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

第六,与常规代码审查分开进行安全代码审查。定期代码审查确保代码有效,它通过功能测试,并且符合编码策略(缩进,命名约定等)。安全代码审查是明确的,明确的,仅用于查找安全问题。对所有代码进行安全的代码审查。如果你必须优先考虑,那就从关键任务的东西开始,可能出现问题的地方(信任边界交叉的地方(了解数据流图和威胁模型并创建它们),使用解释器的地方,特别是在传递用户输入的地方/存储/检索,包括从数据库中检索的数据。

第七,如果你有钱,可以聘请像Neohapsis,VSR,Matasano等好顾问来检查你的产品。他们发现远远超过超支,你的产品将会更好。

第八,确保你的QA团队知道超支是如何工作的,以及如何测试它们。质量保证应该有专门设计的测试用例,以便在所有输入中找到超出范围。

第九,做模糊测试。 Fuzzing在许多产品中发现了惊人的大量溢出。

编辑补充:我误解了这个问题。标题说“技术是什么”,但文字说“为什么这很难”。

这很难,因为犯错很容易。诸如逐个错误或数字转换之类的小错误可能导致溢出。程序是复杂的,具有复杂的交互。复杂的地方存在问题。

或者,将问题转回给你:为什么编写无错误代码这么难?

答案 1 :(得分:2)

可以防止缓冲区溢出漏洞。如果程序员是完美的,那就没有了 未经检查的缓冲区,因此没有缓冲区溢出漏洞。但是,程序员不是 完美的,未经检查的缓冲区继续存在。

答案 2 :(得分:2)

只需要一种技术:不要信任来自外部来源的数据。

答案 3 :(得分:2)

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

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

当然,这适用于整个软件堆栈,从embedded firmware¹到您的应用程序。

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

答案 4 :(得分:1)

您可以运行分析器,以帮助您在代码投入生产之前发现问题。我们的Memory Safety Checker会在C代码中找到缓冲区溢出,错误指针错误,数组访问错误和内存管理错误,通过检测代码来监视它们生成时的错误。如果您希望C程序不受此类错误的影响,您只需使用Memory Safety分析器的结果作为代码的生产版本。

答案 5 :(得分:0)

在现代剥削中,三巨头是:

ASLR

Canary

NX Bit

GCC的现代版本默认使用Canaries。并非所有ASLR都是同等创建的,Windows 7,Linux和* BSD都有一些最好的ASLR。 OSX迄今为止是最糟糕的ASLR实现,它可以绕过它。一些most advanced缓冲区溢出攻击使用外来方法来绕过ASLR。到目前为止,NX Bit是最容易实现的方法,返回libc风格的攻击使得它对于漏洞利用开发人员来说不是问题。