■ 北京大学软件工程国家工程研究中心 张世琨 马森 高庆 孙永杰
由于软件应用范围不断扩大,软件安全已经不限于虚拟空间,直接威胁到物理空间的安全,而且,供应链中的任何问题都会导致严重的危害。降低软件安全风险最重要的就是技术沉淀,而技术沉淀最好的方式就是自动化工具,例如美国国防高级研究计划局(DARPA)在2016年举办的网络安全挑战赛(CGC),无任何人为干预,由机器全自动地挖掘二进制程序中的漏洞。笔者认为,这类比赛的意义远大于夺旗赛(CTF)这种证明个人实力的比赛,因为靠人的经验式挖掘永远不能普惠更多的企业和个人,而且经验的传授也不会系统完整。如何将安全分析技术落地,将知识以工具的方式用于实战,才是迫切需要的,这也是阿里软件供应链安全比赛的意义所在。那么,未来,自动化分析技术和安全知识的结合将成为一个重要方向。本文对软件供应链领域的风险和成因进行探讨,并就如何解决问题提出几点建议。
一、软件供应链安全领域存在的最大问题
1.开源软件的数量呈指数级增长,安全问题不容小视
根据Sonatype报告显示,在2017年全年,独立的Java开源组件数量由200万上升至350万,JavaScript开源组件由300万上升至550万,python组件数由87万上升至140万。对中央仓库(Central Repository)中350万个Java组件的分析结果显示,超过10%(351000个)的组件至少包含一个已知漏洞。事实上,研究人员发现,这些组件中有共计300多万个漏洞,任何一个漏洞都可能成为攻击者的攻击目标。
过于巨大的新增开源代码数量,导致单纯通过人力难以发现全部的问题,对漏洞挖掘、安全防范提出了更高的自动化要求。开源软件数量的增长使软件库之间的引用关系变得愈发复杂,如果其中一个环节出现了问题,就会导致所有使用该软件库的下游软件均存在该漏洞。
更重要的是,对于开发过程中引入开源软件的执行细节与其中潜在的风险,大多数开发者都无从获知。一个工程开发数年,人员迭代频繁,新的开发者对于前任开发者使用过的开源组件是否被修改过,无从获知,开发者更加关注的是自己开发代码的质量及安全性。尽管美国有黑鸭(Black Duck)软件这种分析整个工程的组成成分以及对应成分的CVE漏洞工具,但是,其高昂的收费,需要将代码通过网络传输到美国的使用方式,使国内企业很难接受,从而导致开源软件检测成为监管无人区,其风险远大于自行研发的代码。
2.难以处理鼓励敏捷开发、快速迭代的市场需求与必要安全成本间的平衡
随着互联网的不断发展,软件使用者对软件的功能性、实时性、易用性等方面的需求越来越高,软件市场的竞争压力越来越大。这要求开发者在短时间内完成大量功能点的开发,并在后期进行持续不断的高速迭代以抢占并稳固市场。
综合开发速度与成本控制等因素,开发者在开发过程中必然大量使用开源库与外包供应商提供的非公开库。但是,由上文可知,使用外部库时存在大量安全隐患,一旦出现数据泄露等安全问题,将导致极其巨大的经济损失。如何在较短的开发周期内尽量完善软件功能,同时完成相对完备的安全性测试,是所有开发者都面临的问题。
二、造成上述问题的原因分析
1.软件供应链风险传播速度快,攻击面广
软件供应链的安全风险广泛存在于供应内容在开发流程中直接或间接影响最终产品或系统的所有位置。风险将从供应链的每一层继承下来,主要包括:第一,开发过程中包含的编码和设计缺陷,允许未授权方在产品或系统部署时引入代码。此外,存在通过允许未授权访问和执行受保护功能而直接危及安全性的缺陷。第二,在组织之间转移时允许对产品或系统的访问进行不正确的控制,允许未授权方引入代码。第三,不安全的部署配置(例如,使用默认密码的已部署配置)。第四,使用现场产品或系统的操作变化会带来安全风险或配置更改,从而导致安全性受损(配置控制和补丁管理)。第五,在产品或系统处置过程中错误处理信息会损害当前运营和未来产品或系统的安全性。
2.开发人员安全意识以及项目管理水平有限
软件供应链任何一环的开发人员,在开发过程中如果出于方便等原因,下载非官方的软件、工具,并未经完整的安全校验,都可能引入漏洞或木马,带来安全隐患。例如,Xcodeghost事件,就是开发者使用了非官方途径的XCode工具导致。开发者在开发过程中往往更看重所用软件库的功能性,很少关心所用软件库的版本、可能存在的漏洞等信息。2017年9月,流行Java框架Spring发现一个远程执行代码的高危漏洞,此后的一个月内,对存在问题的Spring框架的下载量仅比漏洞曝出前下降了15%。此外,一些小型的开发团队没有完善的软件工程开发流程,当员工流动等情况出现时,可能会出现代码难以维护,难以进行版本更新等情况。
3.保障软件供应链安全的客观难度
黑客只需要找到软件供应链的一个突破口便可以入侵并造成危害,开发者需要对整个软件供应链进行完备的安全防护。即便企业安全意识足够,从漏洞公布,发现安全隐患设计补丁,最终测试并发布安全的新版本,仍然需要一定的周期,而攻击者根据漏洞生成攻击向量的速度可能更快。2018年8月22日,一个新发现的Apache Struts 2远程代码执行漏洞(CVE-2018-11776)被公开披露。仅在一天后,一位Github用户就发布了针对此漏洞的概念验证(PoC)漏洞利用代码。根据报告显示,2017年,漏洞从发现到被黑客利用的平均时间仅为3天,留给开发者的应对时间极短,而且0day漏洞的预防和应对对开发人员提出了更高的要求。
4.技术研究与企业实际需求的脱钩
国内对于漏洞自动发现或者通过开源代码审计的研究很多,但是,并没有实际落地的产品。研究往往都在点上,并没有扩展到整个工具面上,业界对于实现工具的若干技术问题,没有实际解决方案,导致很多想法只停留在理论阶段,没有给企业解决实际问题。
三、解决上述问题的建议和对策
目前,现有的市场环境对快速迭代、高创新性的需求,不允许花费大量的人力物力进行人工排查,因而对内建立稳定高效的软件开发规范,对上游软件供应链采取高自动化手段进行自动排查,是较好综合时间和人力的选择。
第一,采用开源代码审计,充分了解软件供应链中各个环节使用的开源版本库。实时关注软件所涉及的开源库的最新漏洞信息,当有新漏洞发布时,第一时间下载补丁。
第二,开发人员应尽可能从官方渠道获取程序组件,利用签名验证机制等方式降低软件开发工具和开发库被恶意植入漏洞的隐患。当对软件库植入恶意代码后,一般情况下,签名校验难以通过,通过软件发布的软件库版本与官方版本的校验分析,可以发现大部分恶意植入代码问题。国家应建设国家代码库,保证更多经过验证的版本供软件开发者下载。
第三,当使用开源或不公开软件库时,尽可能遵守可修改性、可维护性等软件工程原则。对不同的软件开发库给予合理权限,记录库使用的关键事件,方便快速排查问题。
第四,软件发布前通过静态分析工具进行完整的自动化安全漏洞检测。对常见的缓冲区溢出等漏洞进行分析,能够发现部分隐藏的安全漏洞。通过对恶意代码的特征分析,可以定位发现部分开发者恶意植入的后门。
第五,在充分防护且0day漏洞仍然难以避免的前提下,需要及时止损机制。可以设计合理的运行保护框架,通过对输入输出、网络传播等敏感过程的实时监控,当程序出现恶意行为时及时,发现并预防。或通过制度建立、定期培训等方式,增强软件开发人员的安全意识。在发现问题时能够迅速反应并解决问题,防止损失进一步扩大。
四、保障软件供应链安全的重点
从代码自动分析技术研究看,保障软件供应链安全的重点在于对于已知漏洞和未知漏洞的发现,表现在研发更好的同源分析与静态代码安全漏洞自动检测工具两个方面。
第一,对已知漏洞的检测,可以通过使用开源软件安全审计工具,即同源分析工具,快速发现工具中使用的开源构件,通过对已知开源构件的匹配,可以知道构件是否被篡改或者通过CVE、NVD等已知漏洞库的匹配。当然,很多已知漏洞并没有完全在网上公布,这也是潜在的问题之一。
第二,代码安全性检测,与传统代码漏洞检测类似,缓冲区溢出等漏洞本就是代码漏洞的重要检测内容。在漏洞检测外,可以针对软件供应链的常见后门攻击方式进行特征提取,自动扫描并发现同类恶意植入,对开发人员进行风险警告。静态分析技术是分析这类漏洞的最佳方式,但是,潜在的问题在于静态分析技术的圈子和安全圈并不重合。
(本文刊登于《中国信息安全》杂志2018年第11期)
声明:本文来自中国信息安全,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。