Linux 和 Unix 安全编程指南

David A. Wheeler

v3.010 版本

v3.010, 2003年3月3日

本书为 Linux 和 Unix 系统编写安全程序提供了一系列设计和实现指南。这些程序包括用作远程数据查看器的应用程序、Web 应用程序(包括 CGI 脚本)、网络服务器和 setuid/setgid 程序。其中包括 C、C++、Java、Perl、PHP、Python、Tcl 和 Ada95 的具体指南。有关本书的最新版本,请参阅 http://www.dwheeler.com/secure-programs


目录
1. 简介
2. 背景
2.1. Unix、Linux 和开源/自由软件的历史
2.2. 安全原则
2.3. 程序员为何编写不安全的代码?
2.4. 开源对安全有利吗?
2.5. 安全程序的类型
2.6. 偏执是一种美德
2.7. 我为何编写本文档?
2.8. 设计和实现指南的来源
2.9. 其他安全信息来源
2.10. 文档约定
3. Linux 和 Unix 安全功能概述
3.1. 进程
3.2. 文件
3.3. System V IPC
3.4. 套接字和网络连接
3.5. 信号
3.6. 配额和限制
3.7. 动态链接库
3.8. 审计
3.9. PAM
3.10. 类 Unix 系统的专用安全扩展
4. 安全需求
4.1. 通用准则介绍
4.2. 安全环境和目标
4.3. 安全功能需求
4.4. 安全保证措施要求
5. 验证所有输入
5.1. 命令行
5.2. 环境变量
5.3. 文件描述符
5.4. 文件名
5.5. 文件内容
5.6. 基于 Web 的应用程序输入(尤其是 CGI 脚本)
5.7. 其他输入
5.8. 人类语言(区域设置)选择
5.9. 字符编码
5.10. 防止输入中的跨站恶意内容
5.11. 过滤可能被重新呈现的 HTML/URI
5.12. 禁止 HTTP GET 执行非查询操作
5.13. 反垃圾邮件
5.14. 限制有效输入时间和负载级别
6. 避免缓冲区溢出
6.1. C/C++ 中的危险
6.2. C/C++ 中的库解决方案
6.3. C/C++ 中的编译解决方案
6.4. 其他语言
7. 程序内部结构和方法
7.1. 遵循安全程序的良好软件工程原则
7.2. 保护接口安全
7.3. 分离数据和控制
7.4. 最小化权限
7.5. 最小化组件的功能
7.6. 避免创建 Setuid/Setgid 脚本
7.7. 安全配置并使用安全默认值
7.8. 安全加载初始化值
7.9. 故障安全
7.10. 避免竞争条件
7.11. 仅信任可信通道
7.12. 建立可信路径
7.13. 使用内部一致性检查代码
7.14. 自我限制资源
7.15. 防止跨站 (XSS) 恶意内容
7.16. 阻止语义攻击
7.17. 谨慎使用数据类型
8. 谨慎调用其他资源
8.1. 仅调用安全的库例程
8.2. 限制对有效值的调用
8.3. 处理元字符
8.4. 仅调用面向程序员的接口
8.5. 检查所有系统调用返回值
8.6. 避免使用 vfork(2)
8.7. 检索嵌入内容时应对 Web Bug
8.8. 隐藏敏感信息
9. 明智地发送信息
9.1. 最小化反馈
9.2. 不要包含注释
9.3. 处理已满/无响应的输出
9.4. 控制数据格式化(格式字符串/格式化)
9.5. 控制输出中的字符编码
9.6. 防止包含/配置文件访问
10. 特定于语言的问题
10.1. C/C++
10.2. Perl
10.3. Python
10.4. Shell 脚本语言(sh 和 csh 衍生语言)
10.5. Ada
10.6. Java
10.7. Tcl
10.8. PHP
11. 特殊主题
11.1. 密码
11.2. Web 上的身份验证
11.3. 随机数
11.4. 专门保护用户内存中的秘密(密码和密钥)
11.5. 加密算法和协议
11.6. 使用 PAM
11.7. 工具
11.8. Windows CE
11.9. 编写审计记录
11.10. 物理辐射
11.11. 杂项
12. 结论
13. 参考文献
A. 历史
B. 致谢
C. 关于文档许可
D. GNU 自由文档许可证
E. 背书
F. 关于作者
表格列表
5-1. 合法的 UTF-8 序列
图表列表
1-1. 程序的抽象视图