根除不良软件 解决恶意软件

不良软件、或是恶意软件哪个更糟糕呢?事实上,它们有区别么?不幸的是,不良软件与恶意软件经常被混淆在一起——有时甚至年长的安全老手也会犯这样的错误。在本文中我会把它们两个分开来,并且阐述它们之间共生的关系。

好消息是消灭不良软件会有助于控制恶意软件问题。

不良软件

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

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

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

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

恶意软件

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

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

不良软件成为恶意软件的Vector

Vector是一个具有许多含意的词语中。在数学上,Vector是带有大小和方向的一条线。在传染病学中,Vector是将传染病从一个宿主到传输另外一个上的有机体。使用第2种定义,我们能够将软件缺点(以及造成的不良软件)概念化为用于恶意代码传播的途径。

为什么这个如此重要?因为恶意软件问题追根到底必然涉及不良软件。这就是传染病学的101军规,根除传播途径。知道为什么消灭蚊子对于战胜疟疾至关重要么?因为蚊子是一种vector。杀完蚊子接着你能直接影响疟疾的传播。我们所有为提高软件安全所作的事情都是针对不良软件。因为解决它也有助于控制恶意软件问题。

当不良软件成为恶意软件,或是邪恶的开发人员无法无天

你认为我们已经做得足够了。但是这是计算机安全,所以当然有一些特殊的情况需要考虑,假设我们“以坏人的方式”去思考。比如:想象下某个怀着邪恶意图的开发人员有目的地在他编写的软件中安放bug,以便他可以在产品上架后售卖零日漏洞给歹徒。还有:想象一下某个邪恶的开发人员将时间炸弹木马植入到他编写的代码中,并且随后使用这个时间炸弹来敲诈依赖这些代码进行必要业务过程的公司。再有:想象一下邪恶的开发人员故意地编写代码来耗尽所有可用的计算机资源,所以运行该程序的计算机缓慢直到瘫痪。再来一个现代版超级精英的例子:想象一下某个开发人员为移动手机编写了一个简单的游戏应用,该应用看起来毫无害处还有趣,但是实际上将用户的数据从手机上导出并且发送给攻击者。这些问题的可能性是无穷无尽的。

我们是否可以做一些事情,来寻找木马、以及解决像这样故意在源代码中放置bug的问题呢?我们能够战胜邪恶的开发人员么?或许会有些希望。

首要的事情:在一些情形下,了解是否能够信任开发人员是至关重要的,在安全策略中应该制定这点。例如,美国的NSA已经发布了“解决恶意代码风险指导意见”来应对这个问题。还有大型的跨国银行有类似技术的规定。Cigital公司的顾问Marina Khainson一直在探索侦测她称之为“恶意设计的要素”的思路,使用的是标准问题静态分析技术。她最近在OWASP上讨论的“恶意代码侦测:突破静态分析”一书介绍了使用静态分析技术侦测恶意代码的前期工作,并拿安卓移动手机应用的木马功能为例。

这儿的基本思路是什么?寻找确定的可能是可疑的静态字符串,例如“chmod 777”或是一块高熵数据(可能意味着是经过加密的东西)。提防看起来不需要的奇怪的打包文件,或是高权限的系统调用。这些请求中的一些可以是自动化的 (例如,运行对于二进制的字符串检查能够产生有意思的东西)。其它可能需要人工的分析。结果令人振奋。

同不良软件的战斗无处不在

比起讨论没有尽头的安全bug、讨论恶意软件或许更加有趣和令人愉快,但是如果打算战胜恶意软件,我们必须从不良软件开始。不管怎么样,大多数的开发人员不是邪恶的,是吧!?