【IT168 技术】新一个月再度来临,又是几十个需要立即安装的补丁——这样的循环似乎永远没有终点,这简直令人感到沮丧。软件编码工具在默认情况下应该是以安全方式创建而成。我们拥有“安全”的编程语言。我们的程序员们在开发过程中使用SDL(即安全开发生命周期)编码工具与技术。我们的操作系统当中包含更多默认安全措施,供应商们也通过种种手段测试甚至攻击自己的软件产品以找寻安全漏洞。还有很多企业花费数十亿美元只为消除各类软件漏洞。
但为什么经过了这一连串努力,软件漏洞还是层出不穷?为什么就不能通过黑盒与代码测试把它们提前揪出来?在今天的文章中,我们将共同了解五大理由,看看它们是如何突破上面提到的重重包围、最终导致漏洞产生的:
1.人类的天性
大多数——即使不是全部——编码漏洞都源自人为失误。其中一些可以被归结于预想不到的意外状况或者是软件编码工具及编译器造成的奇怪结果,但很大一部分错误仍然是由人类程序员们亲手犯下。
无论经过多么完善的SDL培训或者选择怎样完美的安全工具,我们仍然只是人类而且有可能在最平淡无奇的地方出现失误。如果大家想知道为什么我们仍然需要面对计算机软件漏洞,那么首要理由就是“是人总会犯错误”。
也就是说,我们勾勒出的补救体系还不足以抵消人为失误所带来的影响。很多程序员根本没有接受过足够的(或者任何)SDL培训,或者是缺少安全激励计划的推动。我总是惊讶于,为什么那么多以编写安全软件为生的程序员根本不理解如何以安全方式进行编程。我敢打赌,即使是银行当中所运行的安全软件也充满着各式各样的漏洞,有时候其数量甚至比被保护软件中的漏洞还多。
不过即使是经过严格培训的编码人员有时候也会让漏洞从指尖溜过。举例来说,很久以前,曾有个坏家伙利用浏览器中用于识别颜色的HTML标签字段创建出缓冲区溢出漏洞。不同于FFFFFh或者类似的状况,这位黑客能够介入到浏览器所要使用的颜色字段执行代码当中、进而引发缓冲区溢出。砰!用户应声倒地。这种攻击手段确实很难加以预见。
2.软件复杂程度持续增加
就自身特性而言,软件的复杂程度一直在不断增加,这当然也意味着其代码行数的持续提升。在编程工作当中,无论大家的水平有那么高超,每一行代码中总会存在一定数量的漏洞与错误(虽然并不总能被恶意人士发现或者利用)。专门负责监管此类事务的管理者声称,如果每五十行代码中出现一个错误,开发者就已经算是表现出色了。大多数程序员几乎每编写五行或者十五行代码就会造成一次错误。由此想见,像Linux内核这样拥有超过1500万行代码的项目中会有多少漏洞与错误……大家不妨算算看。
即使不考虑编码错误,程序员们也很难预见到不同应用程序在互联网时代下彼此之间的相互作用。大多数程序必须与其它API相交互,保存并检索文件,同时运行在多种不同类型的设备之上。所有这些变量都会增加恶意人士成功找到安全薄弱环节的可能性。
正义的一方总是处于劣势。想要写出邪恶的攻击指令比较容易,相对而言要抵御这些攻击活动需要付出更多更艰辛的劳作与心力。我可以用30条汇编语言指令让对方的计算机变成砖头,但要想抵御住这一进攻、保护者至少要用50000条汇编语言指令才能做到。
3.漏洞检查工具的本质仍然是人
最近一段时间以来,漏洞检查工具被广泛用于识别软件当中所存在的安全漏洞。漏洞检查工具——或者任何其它用于找寻编码错误以及安全漏洞的程序——都是由人所编写。
这类检查工具不可能发现得了颜色属性字段所引发的缓冲区溢出,因为它们在编写过程中根本没有考虑过要审视这些角落。当漏洞被恶意人士成功利用之后,漏洞检查工具会得到更新,现在它们开始对各种类型的字段进行检查以避免类似的缓冲区溢出状况。总结来说,漏洞检查工具只会根据我们的指示进行检索。
4.供应商责任缺失
很多安全专家认为,如果不能以软件缺陷为由向供应商提起诉讼、那么安全的明天永远不会真正到来。我也认为更深层次的问责机制有助于阻扼安全风险,但一味从法律角度出发却有可能放慢这一发展进度。如果我们将更重的法律责任施加于软件企业身上,那么如今早已普及的小型移动电话、极度轻薄的音乐播放器乃至在线视频观看站点恐怕根本不会出现。
成功是由功能与速度推动的,而非安全性。作为社会的一分子,我们应该把安全性建立在创新性之上并将其作为保障手段。这并不一定是坏事——事实上这种处理思路让我们发展得更为迅速。但与此同时,我们也需要权衡由此给生活带来的负面影响。至少到目前为止,我们仍然愿意接受存在风险但却新奇有趣的事物。
5.缺乏针对黑客的问责机制
现实情况是,上述安全问题在短时间内根本不可能得到有效解决。不过软件安全漏洞本身并不是导致问题的真正根源。那些利用这些漏洞并进行恶意活动的家伙才是幕后黑手。只要我们继续让大部分黑客逍遥法外,猖獗的恶意攻击与破坏性软件仍将继续给用户带来困扰。
我仍然坚信终有一天互联网会迎来全面整改,渗透识别机制将以默认方式广泛普及,而我们则可以让那些图谋不轨并造成实际损失的家伙在真实世界中付出必要的代价。但在此之前,我们不得不继续像打地鼠一般被动防御并接受循环再循环的软件补丁安装流程。