11.7. 工具

有些工具可以帮助你在发布结果之前检测到安全问题。当然,它们无法找到所有此类问题,但它们可以帮助捕获那些可能被忽略的问题。这里介绍一些工具,重点是开源/自由软件工具。

一种显而易见的工具类型是程序,用于检查源代码以搜索已知的潜在安全问题的模式(例如,以通常是安全漏洞来源的方式调用库函数)。这类程序被称为“源代码扫描器”。 这里介绍一些这样的工具

有些工具尝试在运行时检测潜在的安全缺陷,要么是为了对抗它们,要么至少是为了警告开发人员。Crispen Cowan 的许多工作,例如 StackGuard,就属于此类。

有几种工具尝试检测各种 C/C++ 内存管理问题;这些实际上是通用的软件质量改进工具,并非专门针对安全,但内存管理问题肯定会导致安全问题。一个特别强大的工具是 Valgrind,它可以检测各种内存管理问题(例如,使用未初始化的内存、在内存释放后读取/写入内存、读取/写入 malloc 分配的块的末尾以及内存泄漏)。另一个这样的工具是 Bruce Perens 的 Electric Fence (efence),它可以检测某些内存管理错误。Memwatch(公共领域)和 YAMD (GPL) 可以检测 C 和 C++ 的内存分配问题。你甚至可以使用 GNU C 库的 malloc 库的内置功能,它具有 MALLOC_CHECK_ 环境变量(有关更多信息,请参阅其手册页)。还有许多其他工具。

另一种方法是创建测试模式并运行程序,尝试查找程序中的弱点。这里介绍一些这样的工具

有许多工具试图让你深入了解正在运行的程序,这在尝试查找代码中的安全问题时也很有用。这包括符号调试器(如 gdb)和跟踪程序(如 strace 和 ltrace)。一个支持运行代码分析的有趣程序是 Fenris(GPL 许可)。其文档将 Fenris 描述为“多用途跟踪器、有状态分析器和部分反编译器,旨在简化错误跟踪、安全审计、代码、算法或协议分析 - 提供结构化程序跟踪、有关内部构造、执行路径、内存操作、I/O、条件表达式等等的通用信息。” Fenris 实际上提供了一整套工具,包括广泛的取证功能和 一个适用于 Linux 的不错的调试 GUI。可在 http://lcamtuf.coredump.cx/fenris/debug-tools.html 获取其他有希望的开源工具列表,这些工具可能适用于调试或代码分析。另一个沿着这些思路的有趣程序是 Subterfugue,它允许你控制程序发出的每个系统调用中发生的事情。

如果你正在构建一种常见的、存在许多标准潜在缺陷的产品(如 ftp 服务器或防火墙),你可能会发现标准安全扫描工具很有用。一个不错的工具是 Nessus;还有许多其他工具。这些类型的工具对于进行回归测试非常有用,但由于它们本质上使用过去特定漏洞和常见配置错误的列表,因此它们可能对在新程序中查找问题没有太大帮助。

通常,你需要调用其他工具来实现你的安全基础设施。《开源 PKI 书籍》描述了许多用于实现公钥基础设施 (PKI) 的开源程序。

当然,在不安全的平台配置上运行“安全”程序意义不大。你可能需要研究加固系统,这些系统尝试配置或修改系统以使其更耐受攻击。对于 Linux,一个加固系统是 Bastille Linux,可在 http://www.bastille-linux.org 获取。