在代码上耗费的时间和资金越多,程序防御力就越强——但是黑客们总有办法找到其中的漏洞。
又是整整一个月,整整一个月忙着安装补丁——回环往复、无穷无尽,一想起来就头大。
我们的软件编码工具有着默认的内置安全防御措施,我们的编程语言是安全的,我们的程序员使用的是 SDL (security development lifecycle)编码工具和技术,我们的操作系统有着不断升级的安全设置,供应商也一直不断地侦查和攻击自己的软件意图找到漏洞,甚至还有的公司花费几十亿美元用于消除软件 bug。
我们一直在勤勤恳恳努力着,但是为什么还有这么多漏洞?为什么这些漏洞能逃过 fuzzers 和测试人员的层层抓捕?
下面就是为什么我们的软件之所以依然充满漏洞的 5 大原因:博e百娱乐城
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. 缺乏对黑客的问责
现实是上面没有一条能很快解决。但是软件出现漏洞就其本身而言,真不是什么大问题。说它脆弱是因为这些软件在面对恶意攻击的时候毫无抵挡之力。除非我们能制止黑客的猖獗行径,否则恶意软件将会一直困扰着我们。
但是我依然深信,将来有一天我们的互联网会有更好的普遍标准出台,我们能在现实中及时地将那些损害大家利益的家伙绳之以法。不过在此之前,我们还是得不断地写补丁,在黑客的狂轰滥炸下苟延残喘。