Science for all





安全地失败

安全地失败

安全程序应该总是“安全地失败”,也就是说,它应该设计为一旦失败,出现的是最安全的结果。对于关键性安全程序,这一般意味着在检测到某些错误行为(格式不正确的输入、到达某个“不可能到达”的状态,等等)时,程序应该立刻拒绝服务并停止处理该请求。不要试图“指出用户想做什么”:只是拒绝服务。有时这会降低可靠性或可用性(从用户的角度来看),但它会提高安全性。在若干场合这可能不是所期望的结果(例如拒绝服务比丧失秘密或完整要坏得多的场合),但这样的情况是相当少见的。

注意,我推荐的是“停止处理该请求”,而不是“一起失败”。特别是大多数服务器不应该在得到格式不正确的输入时完全暂停,因为这会给拒绝服务攻击创造一个平常的机会(攻击者只要发送垃圾比特就可以阻止他人使用服务了)。有时让整个系统宕机是必需的,特别是到达某个“不可能到达”的状态可能表明一个问题的严重程度使得继续运行变得不理智。

要仔细考虑检测到失效时发回的错误信息。如果什么都不发回,可能很难诊断问题,但发回太多的信息,可能无意中帮助了攻击者。通常最好的方法是回答“拒绝访问”或“遇到多种错误”,然后把更详细的信息写入一个审计日志文件(在这里就可以更好地控制哪些人可以看到这些信息)。