从错误中学习
Mike Andrews 在此。大致上,我们看到的漏洞可以分为两类:缺陷(flaws)和错误(bugs)。缺陷是系统/应用程序设计中的固有问题——Dan Kaminsky 的 DNS 漏洞就是一个很好的例子。另一方面,错误是软件实现中的问题,典型的例子是缓冲区溢出。这并不是一个完美的分类法,在某些情况下我们可以开始吹毛求疵,比如 Gareth Heyes、David Lindsay 和 Eduardo Vela Nava 在 BlueHat 上展示的 CSS 内容(是规范中的缺陷允许这种功能滥用,还是浏览器不应执行此类代码的错误),但通常可以很容易地将漏洞归入这些类别之一。
另一个区别是漏洞和利用之间的区别,这是一个更容易做出的区分。漏洞是允许坏事发生的问题(缺陷/错误)(例如缓冲区溢出),而利用是可以用它做什么(例如使机器崩溃、提升权限、执行外部代码)。这通常是一对多的关系——一个漏洞可以通过多种方式被利用。
2008 年是安全领域有趣的一年。尽管我认为,过去一年中披露、讨论并引起大量媒体关注的许多漏洞实际上只是更具创意的利用。虽然许多漏洞的基本载体没有改变(例如将外部代码注入网页),但可以用它们做的事情已经进步了(CSS 历史窃取、基于 JavaScript 的内部网络扫描、点击劫持等)。
我们永远不会摆脱错误或缺陷,因为软件开发是一个人类过程,我们会犯错误或忽略事情。软件也变得越来越复杂,这意味着有更多的漏洞和利用系统的方式。然而,我认为我们在这里错过了一个巨大的技巧;除了我们这些真正投身于软件和安全的人之外,更广泛的社区从利用中学到了多少关注,而不是理解其根本原因?它引起恐慌,急于创建/寻找补丁,然后当我们再次“安全”时,往往被遗忘。如果您还没有,请订阅 Microsoft 安全漏洞研究与防御博客(网址为 http://blogs.technet.com/swi/default.aspx),深入了解漏洞背后的细节、它们影响什么以及它们最初出现的原因。我强烈推荐研究这类信息。
因此,我对 2009 年的呼吁是,我们不要过多关注利用,尽管这很难做到(谁不喜欢好的魔术技巧、黑客、软件有缺陷的例子)。关注为什么,而不是什么,我相信这会使软件更好,并且(仍然)有很多可以从以前的错误中学习。
-Mike Andrews
Foundstone 专业服务负责人