有几篇参考文献有助于说明如何编写安全程序(或者换而言之,如何发现现有程序的安全问题),并构成了本文下面将要强调的指导原则的基础。
对一般目的的服务器程序和setuid/setgid程序,有许多值得一看的文献(虽然有些文献如果不被提及的话很难被发现)。
Matt Bishop [1996, 1997]对此问题发表了几篇极有价值的论文和报告,而且他有个网页 http://olympus.cs.ucdavis.edu/~bishop/secprog.html专门讨论这个问题。 根据Garfinkel和Spafford讨论如何编写安全的SUID和网络程序的那本书 [Garfinkel 1996] 第22章的部分内容,AUSCERT发布了一个编程核对清单 [AUSCERT 1996]。 Galvin [1998a]描述了一个开发安全程序的简单步骤和核对清单;后来又在 Galvin [1998b]中对核对清单进行了更新。 Sitaker [1999] 为“Linux安全审计”小组提出了一个需查找的问题列表。 Shostack [1999] 为检阅对安全性敏感的代码定义了另一个核对清单。 NCSA [NCSA] 提供了一组简要而实用的安全编程指南。 其它有用信息的来源包括 安全Unix编程常见问题 [Al-Herbish 1999], 安全审计的常见问题 [Graham 1999], 和 Ranum [1998]。 某些建议必须警惕,比如,BSD setuid(7)的man信息 [Unknown] 推荐使用access(3),却没有说明通常与之相伴随的竞争的危险。 在Wood [1985]中的“Security for Programmers”一章里有一些有用但过时的忠告。 Bellovin [1994] 包含了一些有用的指导原则以及一些特别的实例,诸如如何重新构建更简单安全的ftpd程序。 FreeBSD [1999] 也包含了一些有用的指导原则。
对于使用CGI作为与WEB的接口的程序,有很多文献给出了安全守则。其中包括 Van Biesbrouck [1996]、 Gundavaram [unknown]、 [Garfinkle 1997] Kim [1996]、 Phillips [1995]、 Stein [1999] 和 Webber [1999]。
还有很多文献是针对某一种语言的,这在本文的专有语言一节会进一步讨论。例如,Perl部分包括 perlsec(1),描述如何使Perl应用更安全。在 http://www.cs.princeton.edu/sip 的安全网络编程站点涉及了普遍的计算机安全问题,但主要是Java、ActiveX和JavaScript一类的移动编码系统;Ed Felten(其骨干人员之一)与人合写了一本安全Java的书([McGraw 1999]),讨论Java的安全问题。Sun的安全编码指南提供了一些主要针对Java和C的指导原则;可以在 http://java.sun.com/security/seccodeguide.html上找到这些资料。
Yoder [1998]收集了一些处理应用程序安全所用的样板。这并非一组专门的指导原则,而是可能会有用的一组编程通用样板。Schmoo小组维护着一个连接如何编写安全代码信息的网页 http://www.shmoo.com/securecode。
还有很多文献从另一个角度(如“如何破译系统”)描述了这个问题。例如McClure [1999],而且Internet上有不计其数的资料。
还有大量已经找出的已有程序漏洞的资料。它们可以作为“不要这么做”的有用范例,不过需要花时间从大量特别事例中提取更普遍的指导原则。有一些讨论安全问题的邮件列表;其中一个最著名的邮件列表是 Bugtraq, 从诸多事中发展出一个漏洞列表。CERT的协调中心(CERT/CC)是报告漏洞的一个主要Internet安全问题报告中心。CERT/CC偶尔发布一些报告,提供某个严重安全问题的描述及其影响,并给出如何获取补丁的指示或者变通办法的细节;更多的信息可见 http://www.cert.org。 注意,CERT开始只是个计算机紧急响应小组,但按官方的说法“CERT”现在不代表任何事。能源部的 Computer Incident Advisory Capability (CIAC)也报告漏洞。 这些不同的组织可能会用不同的名称来报告同样的漏洞。为了解决这个问题,MITRE 支持常见漏洞揭露(CVE)列表来对所有公开的已知安全漏洞创建单一的独有标识(“名称”)以相互区别;参见 http://www.cve.mitre.org。 NIST的ICAT是一个计算机漏洞的可查找目录,把每个CVE漏洞分类以便于随后查找和比较;参见 http://csrc.nist.gov/icat。
本文总结了我所认为最有用的准则,这样程序员可以坐下来读这一篇文档,并为实现一个安全程序做好相当的准备。它不是一个所有可能准则的大全。在这里我使用了自己的组织方式(每个列表都有自己与众不同的结构),而且Linux独有的准则(如关于能力和fsuid值)也是我自己提出的。强烈推荐参考阅读上述的所有参考文献。