在日益严峻的信息安全背景下,软件的安全性已经成为信息安全问题的重中之重。本书针对信息安全领域这一核心问题,站在软件开发过程控制的视角,从系统工程基本理论思想出发,借鉴当前国际最先进的软件安全开发的理论和方法,提出安全属性驱动的软件开发方法。
在日益严峻的信息安全背景下,软件的安全性已经成为信息安全问题的重中之重。本书针对信息安全领域这一核心问题,站在软件开发过程控制的视角,从系统工程基本理论思想出发,借鉴当前国际先进的软件安全开发的理论和方法,提出安全属性驱动的软件开发方法。全书以软件安全属性为核心,将安全属性贯穿于软件开发生命周期的每一个阶段,通过对软件开发生命周期全过程的安全质量管理和控制,以期减少开发过程中可能产生的各种漏洞,提高软件产品的本质安全性。全书共分为6章,第1章是软件安全开发相关的基本概念,第2章介绍了软件安全开发方法的历史演化进程以及一些典型的软件安全开发模型,第3章基于需求工程原理阐述了软件安全属性需求获取方法,第4章从系统架构角度出发阐述了软件安全架构的设计方法以及相关安全技术,第5章介绍了软件开发编码过程中的安全问题,第6章对于软件安全性测试进行了全面的阐述。本书的特点是既注重系统性和科学性,又注重实用性,系统性地介绍软件开发生命周期全过程的安全质量保证方法,可作为软件开发组织者、系统分析师、软件架构师、软件设计人员、开发人员、测试人员、系统运维人员以及软件相关专业的在校大学生和研究生学习与实践的较好的参考书。
第1章 理解软件安全开发 1
1.1 信息安全面临的困境 1
1.2 软件安全基本概念 2
1.2.1 软件定义 2
1.2.2 软件安全错误 2
1.2.3 软件安全的定义 3
1.3 软件安全属性刻画 4
1.3.1 保密性 4
1.3.2 完整性 5
1.3.3 可用性 5
1.3.4 认证性 6
1.3.5 授权 6
1.3.6 可记账性/审计性 7
1.3.7 抗抵赖性 7
1.3.8 可控性 8
1.3.9 可信性 8
1.4 信息产品的安全性评估标准 8
1.5 系统安全工程 9
1.6 系统安全工程能力成熟度模型 10
1.7 属性驱动的软件安全开发的基本思想 11
1.7.1 软件安全开发方法 11
1.7.2 软件定义安全 11
1.7.3 属性驱动的软件安全开发方法 14
1.8 本章小结 14
第2章 将安全嵌入软件开发整个生命周期 16
2.1 系统安全开发方法的进化史 16
2.2 软件安全开发模型 17
2.2.1 启发式软件安全开发模型 17
2.2.2 软件安全生命周期开发模型 18
2.3 微软的SDL模型 20
2.3.1 传统的系统开发瀑布模型 20
2.3.2 软件安全开发生命周期模型SDL 20
2.3.3 敏捷的SDL 23
2.3.4 ISO/IEC 27034 25
2.4 McGraw的软件安全开发模型 26
2.4.1 McGraw的七个接触点模型BSI 26
2.4.2 软件安全开发成熟度模型BSIMM 27
2.5 OWASP的软件安全开发模型 30
2.5.1 CLASP 30
2.5.2 SAMM 33
2.6 NIST的软件安全开发生命周期 34
2.7 属性驱动的软件安全开发生命周期模型 36
2.8 本章小结 36
第3章 软件安全需求分析 37
3.1 概述 37
3.1.1 基本内涵 37
3.1.2 安全需求的来源 39
3.1.3 软件安全需求的内容 39
3.2 核心软件安全需求 40
3.2.1 保密性需求 40
3.2.2 完整性需求 42
3.2.3 可用性需求 43
3.2.4 认证需求 44
3.2.5 授权需求 46
3.2.6 可记账性/审计需求 50
3.3 通用软件安全需求 51
3.3.1 安全架构需求 51
3.3.2 会话管理需求 51
3.3.3 错误和例外管理需求 52
3.3.4 配置参数管理需求 52
3.4 运维安全需求 52
3.4.1 环境部署需求 53
3.4.2 归档需求 54
3.4.3 反盗版需求 54
3.5 其他安全需求 55
3.5.1 顺序和时间需求 55
3.5.2 国际性需求 55
3.5.3 采购需求 56
3.6 软件安全需求获取方法 57
3.6.1 软件安全需求获取的概念 57
3.6.2 头脑风暴 57
3.6.3 问卷调查和访谈 58
3.6.4 策略分解 58
3.6.5 数据分类 60
3.6.6 主/客体关系矩阵 62
3.6.7 使用用例和滥用案例建模 62
3.7 软件安全需求跟踪矩阵 63
3.8 本章小结 64
第4章 软件安全保障设计 65
4.1 概述 65
4.1.1 软件安全设计的概念 65
4.1.2 软件安全设计的基本原则 65
4.1.3 平衡安全设计原则 71
4.2 属性驱动的软件安全设计 72
4.3 软件安全架构设计 73
4.3.1 康威定律 73
4.3.2 软件安全架构的设计方法 74
4.3.3 攻击面评估 75
4.3.4 威胁建模 75
4.3.5 风险分析 82
4.3.6 软件架构的选择 86
4.3.7 软件架构的安全考虑 92
4.3.8 与现有架构的集成 93
4.4 基于核心安全需求的软件安全设计 94
4.4.1 保密性设计 94
4.4.2 完整性设计 99
4.4.3 可用性设计 101
4.4.4 认证设计 102
4.4.5 授权设计 103
4.4.6 可记账性/审计设计 103
4.5 其他安全需求设计 104
4.5.1 接口安全设计 104
4.5.2 互联互通性 106
4.6 软件安全技术 106
4.6.1 认证 106
4.6.2 身份管理 107
4.6.3 凭证管理 109
4.6.4 流控制 112
4.6.5 防火墙和网络代理 113
4.6.6 中间件 114
4.6.7 排队基础设施和技术 114
4.6.8 日志与审计 114
4.6.9 入侵检测系统 115
4.6.10 入侵防御系统 116
4.6.11 数据丢失保护 116
4.6.12 虚拟化 117
4.6.13 数字版权管理 118
4.6.14 可信计算 120
4.6.15 数据库安全 121
4.6.16 编程语言环境 128
4.6.17 公共语言运行库 130
4.6.18 Java虚拟机 131
4.6.19 编译器选项 132
4.6.20 操作系统安全 132
4.6.21 嵌入式系统安全 133
4.7 安全架构与设计检查 134
4.8 本章小结 135
第5章 编写安全的代码 136
5.1 概述 136
5.1.1 漏洞的基本概念 136
5.1.2 漏洞分类 137
5.1.3 漏洞产生的原因 138
5.1.4 通用软件漏洞数据库 139
5.1.5 软件安全编码实践与控制 141
5.2 常见软件漏洞类型分析与防御方法 142
5.2.1 缓冲区溢出 142
5.2.2 注入缺陷 145
5.2.3 认证和会话管理 149
5.2.4 跨站脚本攻击XSS 152
5.2.5 不安全的直接对象引用 154
5.2.6 安全配置错误 156
5.2.7 敏感数据泄露 157
5.2.8 加密机制本身的安全问题 162
5.2.9 缺少功能级检查 163
5.2.10 跨站请求伪造CSRF 164
5.2.11 使用已知漏洞组件 167
5.2.12 未经验证的重定向和转发 167
5.2.13 文件攻击 168
5.2.14 竞争条件 171
5.2.15 边信道攻击 172
5.3 软件安全编码实践 174
5.3.1 输入验证 174
5.3.2 标准化 176
5.3.3 数据净化 177
5.3.4 错误处理 178
5.3.5 安全的API 178
5.3.6 内存管理 179
5.3.7 例外管理 182
5.3.8 会话管理 183
5.3.9 配置参数管理 183
5.3.10 安全启动 184
5.3.11 加密机制的安全保护 184
5.3.12 并发控制 186
5.3.13 标签化 187
5.3.14 沙箱 188
5.3.15 防篡改技术 188
5.4 软件安全编码保证过程 190
5.4.1 选择安全的编程语言 190
5.4.2 版本(配置)管理 190
5.4.3 代码分析 191
5.4.4 代码评审 192
5.4.5 构建安全的软件编译环境 194
5.5 本章小结 195
第6章 软件安全测试 196
6.1 概述 196
6.1.1 软件安全测试的定义和目的 196
6.1.2 软件安全测试的基本内涵 196
6.1.3 软件安全测试框架 199
6.1.4 软件安全测试方法 200
6.1.5 从攻击者角度思考 201
6.2 软件安全功能测试 201
6.2.1 保密性测试 201
6.2.2 完整性测试 202
6.2.3 可用性测试 205
6.2.4 认证性测试 206
6.2.5 授权测试 207
6.2.6 可记账性/审计测试 207
6.3 软件安全漏洞测试 208
6.3.1 攻击面验证 208
6.3.2 环境测试 208
6.3.3 模拟测试 209
6.4 其他测试 210
6.4.1 性能测试 210
6.4.2 可扩展性测试 211
6.4.3 隐私测试 211
6.5 软件安全功能测试方法 212
6.5.1 单元测试 212
6.5.2 集成测试 213
6.5.3 回归测试 213
6.5.4 系统测试 214
6.5.5 逻辑测试 214
6.5.6 用户接收测试 215
6.6 软件安全漏洞测试方法 216
6.6.1 源代码测试 216
6.6.2 白盒测试 216
6.6.3 黑盒测试 217
6.6.4 Fuzzing测试 218
6.6.5 扫描 219
6.6.6 渗透测试 222
6.6.7 静态测试 224
6.6.8 动态测试 225
6.7 几种重要的软件安全漏洞控制测试 225
6.7.1 输入验证测试 225
6.7.2 缓冲区溢出控制测试 226
6.7.3 SQL注入缺陷控制测试 226
6.7.4 XSS脚本攻击控制测试 227
6.7.5 抗抵赖控制测试 227
6.7.6 假冒控制测试 228
6.7.7 失效控制测试 228
6.7.8 优先权提升控制测试 228
6.7.9 抗逆向工程保护测试 229
6.7.10 Web应用漏洞测试 229
6.8 测试过程模型 230
6.8.1 软件安全测试基本过程 230
6.8.2 V模型 231
6.8.3 W模型 231
6.8.4 X模型 232
6.8.5 H模型 232
6.8.6 前置测试模型 233
6.8.7 基于软件开发生命周期的测试 234
6.9 测试数据的管理 236
6.9.1 漏洞报告和跟踪 238
6.9.2 漏洞影响评估与修复 242
6.10 常见的软件安全测试工具 242
6.11 本章小结 242
附录A 软件安全开发生命周期模型 243
附录B 常见的HTTP状态代码和原因解释 245
附录C 用于输入验证的正则表达式语法 247
附录D 常用软件测试工具 249
参考文献 251