一、引言
2020年2月,国家信息安全漏洞共享平台(CNVD ) 发布了关于Apache Tomcat 存在文件包含漏洞的公告,该漏洞可以造成Tomcat上所有webapp目录下的重要配置文件或源代码等敏感数据的泄露,若同时存在文件上传功能,则可以进一步实现远程代码执行(RCE),直接控制服务器。
Tomcat是Apache软件基金会下的一个重要的开源软件,在全球范围内被广泛使用,根据FOFA系统最新的测绘数据显示全球范围内有将近300万个Tomcat服务对外开放,根据腾讯T-Sec系统提供的数据显示,国内受影响的采用AJP协议的IP数量约是4万个。近年来,随着软件开源化趋势成为主流,开源软件已经成为软件供应链的重要环节,是软件生态不可或缺的组成部分。然而,一旦具有大规模用户基础的开源软件存在安全漏洞,势必会影响整个软件行业的安全。
二、开源软件认识误区
(一)开源软件等于免费软件
开源软件指源代码可以被公众使用的软件,源代码公开是开源软件的主要特点之一。虽然大部分的开源软件可以免费获得,但是开源软件并不全是免费软件,仍有大量的开源软件对用户是收费的。
开源软件要求软件发行时附带源代码,但并不意味着它就一定是免费的;同样免费软件也只是软件免费提供给用户使用,但并不一定是开源的。
(二)开源软件可以随便使用
每一个开源软件都需要包含开源许可证去规定开源软件的使用范围和权利义务,开源软件并非完全没有限制可以随意使用,其最基本的限制就是开源软件强制任何使用和修改该软件的人承认发起人的著作权和所有参与人的贡献。
开源软件的许可证比较繁多而且复杂,经常遇到的开源许可证主要有GPL和BSD两种。如果不恰当地使用开源软件,未能充分理解和研究许可证规定的权利和义务,往往会埋下知识产权的风险隐患,甚至会被强制要求公开自家产品的私有代码。
(三)开源软件比闭源软件安全
开源不能作为判定软件产品安全与否的指标,开源并不意味着一定安全。事实上,近年来开源软件的安全性事件频发,也打破了人们传统观念中的“开源等于安全”的认知。根据Snyk公司发布的《2019 年开源安全现状调查报告》显示,“过去两年内应用程序的漏洞数量增长了88%,仅2018年包管理器(NPM )的漏洞数量就增长了47%”。
开源软件具有开放、共同参与、自由传播等特性,一方面由于开发者自身安全意识和技术水平不足容易产生软件漏洞,另一方面也无法避免恶意人员向开源软件注入木马程序进行软件供应链攻击等安全风险引入行为。
三、开源软件使用现状
(一)绕不开、躲不掉的软件开源趋势
当前,软件代码全部自行开发的公司几乎没有,大量企业通过使用免费的开源软件创建商用软件产品。根据安全与能力管理开源平台White Source发布的《开源漏洞管理现状》,只有极少数开发人员由于公司的政策要求而没有使用开源软件,96.8%的开发人员依赖于开源软件。用户往往以为自己购买的是商业软件,但实际上很多商业软件是基于开源做二次开发后以闭源形式提供给用户的。
另据Gartner的调查显示,99%的组织在其信息系统中使用了开源软件,如图1所示。Sonatype公司对3000家企业的开源软件使用情况展开过调查,结果表明每年每家企业平均下载5000多个开源软件。随着开源技术快速形成生态,企业用户引入开源软件已成大势所趋,绕不开、躲不掉。
图1 开源组件的使用频率
(二)难以分辨商业产品中的开源成分
从软件产品的使用者角度来看,企业购买的很多商业软件往往是开源软件的商业版或者发行版。如果用户没有明确地提出要求,商业软件供应商一般不会说明其产品中是否涉及开源组件,甚至对用户宣称是完全自主研发,导致用户的信息系统中被动地引入了开源软件。例如,号称自主开发的某某浏览器,经过专业测试后却发现其内核是开源软件Chrome。
从软件产品供应商的角度来看,当前的软件开发模式中包管理器替程序员做了很多他并没有意识到的决定,使得商业软件中引入开源软件的数量难以做到完全准确的统计。更有甚者,部分企业在软件开发过程中,对开源软件的使用比较随意,管理者常常不清楚自己的团队在开发过程中使用了哪些开源软件,就连程序员自己也无法完整地列出开源软件使用清单。等到商业软件流转到用户手中后,系统的运维人员更是无法完全知晓正在运行的软件产品中是否包含了开源软件,包含了哪些开源软件,这些开源软件是否存在安全漏洞等,这就无形中给企业的信息系统带去了安全风险。
(三)谁该站岀来为开源软件安全负责
随着大型软件开发过程中,开源组件的占比越来越高,加之软件开发人员往往只关注自己开发的那部分代码的安全性,忽视了采用的开源组件的安全质量,最终导致成型软件产品的系统安全问题越来越多。根据Snyk公司的调查报告,81 %的用户认为开发者应负责开源软件的安全性,如图2所示。
图2 开发者该为开源软件安全负责
大部分开源软件的使用者认为软件代码经过了很多机构和人员的测试和审查。然而,现实情况是并没有多少人对开源软件的代码安全进行测试,“心脏滴血”漏洞就是最好的例证。软件供应商对外售卖的商业软件中采用了开源软件,但安全责任并未从开源代码提供者转移到软件供应商,导致最终还是由用户承担了软件漏洞的风险。
四、开源软件漏洞安全分析
由于开源软件使用与获取的便利性,加之部分软件开发人员的安全意识淡薄,可能导致忽略开源软件带来的风险。总体来看,开源软件存在的安全问题比较严重,安全漏洞是主要的问题,软件供应链攻击呈现上升趋势,同时缺少系统的安全审查机制。
(一)开源项目维护者的安全意识和技术能力参差不齐
Snyk公司通过扫描数以百万计的Github代码库和程序包和对超过500个开源项目的维护者进行调查发现:只有8% 的开源项目维护者自认为有较高的信息安全技术,接近半数的开源项目维护者从来不审计代码,只有11%的维护者能做到每季度审核代码。另据Linux基金会发布的《开源软件供应链安全报告》显示,大量开发人员在开发软件时并未遵守应用程序安全最佳实践。开源项目维护者对代码安全质量重视不够和技术能力水平不足,是当前造成开源软件安全漏洞的主要原因。
奇安信代码安全实验室发起“开源项目检测计划”,通过对3000余款使用比较广泛的开源项目进行检测,发现所有检测项目的总体平均缺陷密度为14.22/ KLOC,高危缺陷密度为0.72/KLOC。路径遍历、空指针相关、密码管理、跨站脚本XSS、注入类缺陷、XML外部实体注入、缓冲区溢出、资源管理、HTTP响应截断、日志伪造等是开源软件主要的安全风险。
2019年,Unit42安全团队分析了 24000多个公开的GitHub开源项目,共识别出2328个硬编码密码,2464个API密钥和1998个OAuth令牌。对于关系社会安全稳定的企业单位,如银行等金融机构,信息系统中如果采用了上述的开源组件将会对社会经济安全造成恶劣的影响。图3中的这段代码[5]来自一个开源系统,它硬编码了用于支付的私钥,通过反编译可以直接查看相关配置数据。
在密钥管理中最常见的错误,就是将密钥硬编码在代码里。一旦攻击者获得密钥,再通过审计分析支付系统的加密算法就可以破译所有的加密数据。
functiiontoSubmit( $ pay m ent) I
Smerld- St hi s->getConf( $ pay montCM_Ord c rldl/memb or .id'); 账户
SpKey = S th is->getConKSp ay me nt[' M _Orderl di.' PmatcKcyR}:
Skey = SpKey=r? 'afsvq2mqwc7j0ivukqexrzdQjqBhr:$p Key;
Sret.uri = $this-^>callhackUrl:
Sserver.url - $this^>serverCallbackUrl;
图3 用于支付的密钥被硬编码在源代码中
(二)越来越多的黑客组织开始盯上开源软件
软件生产过程中,代码复用程度越来越高,各种开发包、核心库的应用越来越广泛。很多黑客组织也意识到了这一点,逐渐把目光放在了开源软件上,利用开源代码植入后门。这些代码的复用度越高,其中的后门影响范围就越广,从而实现对软件供应链上游的攻击。
2019年8月,Webmin被爆存在高风险远程命令执行漏洞,根据Webmin开发人员的说法,该漏洞不是编码错误的结果,而是“恶意代码注入受损的构建基础架构中”导致的。Webmin是一个用于管理Linux和UNIX系统的基于Web的开源软件,互联网上大约有13万台机器使用Webmin。根据Shodan搜索引擎收集到的统计数据显示,有近10万台服务器曾运行过存在“后门代码”版本的Webmin软件,对整个互联网安全造成了巨大的影响。
(三)开源软件缺少系统的代码安全审查机制
美国最先认识到开源软件安全问题的重要性,早在2006年美国国土安全部就开展过“开源软件代码测试计划”,对大量开源软件进行安全隐患的筛选和加固。
根据Snyk公司的报告显示,37%的开源开发者在持续集成(CI )期间没有实施任何类型的安全测试,54 %的开发者没有对Docker镜像进行任何的安全测试。
开源代码中不断发现新的安全漏洞,而很多项目没有查找并修复漏洞的响应机制。开源项目的安全记录方式也没有明确的标准可以遵循,GitHub上排名前40 万的公共代码库中,仅2.4%的项目有安全文档。
开源软件在实际的流通过程中,各个环节间缺乏系统的安全审查机制,部分企业内部也缺少必要的安全检测要求和规范,导致一旦底层开源组件出现安全漏洞,这些问题组件将传染给哪些商业产品、影响哪些业务领域,没人能给出一个准确的答案。
五、风险控制措施
(一)国家层面组织开展开源软件源代码检测工程
随着开源趋势的不可逆以及开源软件在商业软件中占的比重越来越高,开源软件俨然已经成为软件开发的关键基础设施,因此开源软件的安全问题应该上升到国家安全的角度来对待。
建议国家相关部门组织有业务基础的科研机构开展开源软件源代码检测工程,并将检测的成果以一种安全可控的方式向商业软件制造商及关键岗位的企业共享,尽可能降低开源软件漏洞对社会各行各业的影响。
(二)企业层面建设开源软件安全治理体系
企业应该建立开源软件安全治理体系,明确开源软件使用的安全准入条件,从软件开发阶段就建立开源软件使用的统一策略,实现开源软件引入和使用的标准化、规范化和合规化。
对于明确需要引入的开源软件,在加强版本控制的基础上,一方面开展安全风险评估检测;另一方面持续跟踪相关的漏洞情报,时刻提防软件供应链攻击。
(三)用户侧建立软件安全渗透测试机制
从已经发生的软件供应链攻击案例来看,非常有必要开展软件上线前的渗透检测。通过采用良性的攻防渗透的方法、思路和手段,及时发现软件系统中存在的安全漏洞和隐患,降低新软件上线给系统带来的风险。
企业在开展软件采购时,应向供应商明确要求提供软件中包含的开源组件,“用了什么,什么版本,软件来源”,并在验收时进行细致核查。
(四)检测机构加强对安全产品中开源组件的检测
信息安全产品是重要信息系统安全防护的重要组成部分,其自身的安全性将影响重要信息系统的安全。检测机构应要求软件供应商准确提供产品中包含的开源组件等信息,并针对开源组件开展专门的安全检测。这样一旦某个开源软件被爆出重大的安全漏洞,产品检测机构可以及时迅速地发布安全预警,并要求相关产品厂商尽快开展修复,甚至对修补不力的产品予以禁用处置。
六、结语
几乎每个商业软件都使用开源软件节省开发时间、降低公司成本、避免重复造车轮,但软件公司对这些代码的品质和来源却未必都给予了足够的关注和重视。
开源软件已经成为网络空间的重要基础设施,应积极开展开源软件源代码检测工程,推动建设开源软件安全治理体系,形成软件安全渗透测试的长效机制。
(原载于《保密科学技术》杂志2020年2月刊)