第1章 软件安全性概论
1.1 都是软件惹的祸
1.2 安全性问题的处理
1.2.1 Bugtraq
1.2.2 CERT建议
1.2.3 RISKS Digest
1.3 影响软件安全性的技术趋势
1.4 'ilities
1.4.1 安全性
1.4.2 可靠性
1.5 穿透-补丁不是好办法
1.6 艺术与工程
1.7 安全目标
1.7.1 预防
1.7.2 跟踪与审计
1.7.3 监控
1.7.4 保密性和机密性
1.7.5 多级安全性
1.7.6 匿名性
1.7.7 认证
1.7.8 完整性
1.8 普通软件的安全性陷阶
1.9 软件项目的目标
1.10 结束语
第2章 软件安全性风险管理
2.1 软件安全性风险管理概览
2.2 安全人员的角色
2.3 生命周期中的软件安全人员
2.3.1 需求获取
2.3.2 风险评估
2.3.3 安全性设计
2.3.4 实现
2.3.5 安全性测试
2.4 现实的权衡
2.5 思考安全性
2.6 软件风险管理的实践
2.6.1 当开发误入歧途时
2.6.2 当安全性分析误入歧途时
2.7 通用准则
2.8 结束语
第3章 技术的选择
3.1 语言的选择
3.2 分布式对象平台的选择
3.2.1 CORBA
3.2.2 DCOM
3.2.3 EJB和RMI
3.3 操作系统的选择
3.4 认证技术
3.4.1 基于主机的认证
3.4.2 物理权标
3.4.3 生物认证
3.4.4 密码认证
3.4.5 深度防御与认证
3.5 结束语
第4章 开放源代码与封闭源代码
4.1 隐晦的安全性
4.1.1 逆向工程
4.1.2 代码模糊
4.1.3 紧包软件的安全性
4.1.4 模糊安全性不是万能的
4.2 开放源代码
4.3 多眼现象
4.3.1 脆弱性检测是困难的
4.3.2 其他担心
4.4 关于发布密码算法
4.5 另外两个开放源代码的谬论
4.5.1 Microsoft谬论
4.5.2 Java谬论
4.6 GNU Mailman的安全性问题
4.7 特洛伊木马
4.8 开放源代码还是封闭源代码
4.9 另一个来自缓冲区溢出的安全性教训
4.10 忠告
4.11 结束语
第5章 软件安全性指导原则
5.1 原则1:加固最脆弱的链接
5.2 原则2:实行深度防护
5.3 原则3:失败安全
5.4 原则4:坚持最小优先权原则
5.5 原则5:分割
5.6 原则6:简单化
5.7 原则7:提高保密性
5.8 原则8:记住隐藏秘密是很难的
5.9 原则9:不要轻信
5.10 原则10:利用社会资源
5.11 结束语
第6章 软件稽核
6.1 体系结构的安全性分析
6.1.1 攻击树
6.1.2 报告分析结果
6.2 实现的安全性分析
6.2.1 源代码的稽核
6.2.2 源代码级的安全性稽核工具
6.2.3 在分析中使用RATS
6.2.4 软件安全性扫描的效果
6.3 结束语
第7章 缓冲区溢出
7.1 什么是缓冲区溢出
7.2 为什么缓冲区溢出是安全性问题
7.3 防止缓冲区溢出
7.4 主要的陷阶
7.5 内部缓冲区溢出
7.6 更多的输入溢出
7.7 其他风险
7.8 测试工具
7.9 摧毁难和堆栈
7.10 堆溢出
7.11 堆栈溢出
7.11.1 破译堆栈
7.11.2 趋于无限
7.12 攻击代码
7.12.1 UNIX漏洞检测代码
7.12.2 在Windows中的情况
7.13 结束语
第8章 访问控制
8.1 UNIX的访问控制模式
8.1.1 UNIX是怎样控制权限的
8.1.2 修改文件属性
8.1.3 修改文件的归属
8.1.4 umask命令
8.1.5 程序接口
8.1.6 Setuid编程
8.2 Windows NT中的访问控制
8.3 分割
8.4 细化的特权
8.5 结束语
第9章 竞争状态
9.1 什么是竞争状态
9.2 检查时间与使用时间
9.2.1 攻破passwd
9.2.2 避免TOCTOU问题
9.3 安全访问文件
9.4 临时文件
9.5 锁定文件
9.6 其他竞争状态
9.7 结束语
第10章 随机与惟定
10.1 伪随机数发生器
10.1.1 PRNG示例
10.1.2 Blum-Blum-Shub PRNG
10.1.3 Tiny PRNG
10.1.4 攻击PRNG
10.1.5 在在线游戏中作弊
10.1.6 PRNG的统计测试
10.2 熵的收集和估计
10.2.1 硬件方案
10.2.2 软件方案
10.2.3 糟糕的熵收集示例
10.3 处理熵
10.4 实际应用的随机资源
10.4.1 Tiny
10.4.2 Windows中的随机数
10.4.3 Linux中的随机数
10.4.4 Java中的随机数
10.5 结束语
第11章 密码学的应用
11.1 一般建设
11.1.1 软件开发人员并不是密码学专家
11.1.2 数据的完整性
11.1.3 密码出口的有关法律
11.2 常用的密码库
11.2.1 Cryptlib
11.2.2 OpenSSL
11.2.3 Crypto++
11.2.4 BSAFE
11.2.5 Cryptix
11.3 密码术编程
11.3.1 加密
11.3.2 散列运算
11.3.3 公钥密码加密
11.3.4 多线程
11.3.5 加密cookie
11.4 密码散列算法的更多应用
11.5 SSL和TIS
11.6 使用Stunnel
11.7 一次一密
11.8 结束语
第12章 信任管理和输入的有效性
12.1 关于信任
12.2 不恰当信任的示例
12.2.1 信任是可传递的
12.2.2 防御恶意的访问者
12.2.3 安全调用另一个程序
12.2.4 网页上的危险
12.2.5 客户端的安全
12.2.6 Perl中的问题
12.2.7 格式串攻击
12.3 自动探测输入问题
12.4 结束语
第13章 口令认证
13.1 口令的存储
13.2 向口令数据库添加用户
13.3 口令认证
13.4 选择口令
13.4.1 更多的建议
13.4.2 掷骰子
13.4.3 口令短语
13.4.4 应用程序选择的口令
13.5 一次性口令
13.6 结束语
第14章 数据库安全性
14.1 基础知识
14.2 访问控制
14.3 在访问控制中使用视图
14.4 保护域
14.5 抵抗统计攻击
14.6 结束语
第15章 客户端安全性
15.1 版权保护机制
15.1.1 许可证文件
15.1.2 挫败普通盗版者
15.1.3 许可证的其他特性
15.1.4 其他版权保护方法
15.1.5 对不可信客户机的身份认证
15.2 防篡改技术
15.2.1 反调试程序方法
15.2.2 检查和
15.2.3 对滥用的响应
15.2.4 引诱
15.3 代码迷惑技术
15.3.1 基本迷惑技术
15.3.2 对部分程序进行加密
15.4 结束语
第16章 通过防火墙
16.1 基本策略
16.2 客户机代理
16.3 服务器代理
16.4 SOCKS
16.5 点对点
16.6 结束语
附录A 密码学基础
A.1 密码学的最终目标
A.2 对密码术的攻击
A.3 密码术的类型
A.4 对称密码术
A.4.1 对称算法的类型
A.4.2 对称算法的安全性
A.5 公钥密码术
A.6 密码散列算法
A.6.1 对散列算法的其他攻击
A.6.2 好的散列算法
A.7 数字签名
A.8 结束语
参考文献