Linux和Unix安全编程HOWTO

David A. Wheeler

本文对在Linux和Unix系统下编写安全程序给出了一组设计和实现的指导原则。这样的程序包括用来浏览远端数据的应用程序、CGI脚本程序、网络服务器和setuid/setgid程序。本文还包含了针对C、C++、Java、Perl、Python和Ada95的特别指导。


Table of Contents
1. 导言
2. 背景知识
Unix、Linux与开放源码软件的历史
Unix
自由软件基金会
Linux
开放源码软件
Linux与Unix的比较
安全准则
安全程序的类型
多疑症是个优点
为什么要编写本文档?
设计和实现原则的来源
文档习语
3. Linux和Unix安全特性概要
进程
进程属性
POSIX能力
进程创建与操作
文件
文件系统对象的属性
创建时的初始值
改变存取控制属性
使用存取控制属性
文件系统分级结构
System V的IPC
套接字和网络连接
信号
配额与限制
动态连接库
审核
PAM
4. 证实所有的输入
命令行
环境变量
有些环境变量是危险的
环境变量的存储格式是危险的
解决方案 -- 提取和清除
文件描述符
文件内容
CGI输入
其它输入
字符编码
限制合法的输入时间和负载水平
5. 避免缓存溢出
C/C++中的危险
C/C++中库的解决方案
标准C库的解决方案
静态和动态分配缓存
strlcpy和strlcat
libmib
Libsafe
其它库
C/C++的编译解决方案
其它语言
6. 程序内部结构与解决方案
保证接口的安全
特权最小化
最小化授予的特权
最小化可以使用特权的时间
最小化特权有效的时间
>最小化获得特权的模块
考虑用FSUID来限制特权
考虑使用chroot来最小化可用文件
避免创建Setuid/Setgid脚本
安全地配置并使用安全的缺省值
安全地失败
避免竞争状态
次序问题
锁定
只信任值得信任的通道
使用内部一致性检查代码
自我限制资源
7. 小心对其它资源的调用出口
限制调用出口为合法值
检查系统调用的所有返回值
8. 明断地发回信息
最小化反馈
处理完整的/不响应的输出
9. 特定语言的问题
C/C++
Perl
Python
Shell脚本语言(sh及csh的变种)
Ada
Java
10. 专题
密码
随机数
加密算法与协议
PAM
其它事项
11. 结论
12. 参考文献
A. 历史回顾
B. 感谢
C. 关于文档许可
D. GNU自由文档许可证(原文)
E. 关于作者
List of Tables
4-1. 非法UTF-8初始序列