2.8. 设计和实现指南的来源

许多文档帮助描述了如何编写安全程序(或者,换句话说,如何在现有程序中发现安全问题),并且是本书其余部分所强调的指南的基础。

对于通用服务器和 setuid/setgid 程序,有许多有价值的文档(尽管有些文档很难找到,除非有对它们的引用)。

Matt Bishop [1996, 1997] 在该主题上开发了几篇非常有价值的论文和演示文稿,实际上,他有一个专门讨论该主题的网页,网址为 http://olympus.cs.ucdavis.edu/~bishop/secprog.html。 AUSCERT 发布了一个编程清单 [AUSCERT 1996],部分基于 Garfinkel 和 Spafford 的书的第 23 章,该书讨论了如何编写安全的 SUID 和网络程序 [Garfinkel 1996]Galvin [1998a] 描述了一个用于开发安全程序的简单流程和清单;他后来在 Galvin [1998b] 中更新了该清单。 Sitaker [1999] 列出了“Linux 安全审计”团队要搜索的问题列表。 Shostack [1999] 定义了另一个用于审查安全敏感代码的清单。 NCSA [NCSA] 提供了一组简洁但有用的安全编程指南。 其他有用的信息来源包括 Secure Unix Programming FAQ [Al-Herbish 1999]Security-Audit's Frequently Asked Questions [Graham 1999]Ranum [1998]。 某些建议必须谨慎对待,例如,BSD setuid(7) 手册页 [Unknown] 建议使用 access(3),但没有注意到通常伴随它的危险竞争条件。 Wood [1985] 在其“程序员安全”一章中提供了一些有用的但过时的建议。 Bellovin [1994] 包括有用的指南和一些具体示例,例如如何重组 ftpd 实现以使其更简单和更安全。 FreeBSD 提供了一些指南 FreeBSD [1999] [Quintero 1999] 主要关注 GNOME 编程指南,但它包含一个关于安全考虑因素的部分。 [Venema 1996] 详细讨论(并举例说明)了编写安全程序时的一些常见错误(广为人知或可预测的密码、恶意数据对自身的损害、用户可访问数据中的秘密以及依赖其他程序)。 [Sibert 1996] 描述了恶意数据引起的威胁。 Michael Bacarella 的文章 The Peon's Guide To Secure System Development 提供了一套不错的简短指南。

有许多文档提供了使用通用网关接口 (CGI) 与 Web 接口的程序的安全指南。 这些包括 Van Biesbrouck [1996]Gundavaram [unknown][Garfinkle 1997] Kim [1996]Phillips [1995]Stein [1999][Peteanu 2000][Advosys 2000]

有许多特定于语言的文档,本书的特定于语言的部分将进一步讨论这些文档。 例如,Perl 发行版包括 perlsec(1),其中描述了如何更安全地使用 Perl。 安全互联网编程站点 http://www.cs.princeton.edu/sip 通常对计算机安全问题感兴趣,但侧重于移动代码系统,例如 Java、ActiveX 和 JavaScript; Ed Felten(其原则之一)与人合写了一本关于保护 Java 安全的书籍 ([McGraw 1999]),该书在 第 10.6 节 中讨论。 Sun 的安全代码指南提供了一些主要针对 Java 和 C 的指南; 它可以在 http://java.sun.com/security/seccodeguide.html 中找到。

Yoder [1998] 包含了一个在处理应用程序安全性时要使用的模式集合。 它实际上不是一组特定的指南,而是一组您可能会觉得有用的常用编程模式。 Schmoo 组维护着一个网页,链接到有关如何编写安全代码的信息,网址为 http://www.shmoo.com/securecode

有许多文档从另一个方向描述了这个问题(即“如何破解系统”)。 McClure [1999] 就是一个例子,并且从互联网上的那个角度来看,有无数的资料。 还有更多关于计算机体系结构的通用文档,关于如何开发攻击来利用它们,例如 [LSD 2001]。 Honeynet 项目一直在收集有关攻击者实际如何执行攻击的信息(包括统计数据); 有关更多信息,请参阅他们的网站 http://project.honeynet.org

还有大量关于现有程序中已识别漏洞的信息。 这可以作为“不该做什么”的有用示例集,尽管从大量具体示例中提取更通用的指南需要付出努力。 有一些讨论安全问题的邮件列表; 其中最著名的之一是 Bugtraq,它除其他外,还开发了一个漏洞列表。 CERT 协调中心 (CERT/CC) 是互联网安全问题的主要报告中心,负责报告漏洞。 CERT/CC 偶尔会发布公告,其中描述了严重的安全问题及其影响,以及有关如何获取补丁或解决方法详细信息的说明; 有关更多信息,请参阅 http://www.cert.org。 请注意,最初 CERT 是一个小型计算机紧急响应团队,但官方上“CERT”现在不代表任何含义。 能源部的 计算机事件咨询能力 (CIAC) 也报告漏洞。 这些不同的组织可能会识别出相同的漏洞,但使用不同的名称。 为了解决这个问题,MITRE 支持通用漏洞和披露 (CVE) 列表,该列表为其他人识别的所有公开已知的漏洞和安全风险创建单个唯一标识符(“名称”); 请参阅 http://www.cve.mitre.org。 NIST 的 ICAT 是计算机漏洞的可搜索目录,对每个 CVE 漏洞进行分类,以便以后可以搜索和比较它们; 请参阅 http://csrc.nist.gov/icat

本书总结了我认为最有用和最重要的指南。 我的目标是编写一本书,让优秀的程序员只需阅读它,然后就可以充分准备好实现安全程序。 没有哪一份文档能够真正实现这个目标,但我认为这种尝试是值得的。 我的目标是在“所有可能的指南的完整列表”(这将是永无止境且难以阅读的)与在线提供的各种“简短”列表之间取得平衡,这些列表既简洁又好,但省略了大量关键问题。 当有疑问时,我会包含指导; 我认为在这种情况下,最好让每个人都能在这个“一站式商店”文档中获得信息。 这里呈现的组织结构是我自己的(每个列表都有自己不同的结构),并且一些指南(尤其是 Linux 独有的指南,例如关于功能和 FSUID 值的指南)也是我自己的。 强烈建议也阅读上面列出的所有参考文档,但我意识到这对许多人来说是不切实际的。