第1章 软件安全性概论 1
1.1 都是软件惹的祸 1
1.2 安全性问题的处理 4
1.2.1 Bugtraq 6
1.2.2 GERT建议 6
1.2.3 RISKS Digest 6
1.3 影响软件安全性的技术趋势 7
1.4 ilities 10
1.4.1 安全性 11
1.4.2 可靠性 11
1.5 穿透-补丁不是好办法 12
1.6 艺术与工程 13
1.7 安全目标 14
1.7.1 预防 14
1.7.2 跟踪与审计 15
1.7.3 监控 15
1.7.4 保密性和机密性 15
1.7.5 多级安全性 16
1.7.6 匿名性 16
1.7.7 认证 17
1.7.8 完整性 18
1.8 普通软件的安全性陷阱 18
1.9 软件项目的目标 20
1.10 结束语 20
第2章 软件安全性风险管理 22
2.1 软件安全性风险管理概览 22
2.2 安全人员的角色 24
2.3 生命周期中的软件安全人员 25
2.3.1 需求获取 25
2.3.2 风险评估 26
2.3.3 安全性设计 27
2.3.4 实现 28
2.3.5 安全性测试 28
2.4 现实的权衡 29
2.5 思考安全性 30
2.6 软件风险管理的实践 30
2.6.1 当开发误入歧途时 30
2.6.2 当安全性分析误入歧途时 31
2.7 通用准则 32
2.8 结束语 34
第3章 技术的选择 35
3.1 语言的选择 35
3.2 分布式对象平台的选择 38
3.2.1 CORBA 38
3.2.2 DCOM 40
3.2.3 EJB和RMI 41
3.3 操作系统的选择 42
3.4 认证技术 43
3.4.1 基于主机的认证 44
3.4.2 物理权标 45
3.4.3 生物认证 45
3.4.4 密码认证 47
3.4.5 深度防御与认证 47
3.5 结束语 47
第4章 开放源代码与封闭源代码 48
4.1 隐晦的安全性 48
4.1.1 逆向工程 50
4.1.2 代码模糊 51
4.1.3 紧包软件的安全性 52
4.1.4 模糊安全性不是万能的 52
4.2 开放源代码 52
4.3 多眼现象 53
4.3.1 脆弱性检测是困难的 55
4.3.2 其他担心 56
4.4 关于发布密码算法 56
4.5 另外两个开放源代码的谬论 57
4.5.1 Microsoft谬论 57
4.5.2 Java谬论 57
4.6 GNU Mailman的安全性问题 58
4.7 特洛伊木马 59
4.8 开放源代码还是封闭源代码 60
4.9 另一个来自缓冲区溢出的安全性教训 60
4.10 忠告 61
4.11 结束语 62
第5章 软件安全性指导原则 63
5.1 原则1:加固最脆弱的链接 64
5.2 原则2:实行深度防护 66
5.3 原则3:失败安全 67
5.4 原则4:坚持最小优先权原则 69
5.5 原则5:分割 70
5.6 原则6:简单化 71
5.7 原则7:提高保密性 74
5.8 原则8:记住隐藏秘密是很难的 75
5.9 原则9:不要轻信 76
5.10 原则10:利用社会资源 77
5.11 结束语 78
第6章 软件稽核 79
6.1 体系结构的安全性分析 81
6.1.1 攻击树 82
6.1.2 报告分析结果 85
6.2 实现的安全性分析 86
6.2.1 源代码的稽核 86
6.2.2 源代码级的安全性稽核工具 87
6.2.3 在分析中使用RATS 88
6.2.4 软件安全性扫描的效果 90
6.3 结束语 91
第7章 缓冲区溢出 92
7.1 什么是缓冲区溢出 94
7.2 为什么缓冲区溢出是安全性问题 95
7.3 防止缓冲区溢出 97
7.4 主要的陷阱 98
7.5 内部缓冲区溢出 102
7.6 更多的输入溢出 102
7.7 其他风险 103
7.8 测试工具 104
7.9 摧毁堆和堆栈 106
7.10 堆溢出 107
7.11 堆栈溢出 111
7.11.1 破译堆栈 111
7.11.2 趋于无限 117
7.12 攻击代码 126
7.12.1 UNIX漏洞检测代码 127
7.12.2 在Windows中的情况 133
7.13 结束语 133
第8章 访问控制 134
8.1 UNLX的访问控制模式 134
8.1.1 UMLX是怎样控制权限的 135
8.1.2 修改文件属性 136
8.1.3 修改文件的归属 138
8.1.4 umask命令 139
8.1.5 程序接口 139
8.1.6 Setuid编程 141
8.2 Windows NT中的访问控制 145
8.3 分割 147
8.4 细化的特权 149
8.5 结束语 150
第9章 竞争状态 151
9.1 什么是竞争状态 151
9.2 检查时间与使用时间 154
9.2.1 攻破Passwd 156
9.2.2 避免TOCTOU问题 158
9.3 安全访问文件 160
9.4 临时文件 163
9.5 锁定文件 164
9.6 其他竞争状态 165
9.7 结束语 166
第10章 随机与惟定 167
10.1 伪随机数发生器 167
10.1.1 PRNG示例 169
10.1.2 Blum-Blum-Shub PRNG 170
10.1.3 Tiny PRNG 171
10.1.4 攻击PRNG 171
10.1.5 在在线游戏中作弊 172
10.1.6 PRNG的统计测试 173
10.2 熵的收集和估计 174
10.2.1 硬件方案 174
10.2.2 软件方案 176
10.2.3 糟糕的熵收集示例 182
10.3 处理熵 183
10.4 实际应用的随机资源 185
10.4.1 Tiny 186
10.4.2 Windows中的随机数 186
10.4.3 Linux中的随机数 187
10.4.4 Java中的随机数 189
10.5 结束语 190
第11章 密码学的应用 192
11.1 一般建议 192
11.1.1 软件开发人员并不是密码学专家 192
11.1.2 数据的完整性 194
11.1.3 密码出口的有关法律 194
11.2 常用的密码库 195
11.2.1 Cryptilb 195
11.2.2 OpenSSL 196
11.2.3 Crypto++ 197
11.2.4 BSAFE 198
11.2.5 Cryptix 199
11.3 密码术编程 200
11.3.1 加密 200
11.3.2 散列运算 205
11.3.3 公钥密码加密 206
11.3.4 多线程 210
11.3.5 加密cookie 210
11.4 密码散列算法的更多应用 212
11.5 SSL和TLS 213
11.6 使用Stunnel 215
11.7 一次一密 216
11.8 结束语 219
第12章 信任管理和输入的有效性 220
12.1 关于信任 220
12.2 不恰当信任的示例 222
12.2.1 信任是可传递的 222
12.2.2 防御恶意的访问者 225
12.2.3 安全调用另一个程序 228
12.2.4 网页上的危险 231
12.2.5 客户端的安全 233
12.2.6 Perl中的问题 235
12.2.7 格式串攻击 236
12.3 自动探测输入问题 237
12.4 结束语 240
第13章 口令认证 241
13.1 口令的存储 241
13.2 向口令数据库添加用户 244
13.3 口令认证 253
13.4 选择口令 258
13.4.1 更多的建议 259
13.4.2 掷骰子 259
13.4.3 口令短语 264
13.4.4 应用程序选择的口令 264
13.5 一次性口令 266
13.6 结束语 278
第14章 数据库安全性 279
14.1 基础知识 279
14.2 访问控制 280
14.3 在访问控制中使用视图 282
14.4 保护域 284
14.5 抵抗统计攻击 287
14.6 结束语 290
第15章 客户端安全性 292
15.1 版权保护机制 294
15.1.1 许可证文件 301
15.1.2 挫败普通盗版者 302
15.1.3 许可证的其他特性 303
15.1.4 其他版权保护方法 304
15.1.5 对不可信客户机的身份认证 305
15.2 防篡改技术 306
15.2.1 反调试程序方法 306
15.2.2 检查和 307
15.2.3 对滥用的响应 308
15.2.4 引诱 309
15.3 代码迷惑技术 310
15.3.1 基本迷惑技术 310
15.3.2 对部分程序进行加密 311
15.4 结束语 313
第16章 通过防火墙 314
16.1 基本策略 314
16.2 客户机代理 316
16.3 服务器代理 317
16.4 SOCKS 318
16.5 点对点 319
16.6 结束语 321
附录A 密码学基础 322
A.1 密码学的最终目标 322
A.2 对密码术的攻击 324
A.3 密码术的类型 325
A.4 对称密码术 325
A.4.1 对称算法的类型 326
A.4.2 对称算法的安全性 327
A.5 公钥密码术 329
A.6 密码散列算法 333
A.6.1 对散列算法的其他攻击 336
A.6.2 好的散列算法 337
A.7 数字签名 337
A.8 结束语 338
参考文献 339