第1部分 对SDL的需求 3
第1章 适可而止:威胁正在悄然改变 3
1.1 遍布安全和隐私冲突的世界 5
1.2 影响安全的另一因素:可靠性 8
1.3 事关质量 10
1.4 主要的软件开发商为什么需要开发更安全的软件 11
1.5 内部软件开发人员为什么需要开发更安全的软件 12
1.6 小型软件开发者为什么需要开发更安全的软件 12
1.7 总结 13
参考文献 13
第2章 当前软件开发方法不足以生成安全的软件 17
2.1 “只要给予足够的关注,所有的缺陷都将无处遁形” 18
2.1.1 审核代码的动力 18
2.1.2 理解安全bug 19
2.1.3 人员数量 19
2.1.4 “关注越多”越容易失去要点 20
2.2 专利软件开发模式 21
2.3 敏捷开发模式 22
2.4 通用评估准则 22
2.5 总结 23
参考文献 24
第3章 微软SDL简史 27
3.1 前奏 27
3.2 新威胁,新对策 29
3.3 Windows 2000和Secure Windows Initiative 30
3.4 追求可度量性:贯穿Windows XP 32
3.5 安全推进和最终安全评审(FSR) 33
3.6 形成软件安全开发生命周期 36
3.7 持续的挑战 37
参考文献 38
第4章 管理层的SDL 41
4.1 成功的承诺 41
4.1.1 微软的承诺 41
4.1.2 你是否需要SDL? 43
4.1.3 有效承诺 45
4.2 管理SDL 48
4.2.1 资源 48
4.2.2 项目是否步入正轨? 50
4.3 总结 51
参考文献 51
第2部分 软件安全开发生命周期过程 55
第5章 第0阶段:教育和意识 55
5.1 微软安全教育简史 56
5.2 持续教育 58
5.3 培训交付类型 60
5.4 练习与实验 61
5.5 追踪参与度与合规度 62
5.6 度量知识 63
5.7 实现自助培训 63
5.8 关键成功因子与量化指标 64
5.9 总结 65
参考文献 65
第6章 第1阶段:项目启动 67
6.1 判断软件安全开发生命周期是否覆盖应用 67
6.2 任命安全顾问 68
6.2.1 担任开发团队与安全团队之间沟通的桥梁 69
6.2.2 召集开发团队举行SDL启动会议 70
6.2.3 对开发团队的设计与威胁模型进行评审 70
6.2.4 分析并对bug进行分类,如安全类和隐私类 70
6.2.5 担任开发团队的安全传声筒 71
6.2.6 协助开发团队准备最终安全审核 71
6.2.7 与相应安全团队协同工作 71
6.3 组建安全领导团队 71
6.4 确保在bug跟踪管理过程中包含有安全与隐私类bug 72
6.5 建立“bug标准” 74
6.6 总结 74
参考文献 74
第7章 第2阶段:定义并遵从设计最佳实践 75
7.1 常见安全设计原则 76
7.2 受攻击面分析与降低 78
7.2.1 第一步:该特性真的有那么重要么? 81
7.2.2 第二步:究竟谁需要从哪里访问这些功能? 82
7.2.3 第三步:降低特权 83
7.2.4 其他受攻击面组成部分 85
7.3 总结 89
参考文献 90
第8章 第3阶段:产品风险评估 93
8.1 安全风险评估 94
8.1.1 安装问题 94
8.1.2 受攻击面问题 94
8.1.3 移动代码问题 95
8.1.4 安全特性相关问题 95
8.1.5 常规问题 95
8.1.6 分析问卷 96
8.2 隐私影响分级 96
8.2.1 隐私分级1 98
8.2.2 隐私分级2 98
8.2.3 隐私分级3 98
8.3 统一各种因素(Pulling It All Together) 98
8.4 总结 99
参考文献 99
第9章 第4阶段:风险分析 101
9.1 威胁建模产物(Artifact) 103
9.2 对什么进行建模 104
9.3 创建威胁模型 104
9.4 威胁建模过程 105
9.4.1 定义应用场景 105
9.4.2 收集外部依赖列表 106
9.4.3 定义安全假设 106
9.4.4 创建外部安全备注 107
9.4.5 绘制待建模应用的一个或多个数据流图(DFD) 110
9.4.6 确定威胁类型 114
9.4.7 识别系统威胁 116
9.4.8 判断风险 121
9.4.9 规划消减措施 124
9.5 利用威胁模型辅助代码评审 128
9.6 利用威胁模型辅助测试 129
9.7 关键成功因子和指标 129
9.8 总结 130
参考文献 130
第10章 第5阶段:创建安全文档、工具以及客户最佳实践 133
10.1 为什么需要文档和工具? 135
10.2 创建指导性安全最佳实践文档 135
10.2.1 安装文档 136
10.2.2 主线产品使用文档 136
10.2.3 帮助文档 138
10.2.4 开发人员文档 138
10.3 创建工具 139
10.4 总结 140
参考文献 140
第11章 第6阶段:安全编码策略 143
11.1 使用最新版本编译器与支持工具 143
11.2 使用编译器内置防御特性 144
11.2.1 缓冲区安全检查:/GS 144
11.2.2 安全异常处理:/SAFESEH 144
11.2.3 数据执行防护兼容性:/NXCOMPAT 145
11.3 使用源代码分析工具 145
11.3.1 源代码分析工具陷阱 145
11.3.2 源代码分析工具的益处 146
11.4 切勿使用违禁函数 148
11.5 减少潜在可被利用的编码结构或设计 149
11.6 使用安全编码检查清单 150
11.7 总结 150
参考文献 150
第12章 第7阶段:安全测试策略 153
12.1 模糊测试 153
12.1.1 模糊操作文件格式 154
12.1.2 网络协议模糊操作 160
12.1.3 零散模糊测试 163
12.1.4 通过模糊测试修复发现的bug 163
12.2 渗透测试 164
12.3 运行时验证 165
12.4 必要时审核并更新威胁模型 165
12.5 重估软件的受攻击面 166
12.6 总结 166
参考文献 166
第13章 第8阶段:安全推进活动 169
13.1 准备安全推进活动 170
13.2 培训 171
13.3 代码评审 172
13.4 威胁模型更新 174
13.5 安全测试 175
13.6 受攻击面Scrub 175
13.7 文档Scrub 176
13.8 是否已足够? 177
13.9 总结 178
参考文献 179
第14章 第9阶段:最终安全评审 181
14.1 产品团队协调 182
14.2 威胁模型评审 182
14.3 未修复的安全bug评审 183
14.4 工具有效性验证 184
14.5 在最终安全评审完成之后 184
14.6 总结 185
第15章 第10阶段:安全响应规划 187
15.1 为什么准备响应? 187
15.1.1 你的开发团队一定会出错 187
15.1.2 新漏洞一定会出现 188
15.1.3 规则一定会发生变化 189
15.2 准备响应 190
15.3 安全响应与开发团队 208
15.3.1 组建你的响应团队 208
15.3.2 支持你的全线产品 209
15.3.3 支持你的所有客户 210
15.3.4 使你的产品具备更新能力 211
15.3.5 在研究人员之前找到漏洞 212
15.4 总结 213
参考文献 213
第16章 第11阶段:产品发布 215
参考文献 215
第17章 第12阶段:安全响应执行 217
17.1 遵从你的计划 217
17.1.1 保持冷静 217
17.1.2 欲速则不达 218
17.1.3 留意可能改变计划的事件 219
17.1.4 遵从你的计划 220
17.2 尽你所能补救 220
17.2.1 知道该联络何人 220
17.2.2 能创建更新 220
17.2.3 能安装更新 221
17.2.4 明确轻重缓急 221
17.3 深谙取舍之道 221
17.4 总结 222
参考文献 222
第3部分 SDL参考资料 225
第18章 在敏捷模式中集成SDL 225
18.1 在敏捷模式中进行SDL实践活动 226
18.1.1 安全教育 226
18.1.2 项目开始 226
18.1.3 建立并遵从设计最佳实践 227
18.1.4 风险分析 227
18.1.5 创建安全文档、工具以及客户最佳实践 229
18.1.6 安全编码与测试策略 229
18.1.7 安全推进 231
18.1.8 最终安全评审 232
18.1.9 产品发布 233
18.1.10 安全响应执行 233
18.2 利用SDL实践增强敏捷模式 234
18.2.1 用户story 235
18.2.2 小发布与迭代 236
18.2.3 人员轮换 236
18.2.4 简化 236
18.2.5 冲刺(Spike)解决方案 236
18.2.6 重构 237
18.2.7 常规客户可用性 237
18.2.8 依据标准编码 237
18.2.9 优先编写单元测试 238
18.2.10 配对编程 238
18.2.11 多次集成 238
18.2.12 将优化留到最后 238
18.2.13 一旦发现一个bug,就创建一个测试 239
18.3 总结 239
参考文献 239
第19章 SDL违禁函数调用 241
19.1 违禁API 242
19.2 为什么“n”函数会被禁止 245
19.3 重要告诫 246
19.4 选择StrSafe vs.Safe CRT 246
19.5 使用StrSafe 246
19.6 使用Safe CRT 247
19.7 其他替代函数 248
19.8 工具支持 248
19.9 ROI和成本影响 249
19.10 度量和目标 249
参考文献 249
第20章 SDL最低加密标准 251
20.1 高级加密需求 251
20.1.1 加密技术vs低级加密算法 251
20.1.2 使用加密库 252
20.1.3 加密敏捷度 252
20.1.4 默认安全加密算法 253
20.2 加密算法的用法 253
20.2.1 对称块密码与密钥长度 254
20.2.2 对称流密码与密钥长度 254
20.2.3 对称算法模式 255
20.2.4 非对称算法与密钥长度 255
20.2.5 哈希函数 255
20.2.6 消息认证码 256
20.3 数据存储以及随机数生成 256
20.3.1 存储私钥以及敏感数据 256
20.3.2 生成随机数与密钥 257
20.3.3 使用密码或者其他密钥来生成随机数和加密密钥 257
参考文献 257
第21章 SDL必备工具以及编译器选项 259
21.1 必备工具 259
21.1.1 PREfast 259
21.1.2 FxCop 263
21.1.3 应用验证器(Application Verifier) 265
21.1.4 最小编译器与Build工具版本 267
参考文献 268
第22章 威胁树模式 269
22.1 假冒一个外部实体或过程 271
22.2 篡改一个过程 273
22.3 篡改一个数据流 274
22.4 篡改一个数据存储 276
22.5 抵赖 278
22.6 过程信息泄露 280
22.7 数据流信息泄露 281
22.8 数据存储的信息泄露 282
22.9 针对过程的拒绝服务 284
22.10 针对数据流的拒绝服务 285
22.11 针对数据存储的拒绝服务 286
22.12 特权提升 287
参考文献 288