为什么总有无数的Bug困扰着程序员
在代码上耗费的时间和资金越多,程序防御力就越强——但是黑客们总有办法找到其中的漏洞。
又是整整一个月,整整一个月忙着安装补丁——回环往复、无穷无尽,一想起来就头大。
我们的软件编码工具有着默认的内置安全防御措施,我们的编程语言是安全的,我们的程序员使用的是SDL (security development lifecycle)编码工具和技术,我们的操作系统有着不断升级的安全设置,供应商也一直不断地侦查和攻击自己的软件意图找到漏洞,甚至还有的公司花费几十亿美元用于消除软件bug。
我们一直在勤勤恳恳努力着,但是为什么还有这么多漏洞?为什么这些漏洞能逃过fuzzers和测试人员的层层抓捕?
下面就是为什么我们的软件之所以依然充满漏洞的5大原因:
1.人的天性
大多数——当然不是全部——软件bug源于我们自己犯的错误。虽然有些是因为软件编码工具和编译器发生了意外,但是大部分的错误得归咎于我们自己。
无论我们受到的SDL培训和安全工具有多么强大,只要我们还是人,我们就会犯错。如果你想问为什么电脑软件会有这么多的漏洞,归根到底是因为,人的天性就是容易犯错。
也就是说,我们在减少人为错误方面做得还不够。有很多程序员因为没有受到足够的SDL培训(有的甚至干脆就没有培训),所以根本就没有安全编程的理 念。有时候我特别奇怪:有那么多的程序员以写安全软件为生,却居然不懂如何安全地编程。别不信,我敢打赌,你正在运行的银行安全软件中的bug不会比它能 提供的保护措施少,搞不好甚至更多。
但是即使是那些经过严格训练的程序员还是不可避免出现bug。举个例子,前不久有个自鸣得意的家伙发明的使用HTML标记字段确定颜色的缓冲区在浏 览器中溢出了。不像以前还要输入FFFFFh之类的东西,黑客甚至可以直接执行颜色域的代码,从而导致浏览器过度消耗资源、缓冲区溢出。看到没有,这就是 漏洞!而且很少会有人能预料到这种情况。
2.不断增加的软件复杂性
就其本质而言,软件越复杂,就意味着代码行数越多。只要你在编程,那么即使你有多擅长写代码,也一定会有错误和bug出现。有人曾说,如果你能做到 每50行代码中只出现一个错误,那你就已经做得相当好了。大多数程序员差不多每隔5至15行就会犯错。想象一下,这么说吧,一般性的Linux内核拥有超 过1500万行的代码,有多少bug你自己算吧!
即使没有编码错误,互联网时代应用程序的整体互动性也是漏洞被攻击的途径。大多数程序员不得不和其他API协作,保存和检索文件,在多种设备上正常工作。所有这些过程都会增加被成功击破的概率。
而要防守的话,则需要写更多的代码,因为得抵御各种不同的攻击渠道。这么说吧,如果有一个只有30条汇编语言指令的恶意程序,那么针对相应的防守,你可能至少得写50000条汇编语言指令!
3. Fuzzers也是人写出来的
新近冒出来的Fuzzers软件主要用于扫描软件漏洞。Fuzzers——以及其他用于寻找编码错误和漏洞的任何程序——都是人写出来的,还是这句 话,是人就会犯错误。例如Fuzzers是不会发现颜色属性的缓冲区溢出这种情况的,这是因为我们在写Fuzzers的时候没有考虑这一方面。不过当我们 意识到这一点并对Fuzzers进行更新之后,就能做到去查找各种类似的缓冲区溢出条件的字段。简而言之,我们要Fuzzers做什么,它才会去做什么。
4.缺乏对供应商的问责
许多安全专家抱怨,只要我们不能找到证据起诉供应商的软件缺陷,我们就永远不会变得更安全。我赞同这一点,增加对供应商的问责有助于降低安全风险, 但是同时却有可能会减缓进度。不过如果软件公司比现在更能担当起责任来,那么我想我们能在手机上、电脑上能自由自在冲浪的感觉会更爽。
但是成功源于功能和速度,而非安全。社会现状决定了我们必须牺牲一部分安全和保障去换取新鲜感。这不一定是坏事——因为能让我们成功得更快。但是这样一来我们就不得不承担这样做的后果。不过到目前为止,我们还是心甘情愿为了添加更酷的新鲜玩意儿而面对更多的风险。
5.缺乏对黑客的问责
现实是上面没有一条能很快解决。但是软件出现漏洞就其本身而言,真不是什么大问题。说它脆弱是因为这些软件在面对恶意攻击的时候毫无抵挡之力。除非我们能制止黑客的猖獗行径,否则恶意软件将会一直困扰着我们。
但是我依然深信,将来有一天我们的互联网会有更好的普遍标准出台,我们能在现实中及时地将那些损害大家利益的家伙绳之以法。不过在此之前,我们还是得不断地写补丁,在黑客的狂轰滥炸下苟延残喘。
译文链接:http://原网站已经失效/article/5-reason-bug-plague-programmer.html
英文原文:5 reasons why software bugs still plague us
翻译作者:码农网 – 小峰