`

开源运动是否走到尽头?--谈谈怎样看待OpenSSL心脏出血

阅读更多

 

   开源运动是随着Linux操作系统的诞生和广泛被使用而逐步被人们所接受的,对软件产业和IT产业来讲,是一个重大变革。开源运动,建立了一种新的模式。这种模式应该是更加积极,促进IT产业和软件产业发展的。

 

  OpenSSL是开源代码中,最最广泛被使用的开源库,最初是以Eric Young以及Tim Hudson两人所写的SSLeay为基础所发展的。

 

  近些年,随着互联网的发展,OpenSSL也遇到了很多问题,爆出了很多bug,别的不说,就只看去年的“心脏出血”吧,我以前一直没有怎么关注,近期看了看,也就是一个C语言不检查数组长度和copy内存引起的,应该也算不大多么大的问题。

 

关键问题不是这个漏洞技术分析本身,而是这个深思这个漏洞,我们能够发现几个方面的问题:

 

1、敷衍了事的设计或根本没有设计

 

C语言不检查数字长度,内存copy不慎重的话容易导致缓冲器溢出问题,这个问题多少年了?OpenSSL还在使用最最危险的C库函数。难道是他们不了解C语言的这一特性吗?作为一个被如此广泛使用的基础性的软件,理所应当经过认真的分析和设计,考虑到这些情况,设计和编码经过严格的review。之所以还是存在这样的漏洞,是为了什么?

 

2、不当使用的懒汉

 

之所以OpenSSL漏洞会造成这么严重的问题,很大原因来自于用户的不当使用。很多人,包括一些IT系统的,一些做产品的,认为只要加一个SSL就安全了,甚至认为只要用上一个OpenSSL就安全了。真如盲人骑瞎马,不知何时就会夜半临深池。安全是要经过认真的分析设计的,分析设计之后,根据需要,使用能找到的工具,包括商业产品、开源组件、管理规范和手段协同达成的。我们作为用户,常常把自己的信息安全,让这样的没有人去管理和维护,真是悲哀啊。

 

3、应对手段的乏力

 

时至今日,我所看到的,应对这方面危机(不只是这一次OpenSSL的漏洞,而是时至今日出现多次的问题,不得不让人思索如何建立一种机制应对)好的方法,大多数人提到的,是加强测试、再加强测试,发现问题及时打补丁。拙作 http://windshome.iteye.com/blog/2122855 提出了补丁不能被滥用的观点,等待出了问题积极修正,总比拖着不修正好,但是真得没有更积极的方法,在出事之前,减少出事的可能吗?为什么不能做到呢?

 

 

为什么会出现这样的局面呢?这也不是突然出现的问题。

应怎样改进呢?我个人认为有如下的方法:

 

第一,重新定位开源在IT和软件产业中的位置

 

OpenSSL是一个开源的组件,开源组件的特性就是自由,缺乏管理。经过Linux内核之父指责C++和Java这个事情之后,我看到了一些程序员身上的问题:自负(那些程序员不知道C缓冲区溢出这回事吗?)、骄慢(编程规范算老几?孙子辈的)和惰怠(等出了问题再说吧),甚至我所不喜欢的,恶意的猜测别人(是否故意留下一个个坑?)。靠这样的一种机制,来支撑信息产业和软件产业等于神话中所说,牛角上支撑着的世界。我的观点:开源运动应该在软件产业和IT产业的什么位置?我们应该怎样看待它?

 

第二,帮助开源走向成熟

 

开源和商业并不矛盾,因此,有必要开源和商业进一步结合,这样对开源和商业都是有好处的。在国内,看到一堆人到当年的sourceforge、现在的google code、github上拿一个开源库就凑合着在上边开发,真觉得很可笑。对于个人开发者和小公司倒也罢了,但是大公司也基本都是这样,让人觉得无语。像阿里那样参与社区有所回馈,建立一种机制的还是太少了。另外,我想表达的也不是简单的参与和回馈,我想表达的是,借助商业化的契约精神和管理机制,帮助开源社区建立发展的正确方式。这比支持、参与或者资助一个或几个开源项目更加有价值。

 

第三:建立正确使用这些开源组件的方式

 

对于开源组件的使用,应该是(1)对可能存在的问题有所警惕和防范(2)通过第三方的商业产品、第三方的服务来使用而非直接使用(这涉及到费用和投入,但是什么都不想投入只想赚钱这个想法本身就不大靠谱,与总是出问题相比,适当的投入还是需要的)(3)第三方产品和服务努力提高自身的水平,承担商用契约。

 

当然,作为开源社区、开源项目的参与者来讲,也应该积极寻求这种方式,如果还抱着最初开源运动的那些教条不放,那么是不是会举步维艰?也许不会,因为走短平快路线的,大有人在,不追求质量,不追求稳定性、安全性,只是追求速度的人多着呢。但是,要想通过开源社区做好一件事,必须寻求这方面的变化,穷则变,变则通

 

 

 

 

 

 

 

 

 

 

 

 

 

0
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics