如今,很多软件由于长期使用第三方库文件,导致了持续的安全问题。而在程序开发设计阶段,开发者又经常忽略了第三方库代码的漏洞审查,甚至有些资源库(repositories)直接被信手拈来使用,从根本上就缺乏了安全审计。
如果某个库文件存在漏洞,那么,大量使用了该库文件的软件程序都将面临安全威胁。这种场景,在现实世界中已经有了血淋淋的证明:如OpenSSL中出现的心脏滴血漏洞(Heartbleed)、GNU Bash出现的破壳漏洞(Shellshock)和Java中的反序列化漏洞(Deserialization),这些都是实际应用程序中,存在第三方资源库或应用框架漏洞的典型案例。
据 Veracode 的安全研究分析,97%的Java程序都至少存在1个已知的安全漏洞,高级研究主管Tim Jarrett说“出现这种问题的原因比较明确,而且不只局限于Java程序“。另外,据Gartner预测,到2020年,99%的可利用漏洞发现期限,将仍然是安全专业人士已知至少1年以上的,所以,建议企业必须尽快修复那些已知的存在漏洞。这些漏洞很容易被忽略,但与事后弥补相比,修复这些漏洞的代价更低,也更容易。
Veracode 成立于2006年,提供最快、最全面的开发安全解决方案,来改善企业内部开发、购买或外包的应用程序软件及第三方组件的安全。目前,已获4000万美元投资。
安全专家表示,第三方库出现的安全问题,主要有两方面原因:一是开发者可能使用了一些第三方库当前安全可靠的代码,但是在后期却被发现了漏洞问题;另外是,开发者在项目中没有经过仔细验证,使用了那些本身就存在安全隐患的第三方库代码。
Sonatype副主管 Derek Weeks说,”虽然大家都对这种安全威胁比较重视,但对大多数程序员来说,开源库和第三方资源就像把双刃剑,节省开发时间的同时将会带来安全漏洞”。
Sonatype 是一家软件管理工具提供商,它提供一些经过仔细审核的开源代码库,并致力于跟踪和监控各个开源代码模块,以减少软件开发过程中的bug 以及兼容性和安全性问题。目前已获7000万美元投资。
Sonatype在对25000个应用程序进行分析后发现,7%的程序由于使用了不安全的组件而存在至少1种安全缺陷。GitHub、Bitbucket、Python Package Index和NuGet Gallery等资源库,将会帮助开发者发现他们在软件项目中所需的代码和功能实现,以Java开发者为例,他们可以使用这些资源库中的加密处理功能,或其它可视化数据处理模块。
Derek Weeks表示,现代软件不再依靠一字一行的代码编写,无论一个成熟的应用程序多么新颖独特,其中80%的代码都来源于第三方资源库或组件。他同时强调,企业对信息系统软件的依赖程度将不断增加,但大多数构成软件的关键开源资源库,却未经安全审核,存在着各种不同程度的安全问题。
以Sonatype自己提供下载的第三方资源库为例,2015年,该资源库中的开源和第三方软件组件下载量达310亿次,而2014年为170亿次。而Sonatype对自身资源库进行安全审核后发现,在被下载的代码库中,将近有6.1%存在安全漏洞。
Derek Weeks声称,Sonatype比其它资源库管理应用做的好,是因为其设置了代码管理工具、使用指导和相应的警告预警以帮助开发者避免使用存在安全隐患的缺陷代码。
NTT Com Security首席顾问Stephen Breen说,缺陷代码在开发过程中将会导致很多问题,就算整个开发团队都有很强的安全意识,但在严格的验收期限内,个别或少数开发者忽略了软件中使用的第三方代码安全审查情况,也不能避免。Breen强调,如果某个不安全的问题组件被一个软件程序使用,而这个软件程序将被应用于另外一个大型系统中,这种层层复用,将最终形成安全问题的“雪球效应”。最典型的例子,就是2015年的Apache Commons Collections(commons-collections-3.2.1.jar)反序列化漏洞。
据Veracode研究发现,目前,仍然还有1300多个旧版本的漏洞实例存在于大量Java程序中,这些程序使用了Spring/Hibernate框架和其它多个资源库代码。开发者在开发过程中选择了Spring/Hibernate框架,但他们却没意识到其中同样也包含了Apache Common Collections,然后,Common Collections库随之被应用于数千上万的软件开发项目中。
Apache Commons Collections已经成为Java程序中最常见的组件。另据Veracode对30万例Java程序检测发现,其中25%的程序都未能及时打补丁,存在Apache反序列化漏洞。由于使用了存在漏洞的库和框架组件,对开发者来说,最头疼的是,如何更新升级这些应用程序。
“就像存在故障的汽车安全气囊一样,汽车制造商在数百万车辆中配置了这些气囊,当出现问题之后,大家通常认为应该汽车制造商来解决这个问题,而不是安全气囊制造商”,Veracode研究主管Jarrett说。
Veracode声称,Apache Common Collection的漏洞实例只是冰山一角。Veracode曾对大量存在漏洞的应用程序进行检测分析,发现由于第三方代码缺陷导致的信息泄露漏洞占比高达72%,其次是占比65%的加密漏洞,最后是注入和跨站漏洞。
这些问题综合说明了各种软件产品对开源组件不断增强的依赖性,以联邦政府为例,在选择开发公司方面,它以开源策略优先。Weeks强调,“使用第三方库不但可以缩短开发时间,在某种意义上来说,还能提高软件安全和质量水平,另外,还可以让开发者更加专注于新功能新特性的架构。如果利用得当,对程序员来说,第三方库的代码重用简直就是天赐良机,可以帮大忙的事”。
出于这些原因,安全专家呼吁软件行业是时候应该考虑代码安全问题了。Sonatype公司甚至还发起了”软件生成标准“的响应,以规范开发者在使用开源框架前后的代码安全审查,同时方便那些使用存在漏洞库存的程序进行安全更新。
Sonatype的前述调查中表明,在16个程序组件中至少有1个存在漏洞隐患。Weeks认为,问题可能出在一些开发者的否认或无知态度,他们选择了一些不安全的程序组件。而SourceForge总裁Logan Abbott则表态,“如果在SourceForge托管的资源库中,发现存在一些恶意或缺陷代码库,我们会及时通知警告用户。我们会扫描资源库中的二进制漏洞,但不对所有托管代码进行安全审查。
接受记者采访的多个第三方资源库负责人表示,他们仅只是提供储存共享公开或私密内容的一个类似于云存储服务的平台,他们不会限制用户的托管代码。这些第三方资源库负责人认为,要从根本上避免软件漏洞,主要责任应该在于开发者,而不是第三方资源库平台。想要编写良好无漏洞的代码,首先得从那些安全的资源库中去学习借鉴。
BitBucket 是一家源代码托管网站,采用Mercurial和Git作为分布式版本控制系统,同时提供商业计划和免费账户。其市场经理Rahul Chhabria声称,“Bitbucket于开发者就像家得宝与木匠的关系,我们配置了多种工具以方便开发者更好地应用托管代码。BitBucket中提供了一系列的代码缺陷检测工具,如对依赖链进行安全审查的SourceClear等;另外,BitBucket还允许团队软件项目开发和简化的同行评审机制;其次,BitBucket具有的管道模式特点也能帮助开发者提高代码质量。
Github是最大的开源资源库,目前,它托管着4900万个公共和私人项目,拥有1800万用户。据其安全负责人Shawn Davenport介绍,Github不对托管代码进行审查或警告,用户可以根据需求使用第三方工具,如Gemnasium、Brakeman和Code Climate等,进行代码动态或静态分析。
Davenport说,“很多托管项目都存在安全隐患,我们只能尽量保证整个资源库的安全,同时让用户明白他们需要什么样的代码审查工具。从项目角度来说,安全并不是开发者的首要责任”。据Davenport估计,Github上只有少数用户在使用代码安全审查工具。
其它第三方资源库平台则告诉作者,他们有意采取不干涉态度,一方面是因为其不具备代码审查技术能力,另外,他们认为这不是他们的职责所在。他们指出,代码存在缺陷与否,事关开发者的所有代码,甚至是一些旧的程序组件。
如果要从根本上解决开源库的安全问题,一种方法就是在软件开发早期使用自动化的代码漏洞和配置审查扫描工具。据Gartner预计,到2019年,超过70%的企业开发活动都将集成自动化安全审查扫描工具,而目前,这个比例才占到10%。
Node.js开源基金会成立了Node.js Security Project项目,致力于推动Node.js平台健康发展,其目标是为开发者提供发现和披露Node.js系统漏洞的处理机制。据Node.js官方介绍,该项目除了开发者的主动发现外,还包括了一些漏洞数据库和不同社区交流的漏洞审查和披露。