
本书从软件安全保障的主要思路和要点出发,详细介绍了软件安全开发生命周期过程中需要考虑的安全要素。全书共9章,主要包括:第1章 综述;第2章 软件安全保障概念;第3章 安全需求和威胁建模;第4章 安全设计原则;第5章 基于组件的软件工程;第6章 安全编码;第7章 软件安全测试;第8章 安全交付和维护;第9章 通用评估准则与软件安全保障等内容。
软件规模的不断扩大,导致软件的开发、集成和维护日益复杂,与此同时,与软件安全相关的理论研究还远未成熟,软件开发还依赖于科学、实践和艺术的结合,因此,软件缺陷和漏洞无法避免;而计算机网络的迅速发展,软件运行环境的开放性、动态性、复杂性等问题日益突出,又使软件面临着严重的外部威胁,所以,构建一个安全的系统成为目前软件安全应用的当务之急。 在现实世界中,几乎没有一个软件能够证明其在任何时候都是安全的。虽然软件开发商经常会在其开发的系统上冠以“安全”的名字,以表明系统中有或多或少的安全性,但人们对于开发商所声称的“安全”往往是抱有疑问的。 对软件的信任应建立在系统的设计、实现和维护真正满足了安全需求的基础之上。对于“信任”,最直观的理解是,软件能够有效地保护资源,可以抵御预期的威胁。为了确定软件可信任的程度,需要使用一些方法和尺度,即软件安全保障。 软件安全保障是对软件满足安全需求的信心。该信心是建立在软件开发商所提供的证据基础上的,证据可以通过使用多种多样的保障技术和措施而获得,包括需求的正确性及设计、实现和维护的有效性等相关证据。这些证据可以是简单的,也可以是复杂和细粒度化的。 本书主要阐述软件安全保障相关的原理和技术,简单介绍软件安全与信息安全、硬件安全、系统安全的关系,并详细介绍软件安全开发生命周期过程中需要考虑的安全要素,包括安全需求、安全设计原则、安全编码、安全测试、安全交付和维护等。这些安全要素是目前公认的提高软件安全保障水平的有效技术措施,也是通用评估准则(CC)中安全保障组件的核心内容。本书旨在阐明软件安全保障的原则和思路,帮助软件开发人员和评估人员更好地理解通用评估准则中的安全保障要求,为软件安全开发提供有益参考。由于软件技术本身在快速发展,人们对软件安全的认知也在不断深入,因此,本书无法完全罗列软件安全相关的所有保障要素。 尽管通过反复讨论修改,但限于编者水平和其他客观条件限制,本书难免存在不足和有待商榷之处,敬请广大读者批评指正。 编 者
第1章 综述 1 1.1 编写背景 1 1.2 编写目的 4 1.3 本书结构 5 第2章 软件安全保障概念 7 2.1 软件工程 7 2.1.1 软件工程概述 7 2.1.2 软件工程基本原理 9 2.1.3 软件工程的特点 11 2.1.4 软件生命周期及生命周期模型 12 2.2 软件质量和软件质量保障 17 2.2.1 软件质量 17 2.2.2 软件质量保障 19 2.3 软件安全 21 2.3.1 信息与信息安全 21 2.3.2 软件安全概述 26 2.3.3 安全功能软件与安全软件 29 2.3.4 软件安全与硬件安全 30 2.3.5 信息系统安全与软件安全 31 2.4 软件安全保障 33 2.5 影响软件安全的要素 34 2.6 软件面临的威胁 39 2.6.1 软件漏洞的发掘 40 2.6.2 造成软件漏洞的原因 43 2.6.3 漏洞避免与安全性 45 2.6.4 通用软件漏洞数据库 46 第3章 安全需求和威胁建模 48 3.1 需求的定义与分类 48 3.1.1 软件需求 48 3.1.2 软件需求分类 50 3.1.3 软件安全需求 52 3.2 否定性和非功能性安全需求 53 3.3 安全需求的来源 55 3.4 安全需求的验证 57 3.5 安全建模方法 58 3.5.1 软件安全建模 58 3.5.2 威胁建模 60 第4章 安全设计原则 78 4.1 安全设计思想和方法 78 4.1.1 安全设计思想 78 4.1.2 安全设计方法 80 4.2 安全架构 82 4.3 安全设计原则 83 4.3.1 通用原则1:减少关键组件的数量 83 4.3.2 通用原则2:避免暴露薄弱组件和关键组件 88 4.3.3 通用原则3:减少攻击者破坏的途径 93 4.4 执行环境安全 99 4.4.1 环境等级划分:约束和隔离机制 100 4.4.2 应用程序框架 104 第5章 基于组件的软件工程 106 5.1 基于模块的软件设计 106 5.1.1 软件模块化 106 5.1.2 模块化设计的安全原则 108 5.2 COTS和OSS组件的安全问题 110 5.2.1 缺乏可见性问题 110 5.2.2 软件来源和安装问题 111 5.2.3 安全假设的有效性 113 5.2.4 休眠代码、死代码和恶意代码 113 5.3 组件的安全评估 114 5.3.1 组件的安全评估步骤 115 5.3.2 组件相关问题 117 5.4 组件的集成 117 5.5 基于组件的安全维护 118 第6章 安全编码 119 6.1 安全编码原则和实践 119 6.1.1 保持代码简洁性 119 6.1.2 遵循安全的编码指南 120 6.1.3 使用一致的编码风格 121 6.1.4 保证代码的可追溯性、可重用性和可维护性 121 6.1.5 资源分配 121 6.1.6 尽量清除状态信息 122 6.1.7 避免未经授权的特权升级 122 6.1.8 使用一致的命名规则 122 6.1.9 谨慎使用封装 123 6.1.10 权衡攻击模式 124 6.1.11 输入验证 125 6.1.12 输出过滤和“净化” 129 6.1.13 避免安全冲突 129 6.1.14 代码审查 130 6.1.15 最少反馈及检查返回 132 6.1.16 会话管理及配置参数管理 133 6.1.17 安全启动 134 6.1.18 并发控制 134 6.2 异常处理 135 6.2.1 异常识别及事件监视器 136 6.2.2 异常和失败处理 137 6.2.3 核心转储 139 6.3 安全存储和缓存管理 139 6.4 进程间通信 141 6.5 特定语言的安全问题 141 6.6 安全编码和编译工具 145 6.6.1 编译器安全检查和执行 145 6.6.2 安全的软件库 148 6.6.3 运行错误检查和安全执行 148 6.6.4 代码混淆 149 第7章 软件安全测试 150 7.1 软件测试和软件安全测试 151 7.1.1 软件测试 151 7.1.2 软件安全测试 156 7.1.3 软件测试和软件安全测试的关系 163 7.2 测试计划 164 7.2.1 测试环境和测试要求 164 7.2.2 测试时机 165 7.3 软件安全测试技术 168 7.3.1 白盒和灰盒测试技术 168 7.3.2 黑盒测试技术 172 7.4 重要的软件安全测试点 179 7.4.1 输入验证测试 179 7.4.2 缓冲区溢出测试 180 7.4.3 SQL注入缺陷控制测试 180 7.4.4 XSS脚本攻击控制测试 181 7.4.5 抗抵赖控制测试 181 7.4.6 失效控制测试 182 7.4.7 优先权提升控制测试 183 7.5 解释和使用测试结果 183 第8章 安全交付和维护 185 8.1 分发前的准备 185 8.2 安全分发 190 8.3 安全安装和配置 191 8.3.1 初始化文件安全 192 8.3.2 安全假设验证 193 8.3.3 删除所有未使用的文件 193 8.3.4 默认账户及口令更改 194 8.3.5 删除未使用的默认账户 194 8.3.6 执行环境“锁定” 195 8.3.7 设置默认安装模块 196 8.3.8 配置应用安全策略 196 8.3.9 启用最小用户身份 197 8.3.10 开启应用日志审计 197 8.3.11 数据备份 197 8.4 安全维护 197 8.4.1 漏洞管理 197 8.4.2 软件老化 199 第9章 通用评估准则与软件安全保障 201 9.1 通用评估准则的发展历史 201 9.2 通用评估准则的组成和重要概念 203 9.2.1 TOE的概念 205 9.2.2 安全目标和保护轮廓 205 9.3 安全保障要求与软件安全保障 206 附录A 术语定义 208 参考文献 216