软件安全缺陷包括堆栈溢出、指针越界、指针未初始化、指针释放后引用、多次内存释放、整数溢出、浮点数溢出、格式化输出泄露、格式化输出写、竞争条件和接口误用等。另外,软件安全缺陷还有与软件业务相关的逻辑缺陷和设计缺陷,该类缺陷的发现依赖于专家知识和经验,且其测试的自动化程度低,难以发现。
软件安全测试分为白盒测试、黑盒测试和灰盒测试。代码审计是典型的白盒测试技术,根据安全编程规范和软件业务逻辑,审查关注的代码区域和代码交叉引用,发现其中可能的缺陷。这种审查可以由编译器自动完成,或者审查工具自动实现,或者人工检视。代码审计的好处是覆盖率高,但存在误报,无法对闭源软件进行审查。黑盒测试把软件当作一个黑盒子,选择不同的输入,观察软件的执行和输出。如果测试结果符合预期,其测试用例引发软件崩溃,则发现了软件的缺陷。模糊测试就是一种典型的黑盒测试技术,通过向软件提供非预期的输入并监控输出中的异常来发现软件缺陷的方法,它分为基于变异的模糊测试和基于生成的模糊测试,前者是对已有测试用例变异产生新的测试用例,后者是利用已有的文件模板或者协议模板根据语法规则自动生成新的测试用例。黑盒测试比较简单,其结果根据安全策略是明确的,其不足是不够聪明、耗时长,难以发现深层的缺陷。灰盒测试是介于白盒测试与黑盒测试之间的混合测试技术,借助反汇编器、反编译器、调试器和模拟器等。解析出二进制软件中的关键代码、数据流和控制流,然后实施代码审计,并指导模糊测试。灰盒测试具有较好的可用性和较高的覆盖率,但逆向分析比较复杂。
软件安全测试涉及对文档、规范、标准、配置和代码的测试,其测试技术涉及控制流分析、数据流分析、符号执行、污点分析、程序切片、逆向分析和代码插桩等,其测试时间点会覆盖软件产品的整个生命周期。对软件安全而言,测试工作是一项持续的工程,没有最好,只有更好。