security - 缓冲区溢出攻击的防范技术有哪些?

标签 security programming-languages buffer-overflow

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

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

Why do you think that it is so difficult to provide adequate defenses for buffer overflow attacks?

编辑:感谢您的所有回答并保持安全标记处于事件状态:)

最佳答案

您可以做很多事情。排名不分先后...

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

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

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

第四,使用静态代码分析工具(例如 Fortify、Qualys 或 Veracode 的服务)来发现您无意编码的溢出。然后修复发现的问题。

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

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

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

第八,确保您的 QA 团队了解超限是如何工作的以及如何对其进行测试。 QA 应该有专门设计的测试用例来发现所有输入中的超限。

第九,进行模糊测试。模糊测试在许多产品中发现了数量惊人的溢出。

编辑添加:我误读了这个问题。标题说“有什么技巧”,但文字说“为什么很难”。

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

或者,把问题转回到你身上:为什么编写无错误的代码如此困难?

关于security - 缓冲区溢出攻击的防范技术有哪些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3705547/

相关文章:

c# - 如何使用 RFID 徽章和 PIN 码安全访问

programming-languages - 仅键入接口(interface)

c - snprintf 或 vsnprintf 哪个更好,我如何确保安全地使用它们?

java - 刷新java服务器上的缓存和安全性

java - 在不同的 Tomcat Web 应用程序之间共享凭据

language-agnostic - 函数参数中 "res"的含义和用途是什么?

c - 缓冲区溢出的 C 代码问题

c - 为什么这个 C 程序会变成梨形?我打破了我的缓冲区吗?

mysql - 在 MySQL 中安全地存储用户数据?

java - "All Java byte code interpreter are JVMs but all JVMs are not Java interpreters"的说法是真的吗?