第1章 软件安全概论 1
1.1都是软件惹的祸 1
1.2对安全问题的处理 4
1.2.1 Bugtraq 5
1.2.2 CERT公告 5
1.2.3 RISKS文摘 6
1.3影响软件安全的技术趋势 6
1.4非功能性需求 9
1.4.1什么是安全 10
1.4.2难道只是可靠性 10
1.5.“渗透-修补”是个坏方法 11
1.6艺术和工程 12
1.7安全目标 12
1.7.1预防 13
1.7.2跟踪与审计 13
1.7.3监控 13
1.7.4隐私和保密 14
1.7.5多级安全 14
1.7.6匿名 14
1.7.7认证 15
1.7.8完整性 16
1.8常见软件安全缺陷 16
1.9软件项目目标 17
1.10结论 18
第2章 软件安全风险管理 19
2.1软件安全风险管理概述 19
2.2安全人员的任务 21
2.3软件生命周期中的软件安全人员 22
2.3.1获取需求 22
2.3.2风险评估 23
2.3.3安全设计 24
2.3.4实现 25
2.3.5安全测试 25
2.4现实的权衡 26
2.5让人们去思考安全性 26
2.6软件风险管理实践 26
2.6.1当开发走向歧途 27
2.6.2当安全分析走向歧途 27
2.7通用准则 28
2.8结论 30
第3章 技术的选择 31
3.1语言的选择 31
3.2分布式对象平台的选择 34
3.2.1 COBRA 34
3.2.2 DCOM 35
3.2.3 EJB和RMI 37
3.3操作系统的选择 37
3.4认证技术 38
3.4.1基于主机的认证 39
3.4.2物理令牌 40
3.4.3生物认证 40
3.4.4密码认证 41
3.4.5深度防御与认证 41
3.5结论 42
第4章 开放源代码和封闭源代码 43
4.1通过隐藏实现安全 43
4.1.1逆向工程 45
4.1.2代码混淆 46
4.1.3紧包软件的安全 47
4.1.4通过隐藏实现安全并非万能 47
4.2开源软件 47
4.3.“多眼球现象”是真的吗 47
4.3.1漏洞检测是困难的 49
4.3.2其他的忧虑 50
4.4关于发布加密算法 51
4.5另外两个关于开源的谬论 51
4.5.1微软谬论 51
4.5.2 Java谬论 52
4.6例子:GNU Mailman的安全 52
4.7证据:特洛伊木马 53
4.8开放源码还是不开放源码 54
4.9另一个来自于缓冲区溢出的安全教训 54
4.10忠告 55
4.11结论 55
第5章 软件安全的指导原则 56
5.1确保最薄弱环节的安全 57
5.2深度防御 59
5.3失效安全 60
5.4最小特权 62
5.5分割 63
5.6尽可能简单 64
5.7提升隐私权 66
5.8记住隐藏信息很困难 68
5.9不要轻信 69
5.10使用社会资源 70
5.11结论 70
第6章 软件审计 71
6.1架构的安全性分析 73
6.1.1攻击树 74
6.1.2报告分析结果 78
6.2实现安全性分析 79
6.2.1审计源代码 79
6.2.2源码级的安全审计工具 80
6.2.3在分析中使用RATS 81
6.2.4安全扫描软件的有效性 82
6.3结论 83
第7章 缓冲区溢出 84
7.1什么是缓冲区溢出 86
7.2为什么缓冲溢出是安全问题 87
7.3缓冲区溢出的防御 89
7.4主要的陷阱 89
7.5内部缓冲区溢出 93
7.6更多的输入溢出 93
7.7其他风险 94
7.8帮助工具 94
7.9堆破坏和栈破坏 96
7.10堆溢出 98
7.11栈溢出 101
7.11.1破译堆栈 101
7.11.2陷入无限循环……并更糟 105
7.12代码攻击 113
7.12.1 UNIX漏洞利用 114
7.12.2关于Windows 119
7.13结论 119
第8章 访问控制 120
8.1 UNIX访问控制模型 120
8.1.1 UNIX权限工作原理 121
8.1.2修改文件属性 122
8.1.3修改文件的所有权 124
8.1.4 umask命令 125
8.1.5编程接口 125
8.1.6 Setuid编程 127
8.2 Windows NT的访问控制 130
8.3分割 132
8.4细粒度权限 134
8.5结论 134
第9章 竞争条件 135
9.1什么是竞争条件 135
9.2检查时间与使用时间 138
9.2.1攻破passwd 139
9.2.2避免TOCTOU问题 142
9.3安全的文件访问 143
9.4临时文件 146
9.5文件锁定 146
9.6其他竞争条件 147
9.7结论 148
第10章 随机性和确定性 149
10.1伪随机数发生器 149
10.1.1伪随机数发生器实例 151
10.1.2 Blum-Blum-Shub PRNG 152
10.1.3 Tiny PRNG 153
10.1.4对PRNG的攻击 153
10.1.5在网络赌博游戏中作弊 153
10.1.6 PRNG的统计测试 155
10.2熵的收集和估计 155
10.2.1硬件解决方案 156
10.2.2软件解决方案 158
10.2.3糟糕的熵收集示例 163
10.3处理熵 164
10.4实用的随机数据来源 166
10.4.1 Tiny 166
10.4.2 Windows的随机数据 167
10.4.3 Linux的随机数 167
10.4.4 Java中的随机数 169
10.5结论 171
第11章 密码学的应用 172
11.1一般性建议 172
11.1.1开发者并不是密码专家 173
11.1.2数据完整性 174
11.1.3密码出口的有关法律 174
11.2常用密码库 175
11.2.1 Cryptlib 175
11.2.2 OpenSSL 176
11.2.3 Crypto+++ 177
11.2.4 BSAFE 178
11.2.5 Cryptix 179
11.3利用密码学编程 180
11.3.1加密 180
11.3.2散列算法 184
11.3.3公共密钥加密 185
11.3.4多线程 189
11.3.5 cookie加密 189
11.4加密散列更多的应用 191
11.5 SSL和TLS 192
11.6 Stunnel 194
11.7一次一密 195
11.8结论 198
第12章 信任管理和输入验证 199
12.1关于信任 200
12.2不恰当信任的例子 201
12.2.1信任是传递的 201
12.2.2预防恶意的调用者 204
12.2.3安全地调用其他程序 208
12.2.4源自Web的问题 210
12.2.5客户端安全 212
12.2.6 Perl问题 214
12.2.7格式字符串攻击 215
12.3自动检测输入问题 216
12.4结论 219
第13章 口令认证 220
13.1口令存储 220
13.2向口令数据库中添加用户 222
13.3口令认证的方式 231
13.4口令选择 235
13.4.1更多的建议 236
13.4.2掷骰子 237
13.4.3口令短语 240
13.4.4应用程序选择的口令 241
13.5一次性口令 242
13.6结论 252
第14章 数据库安全 253
14.1基础知识 253
14.2访问控制 254
14.3在访问控制中使用视图 256
14.4字段保护 257
14.5针对统计攻击的安全防卫 260
14.6结论 263
第15章 客户端安全 264
15.1版权保护方案 266
15.1.1许可证文件 273
15.1.2防范偶然性盗版 274
15.1.3其他的许可证特性 275
15.1.4其他的版权保护方案 275
15.1.5对不可信客户端的身份认证 276
15.2防篡改 277
15.2.1反调试措施 277
15.2.2校验和 279
15.2.3应对滥用 279
15.2.4诱饵 280
15.3代码混淆 280
15.3.1基本的代码混淆技术 281
15.3.2加密部分程序 282
15.4结论 284
第16章 穿越防火墙 285
16.1基本策略 285
16.2客户端代理 287
16.3服务器代理 288
16.4 SOCKS 289
16.5对等网络 290
16.6结论 292
附录A密码学基础 293
参考文献 310