开源软件是否真的如我们想象中的那样安全?

  • A+
所属分类:业界关注

  在两年前开始接触信息安全的时候,从开源的GNU,到各种网上各种开源工具,我一直认为,开源即相当安全,可

是开源是否真的如我们所愿的那么安全么?

开源软件是否真的如我们想象中的那样安全?

开源软件安全现状 

上上月的心脏出血,给了我们当头一捧!

    在目前的个人和商业领域,开源软件得到了更为广泛的应用,随之其安全问题也得到了更为广泛的关注,有关开源与闭源软件谁更安全的问题也争论不休。其实安全都是相对的,没有绝对的安全,闭源如此,开源也如此。

从软件产业的诞生到现在,时间并不是很长,与其他在我们眼中被视作“传统行业”的产业比较起来更是显得年轻,但它却发展得非常迅速,对我们的工作和生活的影响也越来越大。

    总体而言,现在的软件可以按照源代码是否公开分为“开源”(Open Source)和“闭源”(Closed Source)两大类,而前者对目前整个软件业的影响正在以“星火燎原”的态式发展。开源软件正在从我们计算机爱好者手中的挚爱变成企业应用中不可忽视、举足轻重的一个考虑对象。

    有关开源软件的一些问题也成为讨论话题中的热点,“开源软件安全”这个问题的争论也由来已久,在开源运动比较成熟的国家对其认识的更加深刻,大家已经用行动证明其“安全可靠”,而在国内,似乎我们的开源运动还没有真正的到来,还需要“讨论、讨论”。

    在讨论“开源软件安全”这个话题之前,有必要仔细地考虑一下在使用软件时所关心的一些问题,这些问题是在成本允许的条件下:

1、软件是否能够满足自己的功能需要; 
2、软件的功能特点是否安全; 
3、软件的后期维护和支持是否到位。

    虽然上面三点不是全部都应当考虑的问题,但是已经算抽象意义上比较突出的几个问题。可以看出,在这三点中,第二点就是安全问题,似乎很多企业没有意识到这个问题,或者说对这个问题认识不够深刻。

    产生这种现象的原因很多,一方面是安全意识淡薄,很多公司和企业使用的软件授权还没有彻底解决,而且总觉得够用就行,忽视了软件安全方面的问题;另一方面把安全交给所谓的杀毒软件和防火墙,这并没有从根本上解决安全问题,要知道所谓的病毒和木马,之所以存在或者说危害着软件使用者,本身就是所使用的软件自身存在安全漏洞和Bug。

    那么如何才能最大程度上保证软件的安全性呢,或者如何才能尽快地发现软件中的问题,并把问题解决掉呢?在软件开发中有一些共识:

1、设计要尽可能完善; 
2、测试要尽量全面; 
3、维护和跟踪及时持续; 
4、问题解决要快速; 
5、信息发布要及时透明。

    在这几个方面,开源软件做得都非常不错,下面就分别说一下以上这几个问题。

开源软件文档缺乏

    很多人诟病开源软件缺少文档,更没有什么设计资料,特别是国内的一些人士,由此就觉得开源软件多么不可靠。这个问题看上去似乎成立,但如果我们深入的了解一下就不会有这种片面的看法,事实上这些问题也许是开源软件早期存在的一些问题,因为毕竟这时候开源软件的目的和影响很小,而现在却在发生着根本的改变。一方面是开源软件开发模式的日渐成熟,开发人员也越来越专业化,另一方面伴随着整个软件业的成熟,开源软件也在不断的成熟。

    现在成熟的开源软件基本上都有自己的网站和在线(离线)文档,也有不断完善的Wiki系统,方便了大家的学习和反馈,可以说是一种构建型应用和推广的典范,当然现在还是以英文材料为主。

严格意义而言,我们的政府应当拨款并成立相关部门解决这个问题,国内不同于国外,社区的推动模式在国内还存在很多问题,需要寻找不同的解决方案。尽管一些大项目的汉化工作有了一定的进展,比如说Linux操作系统的几个不同发行版,还有就是知名开源软件的汉化,但是我们会发现做出贡献的人未必是这个领域的专家,所以从专业性上还未达到专业的要求。

    我们从计算机图书的出版也可以看到开源运动的影响和进展,从某种意义上而言,这些书籍成为开源软件的设计说明和开发参考手册,而且开源书籍的出版划分越来越详细,甚至有的公司专门以开源书籍做为自己的主要经营业务。当然,国内在这一方面做的还不够,所以我们应当学习国外成功的经验和模式,在开源运动中争取双赢或多赢。

安全从测试开始

    测试作为软件发布前重要的一步工作,肩负着软件的可用性和安全性等诸多任务,所以也决定着软件的质量,这是一个非常关键的指标。我们很熟悉闭源软件的测试过程,正规的软件都有正式的测试文档,可以说对软件的测试已经非常到位。

    测试可分为白盒测试和黑盒测试,这是一个人们比较熟知的分类方法,在软件公司内部可以进行这些测试,另一个模式就是把测试工作外包给专业的测试公司,但是这些工作还是无法保障软件的安全性。很重要的一点是由于我们自身的局限,我们很难写出一个毫无遗漏的完整的测试用例,毕竟我们每个人的大脑是有限的,而且有些问题也很难被考虑全面。

    从程序本身而言,至今也没有一套完整的理论和工具证明程序本身的正确性,这是安全性本质上的硬伤,但是如果不考虑这个因素,那么软件的安全性就要通过测试保证。由于闭源软件存在开发周期、成本和代码保密等缺点,使得测试的完整性不能得到很好的保证,也就是说闭源软件最终得到的软件是通过他们自己设计的测试方案的软件,这样方案的完备性就存在自身的缺陷和不完备性。

    开源软件对每个人都开放源代码,每个感兴趣的用户,无论是个人还是企业,都可以下载源代码,可以说是完全彻底的白盒,当然进行黑盒测试更不是什么问题。这样就保证了测试的最大化,相比闭源软件,这样更容易发现程序中存在的问题,更容易进行全面的测试。

    还有就是现在的一些组织机构委托大学和一些商业公司做开源软件的测试,包括安全性测试。美国政府有这样的专项拨款,澳大利亚政府也有这样的部门评估,新西兰政府还安排专人作评估报告。

    在南非,开源软件大踏步的前进,最为大家熟知的就是Ubuntu的发起人Mark在那里所做出的贡献,一句“Linux for Human Being”就是很好的注释。

    在欧洲对开源的关注和评估更是如火如荼,用Google Map搜索一下开源软件公司就会发现在欧洲这个版图上有很多的公司,可以说是密度居世界第一,而且有的公司业务就是做开源软件安全性评估和测试的,他们提供专业的服务,这点也最大程度地保证了开源软件的安全性。

软件升级需主动

    在软件的跟踪维护方面,闭源软件都是商业公司的产品,他们有资金和能力成立专门的部门做好这些事情,给客户很好的保障,而开源软件却不能。其实这种观点是片面的,因为开源软件与之相比,无论在问题发现和解决速度上都毫不逊色于闭源软件。

    一个成熟的开源软件有成千上万的用户在使用,而且很大一部分就是商业用户和政府组织,他们发现的问题会及时的发布出来,而且还会将解决方案和建议一起提交,这对软件的维护跟踪、问题解决和信息发布都是十分有利的。

相对而言,闭源软件当内部人员发现问题,但还没有解决掉问题之时,一般不会发布公告。当外部用户发现问题,由于自己手中没有源代码,就算有能力解决,或者计划想办法解决都不可以,只能够等待软件提供商解决,在补丁发布之前,除了等待毫无选择。

    软件的升级一般有两层意思:一层是功能上的增加和提升;另一层是对原有软件的安全性,也就是发现的漏洞和问题的修正。

    在这个问题上我们要探讨升级的主动性和被动性,对“生产”闭源软件的商业软件提供商而言,对升级的问题不是很主动;而在软件发布后的安全问题上,更是以被动为主,都是根据市场反馈和用户投诉解决问题,不能够从公司内部积极的查找问题,修正错误。

    一个例外就是软件由于发布时间期限的压力,一些内部知道的安全问题本身就随着软件一起发布,但是暂时不为人知,商业公司会继续投入人员进行解决,然后以“升级”的名义对其进行修正。

    而开源软件却是另外一种情况,从开发团队核心到外围的普通用户,大家都努力将软件打造的尽可能安全,这种对软件中问题的一致情绪源于大家的责任心和对开源软件精神的认同,当然也有少数的个人英雄主义人士的存在,但是这一切都是主动的,而不是被动的,这种主动性让开源软件的安全性有了可以站立的基石,使得开源软件愈发安全。

开源软件存在安全问题

    在2006年的LinuxWorld大会上,Linux内核维护人考克斯强调,有相当数量的资金被用来攻击开放源代码系统。他警告说,许多开放源代码项目远谈不上安全,许多资金都被用来破坏开放源代码系统的安全。媒体上经常有这样的字眼:开放源代码软件更安全、更可靠,缺陷也更少。这是一种危险的观点。

    考克斯表示,许多分析都只关注知名度很高的项目。对SourceForge上150个项目的分析显示,它们在安全方面的表现不如Linux,只有部分项目的“高质量”是名符其实的。

开源安全工具

    Nmap是一款开源的网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取那台主机正在运行以及提供什么服务等信息。Nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描等。 

    在未来也许需要那么一个专门部门来做代码审计,也许开源才能做到真正的相对开源!而这个部门也许就靠市场来推动了。

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: