有些工具可以帮助你在发布结果之前检测到安全问题。当然,它们无法找到所有此类问题,但它们可以帮助捕获那些可能被忽略的问题。这里介绍一些工具,重点是开源/自由软件工具。
一种显而易见的工具类型是程序,用于检查源代码以搜索已知的潜在安全问题的模式(例如,以通常是安全漏洞来源的方式调用库函数)。这类程序被称为“源代码扫描器”。 这里介绍一些这样的工具
Flawfinder,由我开发;可在 http://www.dwheeler.com/flawfinder 获取。这也是一个扫描 C/C++ 源代码以查找常见问题的程序,并且也根据 GPL 许可。与 RATS 不同,flawfinder 是用 Python 实现的。RATS 和 Flawfinder 的开发者已同意找到一种合作方式,以创建一个单一的“最佳”开源程序。
RATS(Rough Auditing Tool for Security),来自 Secure Software Solutions,可在 http://www.securesw.com/rats 获取。此程序扫描 C/C++ 源代码以查找常见问题,并根据 GPL 许可。
ITS4,来自 Cigital(前身为 Reliable Software Technologies, RST),也静态检查 C/C++ 代码。它可免费用于非商业用途,包括其源代码以及某些修改和再分发权利。请注意,这并未按照开放源代码定义 (OSD) 的定义作为“开源”发布 - 特别是,OSD 第 6 点禁止在开源许可证中包含“仅限非商业用途”条款。ITS4 可在 http://www.rstcorp.com/its4 获取。
Splint(原名 LCLint)是一个用于静态检查 C 程序的工具。只需少量努力,splint 即可用作更好的 lint。如果投入额外的精力为程序添加注释,splint 可以执行比任何标准 lint 更强大的检查。例如,它可以用于静态检测可能的缓冲区溢出。该软件根据 GPL 许可,可在 http://www.splint.org 获取。
cqual 是一种基于类型的分析工具,用于查找 C 程序中的错误。cqual 使用额外的用户定义的类型限定符扩展了 C 的类型系统,例如,它可以注释值是“污点”或“未污点”(类似于 Perl 的污点检查)。程序员在程序的几个地方添加注释,cqual 执行限定符推断以检查注释是否正确。cqual 使用程序分析模式(一个基于 emacs 的界面)呈现分析结果。当前版本的 cqual 可以检测 C 程序中潜在的格式字符串漏洞。cqual 的早期版本 Carillon 已用于查找 C 程序中的 Y2K 错误。该软件根据 GPL 许可,可从 http://www.cs.berkeley.edu/Research/Aiken/cqual 获取。
Cyclone 是一种类 C 语言,旨在消除 C 的安全弱点。理论上,你总是可以切换到“更安全”的语言,但这并不总是有帮助(一种语言可以帮助你避免常见的错误,但它无法读取你的思想)。John Viega 评论了 Cyclone,并在 2001 年 12 月表示:“Cyclone 绝对是一种简洁的语言。它是一种 C 方言,感觉没有剥夺任何能力,但增加了强大的安全保证,以及许多对程序员真正有益的功能。不幸的是,Cyclone 尚未为黄金时段做好准备。即使抛开严重的局限性,它相对于 Java(甚至带有良好工具集的 C)而言,也没有提供足够的优势,使其值得冒险使用这种仍然非常年轻的技术。也许在几年后,Cyclone 将成熟为一种强大、广泛支持的语言,在效率方面非常接近 C。如果那一天到来,你肯定会看到我永远放弃 C。” Cyclone 编译器已根据 GPL 和 LGPL 发布。你可以从 Cyclone web site 获取更多信息。
有些工具尝试在运行时检测潜在的安全缺陷,要么是为了对抗它们,要么至少是为了警告开发人员。Crispen Cowan 的许多工作,例如 StackGuard,就属于此类。
有几种工具尝试检测各种 C/C++ 内存管理问题;这些实际上是通用的软件质量改进工具,并非专门针对安全,但内存管理问题肯定会导致安全问题。一个特别强大的工具是 Valgrind,它可以检测各种内存管理问题(例如,使用未初始化的内存、在内存释放后读取/写入内存、读取/写入 malloc 分配的块的末尾以及内存泄漏)。另一个这样的工具是 Bruce Perens 的 Electric Fence (efence),它可以检测某些内存管理错误。Memwatch(公共领域)和 YAMD (GPL) 可以检测 C 和 C++ 的内存分配问题。你甚至可以使用 GNU C 库的 malloc 库的内置功能,它具有 MALLOC_CHECK_ 环境变量(有关更多信息,请参阅其手册页)。还有许多其他工具。
另一种方法是创建测试模式并运行程序,尝试查找程序中的弱点。这里介绍一些这样的工具
BFBTester,暴力二进制测试器,根据 GPL 许可。此程序对二进制程序进行快速安全检查。BFBTester 执行单参数和多参数命令行溢出以及环境变量溢出的检查。2.0 及更高版本还可以监视临时文件创建活动(以检查是否使用了不安全的临时文件名)。BFBTester 曾经无法在 Linux 上运行(由于 Linux 的 POSIX 线程实现中的技术问题),但这已在 2.0.1 版本中修复。更多信息可在 http://bfbtester.sourceforge.net/ 获取。
fuzz 程序是一个用于测试其他软件的工具。它通过用随机数据轰击被评估的程序来测试程序。此工具并非真正专门针对安全。
SPIKE 是一个“模糊器创建工具包”,即,它是一个旨在创建“随机”测试以查找安全问题的工具包。SPIKE 工具包专门为通过模拟网络协议客户端进行协议分析而设计,SPIKE proXy 是一个基于 SPIKE 构建的用于测试 Web 应用程序的工具。SPIKE 包括一些预先准备好的测试。SPIKE 根据 GPL 许可。
有许多工具试图让你深入了解正在运行的程序,这在尝试查找代码中的安全问题时也很有用。这包括符号调试器(如 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 获取。