11.11. 杂项

以下是一些我似乎无法归入其他任何地方的杂项安全指南

让你的程序在使用其假设之前至少检查其中的一些假设(例如,在程序开始时)。例如,如果你依赖于在给定目录上设置了“sticky”位,请对其进行测试;这样的测试花费的时间很少,并且可以防止严重的错误。如果你担心每次调用时某些测试的执行时间,至少在安装时执行测试,或者更好的是至少在应用程序启动时执行测试。

如果你有一个内置的脚本语言,该语言可能可以设置一个环境变量,从而对调用该脚本的程序产生不利影响。防止这种情况。

如果你需要一种复杂的配置语言,请确保该语言具有注释字符,并包含一些注释掉的安全示例。通常使用'#'进行注释,意思是“此行其余部分是注释”。

如果可能,请不要创建 setuid 或 setgid root 程序;而是让用户以 root 身份登录。

签署你的代码。这样,其他人可以检查可用的内容是否是发送的内容。

在某些应用程序中,你可能需要担心时间攻击,其中时间或 CPU 利用率的变化足以泄露重要信息。例如,这种攻击已被用于从智能卡获取密钥信息。 Mauro Lacy 发表了一篇题为 远程定时技术 的论文,表明你可以在(某些情况下)通过互联网确定给定的用户 ID 是否存在,仅仅通过 CPU 消耗的努力(可以使用论文中描述的技术远程检测到)。解决这些问题的唯一方法是确保即使在不需要时也执行相同的操作。问题在于,在某些情况下,这可能会使系统更容易受到拒绝服务攻击,因为它无法优化掉不必要的工作。

考虑静态链接安全程序。这通过确保安全程序不使用动态链接库机制来对抗对其的攻击。然而,这样做有几个缺点。这可能会增加磁盘和内存使用量(来自同一例程的多个副本)。更糟糕的是,它使库的更新(例如,针对安全漏洞)更加困难 - 在大多数系统中,它们不会自动更新,必须单独跟踪和实施。

在阅读代码时,请考虑所有未进行匹配的情况。例如,如果有一个 switch 语句,当没有一个 case 匹配时会发生什么?如果有一个“if”语句,当条件为假时会发生什么?

仅仅“删除”文件并不能从磁盘中消除文件的数据;在大多数系统中,这仅仅将内容标记为“已删除”,并使其有资格在以后重复使用,并且通常数据至少会临时存储在其他位置(例如内存、交换文件和临时文件)。实际上,对于坚定的攻击者来说,覆盖数据是不够的。关于擦除磁介质问题的经典论文是 Peter Gutmann 的论文 “从磁性和固态存储器中安全删除数据”。坚定的对手也可以使用其他手段,例如监视计算机的电磁辐射(军事系统必须遵守 TEMPEST 规则来克服这一点)和/或秘密攻击(例如隐藏在键盘中的监视器)。

在修复安全漏洞时,请考虑添加“警告”以检测和记录利用(现在已修复的)漏洞的尝试。这将降低攻击的可能性,特别是如果攻击者无法预先确定攻击是否会成功,因为它暴露了正在进行的攻击。简而言之,它将漏洞变成入侵检测系统。这也表明,在身份验证之前暴露服务器程序的版本通常对安全不利,因为这样做会让攻击者很容易仅使用有效的攻击。有些程序使用户可以故意“谎报”他们的版本,以便攻击者将使用“错误的攻击”并被检测到。此外,如果漏洞可以通过网络触发,请确保安全扫描器可以检测到该漏洞。我建议联系 Nessus (http://www.nessus.org) 并确保他们的开源安全扫描器可以检测到该问题。这样,不检查其软件是否升级的用户至少会在其安全漏洞扫描期间了解该问题(如果他们按应有的方式进行扫描)。

始终在你的文档中包含用于报告安全问题的联系信息。你还应该支持至少一个用于报告安全问题的常用电子邮件地址(security-alert@SITE、secure@SITE 或 security@SITE);最好也让 support@SITE 和 info@SITE 工作。准备好支持那些有安全漏洞要报告的人的行业惯例,例如 完全披露政策 (RFPolicy) 和 IETF 互联网草案“负责任的漏洞披露流程”。重要的是与任何报告安全漏洞的人快速合作;请记住,他们通过向你报告问题来帮助你,并且他们没有义务这样做。尤其重要的是,一旦问题得到解决,就应给予漏洞报告者适当的荣誉(除非他们另有要求)。许多报告者提供信息仅仅是为了获得荣誉,并且人们普遍认为荣誉归于报告者。一些供应商认为人们永远不应向公众报告漏洞;这种论点的问题在于,这曾经很常见,结果是供应商否认漏洞,而他们的客户却多年来一直遭到破坏。

在领导软件开发项目时,请遵循最佳实践和通用约定。如果你正在领导一个开源软件/自由软件项目,可以在 Free Software Project Management HOWTOSoftware Release Practice HOWTO 中找到一些有用的指南;你还应该阅读 大教堂与集市

每隔一段时间,回顾像这样的安全指南。至少重新阅读 第 12 章 中的结论,并随时返回到引言 (第 1 章) 并重新开始!