论文部分内容阅读
最近IT业界流行着一个段子:
“你知道为什么新的Windows系统要跳过Windows 9直接命名为Windows 10吗?因为很多软件在判定操作系统类型时是这样写的—if(version.StartsWith(“Windows 9”)) { /* 95 and 98 */ } else { ”。
翻译成人话就是:如果这些软件看见一个系统名字以Windows 9开头,它们就会认为这是Win 95或者Win 98。于是,为了避免被错认成20年前的老古董,微软只好避开这个“雷区”,将新系统命名为Windows 10。
这个理由乍听上去很扯,因为熟悉一点编程的人都看得出来,这个代码写得太简单粗暴了,几乎是“灾难编程”的范例,市面上随便抓一个程序员都不会这么干。但人们很快发现,著名的OpenJDK(Java开发环境的开源版本)里真的就是这么写的!于是段子一下子变成了现实:就算OpenJDK立马修改这一点,微软也不可能要求全球数十上百万个使用OpenJDK进行开发的软件工程师及时跟进,唯一可行的做法,就是避开Windows 9这个名字。
从这个故事中我们可以总结两点:一,再厉害的软件都可能包含低级错误;二,新科技有时候不得不为老错误买单。
这两条规律的适用范围很广,新近频被曝光的“破壳” 漏洞便是一个绝佳的示范。
根据Rapid7安全公司的提示,这个被命名为“破壳”(shellshock)的CVE-2014-6271漏洞的严重程度为10,是已知漏洞中最高的一种,相比2014年4月的“心脏流血”漏洞严重了好几个级别;与此同时,它的利用复杂程度却是“低”,黑客可以轻松地用它发动攻击。
具体来说,这个漏洞存在于Linux系统被广泛使用的开源软件Bash上。Bash是一款用于控制Linux计算机命令提示符的流行软件,就是所谓的“壳”(shell)。基于Unix平台的操作系统绝大部分都采用了Bash软件,包括Ubuntu等Linux系统和苹果的OS X系统,这就意味着,这个漏洞并非像“心脏流血”一样是纯粹的服务器端漏洞,而会对服务器端和客户端两方面都造成影响。
另外,“心脏流血”漏洞只是允许黑客非法取得服务器中储存的数据,从而有可能获得网站敏感信息,而“破壳”漏洞则允许黑客直接获得计算机的控制权—黑客只需要复制粘贴一行代码,就能取代原主人而对计算机发号施令。
堵上这个漏洞比想象中更加困难。红帽安全公司和Fedora都在漏洞公布后的第一时间发布了补丁,苹果也为Mac OS X发布了专用补丁。但安全专家查验后表示,这些补丁并不完整。截至漏洞曝光20天后,黑客仍可以绕过补丁通过“破壳”漏洞侵入目标计算机。
最糟糕的是,这个漏洞已经存在25年了,相关代码的引入时间是1989年8月。也就是说,在这25年里,无数顶级程序员为Bash贡献代码,利用和改造它,却没人对这个开源软件进行过一遍彻底的代码审查—所有人都默认它是一个成熟的软件,却忘了它诞生于互联网仍充满信任的黄金时代。在那个时代,人们对安全并没有如此重视,代码审查也还没有列入工程规范。
这就成了一个无解的两难困局:一方面,新科技并非空中楼阁,它必须踩在旧时代技术和产品构筑的基石之上;另一方面,时代在进步,旧产品某些看似微小的瑕疵却未必符合新的标准,于是,新科技就必须不停地为旧账买单。
“你知道为什么新的Windows系统要跳过Windows 9直接命名为Windows 10吗?因为很多软件在判定操作系统类型时是这样写的—if(version.StartsWith(“Windows 9”)) { /* 95 and 98 */ } else { ”。
翻译成人话就是:如果这些软件看见一个系统名字以Windows 9开头,它们就会认为这是Win 95或者Win 98。于是,为了避免被错认成20年前的老古董,微软只好避开这个“雷区”,将新系统命名为Windows 10。
这个理由乍听上去很扯,因为熟悉一点编程的人都看得出来,这个代码写得太简单粗暴了,几乎是“灾难编程”的范例,市面上随便抓一个程序员都不会这么干。但人们很快发现,著名的OpenJDK(Java开发环境的开源版本)里真的就是这么写的!于是段子一下子变成了现实:就算OpenJDK立马修改这一点,微软也不可能要求全球数十上百万个使用OpenJDK进行开发的软件工程师及时跟进,唯一可行的做法,就是避开Windows 9这个名字。
从这个故事中我们可以总结两点:一,再厉害的软件都可能包含低级错误;二,新科技有时候不得不为老错误买单。
这两条规律的适用范围很广,新近频被曝光的“破壳” 漏洞便是一个绝佳的示范。
根据Rapid7安全公司的提示,这个被命名为“破壳”(shellshock)的CVE-2014-6271漏洞的严重程度为10,是已知漏洞中最高的一种,相比2014年4月的“心脏流血”漏洞严重了好几个级别;与此同时,它的利用复杂程度却是“低”,黑客可以轻松地用它发动攻击。
具体来说,这个漏洞存在于Linux系统被广泛使用的开源软件Bash上。Bash是一款用于控制Linux计算机命令提示符的流行软件,就是所谓的“壳”(shell)。基于Unix平台的操作系统绝大部分都采用了Bash软件,包括Ubuntu等Linux系统和苹果的OS X系统,这就意味着,这个漏洞并非像“心脏流血”一样是纯粹的服务器端漏洞,而会对服务器端和客户端两方面都造成影响。
另外,“心脏流血”漏洞只是允许黑客非法取得服务器中储存的数据,从而有可能获得网站敏感信息,而“破壳”漏洞则允许黑客直接获得计算机的控制权—黑客只需要复制粘贴一行代码,就能取代原主人而对计算机发号施令。
堵上这个漏洞比想象中更加困难。红帽安全公司和Fedora都在漏洞公布后的第一时间发布了补丁,苹果也为Mac OS X发布了专用补丁。但安全专家查验后表示,这些补丁并不完整。截至漏洞曝光20天后,黑客仍可以绕过补丁通过“破壳”漏洞侵入目标计算机。
最糟糕的是,这个漏洞已经存在25年了,相关代码的引入时间是1989年8月。也就是说,在这25年里,无数顶级程序员为Bash贡献代码,利用和改造它,却没人对这个开源软件进行过一遍彻底的代码审查—所有人都默认它是一个成熟的软件,却忘了它诞生于互联网仍充满信任的黄金时代。在那个时代,人们对安全并没有如此重视,代码审查也还没有列入工程规范。
这就成了一个无解的两难困局:一方面,新科技并非空中楼阁,它必须踩在旧时代技术和产品构筑的基石之上;另一方面,时代在进步,旧产品某些看似微小的瑕疵却未必符合新的标准,于是,新科技就必须不停地为旧账买单。