第1章 理解软件安全开发 1
1.1 信息安全面临的困境 1
1.2 软件安全基本概念 2
1.2.1 软件的定义 2
1.2.2 软件安全错误 2
1.2.3 软件安全的定义 3
1.3 软件安全属性刻画 5
1.3.1 保密性 5
1.3.2 完整性 5
1.3.3 可用性 6
1.3.4 认证性 7
1.3.5 授权 7
1.3.6 可记账性/审计性 8
1.3.7 抗抵赖性 8
1.3.8 可控性 9
1.3.9 可信性 9
1.4 信息产品的安全性评估标准 9
1.5 系统安全工程 11
1.6 系统安全工程能力成熟度模型 11
1.7 属性驱动的软件安全开发的基本思想 12
1.7.1 软件安全开发方法 13
1.7.2 软件定义安全 13
1.7.3 属性驱动的软件安全开发方法 16
1.8 本章小结 17
第2章 将安全嵌入软件开发整个生命周期 18
2.1 系统安全开发方法的进化史 18
2.2 软件安全开发模型 19
2.2.1 启发式软件安全开发模型 19
2.2.2 软件安全生命周期开发模型 20
2.3 微软的SDL模型 23
2.3.1 传统的系统开发瀑布模型 23
2.3.2 软件安全开发生命周期模型SDL 23
2.3.3 敏捷的SDL 25
2.3.4 ISO/IEC 27034 28
2.4 McGraw的软件安全开发模型 30
2.4.1 McGraw的七个接触点模型BSI 30
2.4.2 软件安全开发成熟度模型BSIMM 31
2.5 OWASP的软件安全开发模型 34
2.5.1 CLASP 34
2.5.2 SAMM 37
2.6 NIST的软件安全开发生命周期模型 39
2.7 属性驱动的软件安全开发生命周期模型 41
2.8 本章小结 41
第3章 软件安全需求分析 42
3.1 概述 42
3.1.1 基本内涵 42
3.1.2 安全需求的来源 44
3.1.3 软件安全需求的内容 45
3.2 核心软件安全需求 46
3.2.1 保密性需求 46
3.2.2 完整性需求 48
3.2.3 可用性需求 49
3.2.4 认证需求 50
3.2.5 授权需求 53
3.2.6 可记账性/审计需求 57
3.3 通用软件安全需求 58
3.3.1 安全架构需求 58
3.3.2 会话管理需求 58
3.3.3 错误和例外管理需求 59
3.3.4 配置参数管理需求 59
3.4 运维安全需求 60
3.4.1 环境部署需求 61
3.4.2 归档需求 61
3.4.3 反盗版需求 62
3.5 其他安全需求 62
3.5.1 顺序和时间需求 62
3.5.2 国际性需求 63
3.5.3 采购需求 64
3.6 软件安全需求获取方法 64
3.6.1 软件安全需求获取的概念 64
3.6.2 头脑风暴 65
3.6.3 问卷调查和访谈 65
3.6.4 策略分解 66
3.6.5 数据分类 68
3.6.6 主/客体关系矩阵 70
3.6.7 使用用例和滥用案例建模 71
3.7 软件安全需求跟踪矩阵 72
3.8 本章小结 72
第4章 软件安全保障设计 73
4.1 概述 73
4.1.1 软件安全设计的概念 73
4.1.2 软件安全设计的基本原则 73
4.1.3 平衡安全设计原则 80
4.2 属性驱动的软件安全设计 81
4.3 软件安全架构设计 82
4.3.1 康威定律 83
4.3.2 软件安全架构的设计方法 83
4.3.3 攻击面评估 84
4.3.4 威胁建模 85
4.3.5 风险分析 92
4.3.6 软件架构的选择 97
4.3.7 软件架构的安全考虑 104
4.3.8 与现有架构的集成 106
4.4 基于核心安全需求的软件安全设计 106
4.4.1 保密性设计 106
4.4.2 完整性设计 112
4.4.3 可用性设计 115
4.4.4 认证设计 116
4.4.5 授权设计 117
4.4.6 可记账性/审计设计 117
4.5 其他安全需求设计 118
4.5.1 接口安全设计 118
4.5.2 互联互通性 120
4.6 软件安全技术 120
4.6.1 认证 121
4.6.2 身份管理 121
4.6.3 凭证管理 123
4.6.4 流控制 127
4.6.5 防火墙和网络代理 128
4.6.6 中间件 129
4.6.7 排队基础设施和技术 129
4.6.8 日志与审计 130
4.6.9 入侵检测系统 131
4.6.10 入侵防御系统 132
4.6.11 数据丢失保护 132
4.6.12 虚拟化 133
4.6.13 数字版权管理 134
4.6.14 可信计算 136
4.6.15 数据库安全 138
4.6.16 编程语言环境 145
4.6.17 公共语言运行库 148
4.6.18 Java虚拟机 149
4.6.19 编译器选项 150
4.6.20 操作系统安全 150
4.6.21 嵌入式系统安全 151
4.7 安全架构与设计检查 153
4.8 本章小结 153
第5章 编写安全的代码 154
5.1 概述 154
5.1.1 漏洞的基本概念 155
5.1.2 漏洞分类 155
5.1.3 漏洞产生的原因 156
5.1.4 通用软件漏洞数据库 157
5.1.5 软件安全编码实践与控制 160
5.2 常见软件漏洞类型分析与防御方法 161
5.2.1 缓冲区溢出 161
5.2.2 注入缺陷 165
5.2.3 认证和会话管理 169
5.2.4 跨站脚本攻击XSS 172
5.2.5 不安全的直接对象引用 175
5.2.6 安全配置错误 177
5.2.7 敏感数据泄露 178
5.2.8 加密机制本身的安全问题 184
5.2.9 缺少功能级检查 186
5.2.10 跨站请求伪造CSRF 187
5.2.11 使用已知漏洞组件 190
5.2.12 未经验证的重定向和转发 191
5.2.13 文件攻击 192
5.2.14 竞争条件 195
5.2.15 边信道攻击 196
5.3 软件安全编码实践 199
5.3.1 输入验证 199
5.3.2 标准化 201
5.3.3 数据净化 201
5.3.4 错误处理 203
5.3.5 安全的API 204
5.3.6 内存管理 204
5.3.7 例外管理 208
5.3.8 会话管理 209
5.3.9 配置参数管理 209
5.3.10 安全启动 210
5.3.11 加密机制的安全保护 210
5.3.12 并发控制 213
5.3.13 标签化 214
5.3.14 沙箱 214
5.3.15 防篡改技术 215
5.4 软件安全编码保证过程 216
5.4.1 选择安全的编程语言 217
5.4.2 版本(配置)管理 217
5.4.3 代码分析 218
5.4.4 代码评审 219
5.4.5 构建安全的软件编译环境 221
5.5 本章小结 222
第6章 软件安全测试 223
6.1 概述 223
6.1.1 软件安全测试的定义和目的 223
6.1.2 软件安全测试的基本内涵 224
6.1.3 软件安全测试框架 226
6.1.4 软件安全测试方法 227
6.1.5 从攻击者角度思考 228
6.2 软件安全功能测试 229
6.2.1 保密性测试 229
6.2.2 完整性测试 230
6.2.3 可用性测试 233
6.2.4 认证性测试 234
6.2.5 授权测试 235
6.2.6 可记账性/审计测试 236
6.3 软件安全漏洞测试 236
6.3.1 攻击面验证 237
6.3.2 环境测试 237
6.3.3 模拟测试 238
6.4 其他测试 239
6.4.1 性能测试 239
6.4.2 可扩展性测试 240
6.4.3 隐私测试 240
6.5 软件安全功能测试方法 241
6.5.1 单元测试 241
6.5.2 集成测试 242
6.5.3 回归测试 242
6.5.4 系统测试 243
6.5.5 逻辑测试 243
6.5.6 用户接收测试 244
6.6 软件安全漏洞测试方法 245
6.6.1 源代码测试 246
6.6.2 白盒测试 246
6.6.3 黑盒测试 247
6.6.4 Fuzzing测试 248
6.6.5 扫描 250
6.6.6 渗透测试 253
6.6.7 静态测试 256
6.6.8 动态测试 256
6.7 几种重要的软件安全漏洞控制测试 256
6.7.1 输入验证测试 256
6.7.2 缓冲区溢出控制测试 257
6.7.3 SQL注入缺陷控制测试 258
6.7.4 XSS脚本攻击控制测试 258
6.7.5 抗抵赖控制测试 259
6.7.6 假冒控制测试 259
6.7.7 失效控制测试 259
6.7.8 优先权提升控制测试 260
6.7.9 抗逆向工程保护测试 261
6.7.10 Web应用漏洞测试 261
6.8 测试过程模型 261
6.8.1 软件安全测试基本过程 262
6.8.2 V模型 263
6.8.3 W模型 263
6.8.4 X模型 264
6.8.5 H模型 265
6.8.6 前置测试模型 265
6.8.7 基于软件开发生命周期的测试 266
6.9 测试数据的管理 269
6.9.1 漏洞报告和跟踪 271
6.9.2 漏洞影响评估与修复 275
6.10 常见的软件安全测试工具 276
6.11 本章小结 276
附录A 软件安全开发生命周期模型 277
附录B 常见的HTTP状态代码和原因解释 279
附录C 用于输入验证的正则表达式语法 281
附录D 常用软件安全测试工具 284
参考文献 286