不良软件和恶意软件的区别与共生

现如今每个人都明白软件的缺点导致绝大多数的安全问题。对不良软件“漏洞扫描”的快速检查可以显示我们听说的所有问题:“缓冲区溢出、竞争条件、跨站点脚本(cross-sitescripting,简称 XSS)、SQL注入、跨站点请求伪造(cross-site request forgery,简称CSRF),以及上千不出名的bug(参见CWE的顶级不良软件列表)。并且不要忘记软件缺陷的设计问题,它占到其余50%的严重软件安全缺点。

本文最重要的事情是介绍明白这些bug和缺陷很可能是由于开发人员和软件架构师的疏忽、马虎或是普遍的安全愚昧等原因造成的。尽管过去几年中,我们已经对数以千计的开发人员培训了软件安全的基础知识,比起那些已经参与过一个课程、或是阅读软件安全书籍的开发人员来说,还有更多的编程人员根本没有参加过任何安全培训。

好的消息是开发人员们讨厌bug、软件架构师们也讨厌缺陷。所以如果我们不断地教育他们这些缺点的本质。他们可能会不再编写出新的缺陷。再加之越来越多的静态分析工具用于评审代码、架构性风险分析工具用于发现缺陷,以及其它的软件安全接触点,你可以看到我们正在取得一些进展。

这是我的主要观点:大多数的bug不是由决心毁灭整个世界的邪恶开发人员编写蹩脚的软件故意放到软件中。它们是错误、意外事故、或是不良后果的问题,但不是由邪恶意图所导致的。

恶意软件

病毒、蠕虫、木马、间谍软件、广告软件、rootkits等高级持续威胁(advanced persistent threats,简称APT)都是各种类型的恶意软件。恶意软件是那些按照编写它的人的目的,故意设计用来做坏事的代码。这是值得重复说的,恶意软件在许多方面都不同于不良软件,并且首要的区别是编写该软件的人的意图。

许多病毒和蠕虫(但不是所有的)利用它们攻击的系统的缺点。EdFelten和我在90年代中期撰文写的Java安全问题(不良软件)被攻击者用于编写exploit代码(恶意软件)。Zeus木马同时利用浏览器的特定bug和其设计上的缺陷来感染目标机器的浏览器,并且执行阴险的中间人攻击(大多数是瞄准金融服务机构)。Zeus木马属于恶意软件。问题在于它为不良软件确立了立足点。Stuxnet蠕虫是恶意软件。它故意用来攻击伊朗的控制离心分离机的过程控制系统。Stuxnet蠕虫利用了西门子可编程逻辑控制器设计中的不安全因素(不良软件)。值得注意的是西门子不是开发恶意软件的公司,而且它一直致力于提高软件安全。