作者简介:汪杰,开源安全治理解决方案专家、系统架构师、分析师,拥有十余年的安全开发经验,对SCA相关产品和技术实现原理均有深入研究,现任开源网安SourceCheck产品负责人。
一、开源背景
随着社会数字化进程的不断推进,开源技术被广泛应用于各个行业,推动产业的快速发展。毫无疑问,开源技术的应用有诸多好处,企业可以免费获取开源软件,以更低成本加快项目进度。而且开源软件大多数由开源社区支持,能一定程度上保证软件质量。同时,企业可以借助它快速占领市场,实现商业目的。
技术是一把双刃剑,不当使用开源技术也会带来大量风险。据统计,99%的项目使用了开源软件,其中有77.5%的项目存在开源软件漏洞,每个项目平均有52.5个漏洞。从许可合规的角度来看,65%的代码库存在许可证冲突,85%的代码库包含4年未更新的开源组件。
此外,近几年开源应用安全事件的频发也造成重大影响。2020年12月,SolarWinds遭遇国家级APT团伙高度复杂的供应链攻击;超过18000家客户全部受到影响,可任由攻击者完全操控。2021年11月,代码质量管理平台SonarQube被爆存在未授权访问漏洞;国内外数万家企业的敏感数据泄露,重点应用代码泄露。2021年11月,广泛应用的开源组件Log4J被曝存在超危漏洞;72小时内受到84万次攻击,国内外知名企业均受到重大经济损失,相关网络攻击至今仍在继续。
针对开源技术的风险,业内也越来越重视,相关的开源技术监管工作已全面铺开。许多金融行业、通讯行业、科技制造业的企业已自发组成生态联盟,建立起相关开源治理的信息通道。中国信通院也在积极联合安全厂商和标杆企业,共同发布开源治理白皮书、开源治理工具评估等一系列指导标准,以促进行业的可持续发展。
二、开源治理思考
1.开源检测技术思考
如何知道应用中使用了哪些开源组件,可以从五个方面来考虑。
检测技术多样性:根据软件形态可以将检测技术分为源代码检测和二进制检测两种技术。其中源代码检测又可以细分两类,一类是有包管理器管理的软件,能迅速能检测到一些依赖关系。一类是无包管理器管理的检测技术,如C/C++语言,这类技术可以根据源码目录结构、部分代码特征指纹等来提取使用的开源组件信息,利用代码片段指纹信息的提取与匹配技术,能找出代码中拷贝的第三方开源成分的代码。
编程语言众多:据不完全统计,全世界有600多种编程语言,常用的语言大概有20多种,要想精准检测每种语言,必须要有特定的检测技术,针对每种语言的包管理器的技术、语法、编译原理等来提取代码特征和二进制特征。
文件格式多:不同语言的自身特点,加上编译环境的差异,在不同应用场景下就会有很多格式。如安装包格式、二进制文件格式、移动应用格式等。

检测场景多样性:不同的机构对开源的使用和检测场景不一样,大致可以分为三类。第一类,一些第三方检测、评测等机构一般都使用单个应用包上传检测的方式;第二类,有较完善的研发流程体系的企业,一般倾向于自动化,集成企业现有的平台或者工具,比如像源代码管理工具、持续集成工具、缺陷管理工具等实现研发过程的检测;而有一些企业,不关注研发流程而更加关注安全防护方面,更偏向于应用运行时的检测等。
依赖传递复杂性:开源组件的依赖性是指在开发过程中,一个开源组件需要依赖其他的开源组件才能够正常工作。这些依赖关系可能是直接依赖或间接依赖,并形成一个依赖链。检测依赖的技术,一种是通过包管理器技术,可以实时检测分析,更加精准;针对无包管理器管理的软件可以编译提前生成依赖关系数据并缓存,这类也可以找出依赖关系,但同一份代码在不同编译器、不同架构下生成的依赖关系可能不同,所有针对无包管理器的检测,要想检测的准,不仅仅是需要软件包本身,还需要提供当前软件包所处的环境。
2.开源应用思考
对于开源应用的思考,分为开源组件管控和开源组件管理两个方面。
开源组件管控,包括漏洞与许可风险管控、自研组件管控、组件基线库管控、引入和退出和其他管控措施。漏洞与许可风险的管控,就是漏洞的发现、确认、修复计划、发版计划、预警计划等等,简而言之就是对整个漏洞全生命周期的管控,许可也是如此,还包括许可的兼容分析等。自研组件管控分为两种,一种是全功能型的自研组件,针对某个业务全自研开发;另一种是中间件级的组件,即定制化修改的开源组件。做好这两类自研组件的管控,才能便于在后面的检测过程中进行定位和筛选。组件基线库管控,包含自研组件和开源组件,在企业内部必须要形成一个安全可信的基线版本库,不管是后面的引入或退出都是有必要的。其他管控措施,如黑白名单、策略规则,来配合开源组件的管控。
开源组件管理,通过制定计划、组织资源、分配任务、协调沟通等方式来实现目标,以便更加有效的使用开源组件。这里主要分为组织管理和流程管理。组织管理,通过设置相关的部门和机构来统一协调管理,协调资源,促进沟通。流程管理,上面管控提到的所有需要制度和流程的地方需要通过相关制度和流程管理,如组件的引入和退出制度流程流程,黑白名单定期维护流程等等。
3.开源安全的思考
开源组件的安全工作,包含漏洞修复、使用安全意识、更新与维护、实施访问控制和安全策略、审查和评估开源组件、建立应急响应计划等六个方面。
开源组件漏洞修复:当发现一个漏洞时,要知道它修复的必要性是什么,如果没有修复经验时应该怎么办,这些问题都是需要考量的。
开源组件使用安全意识:安全意识并不仅仅是靠制度流程或规范来创造的,它一定是在整个流程的使用过程中,通过大量的培训和实来去产生安全意识。有了安全意识,所有的研发人员都会积极参与到整个研发的开源安全治理工作中。
及时更新和维护组件:随着时间的推移,组件的风险和漏洞会越来越多,只有及时更新与维护这些组件,才能实时应对新的风险和漏洞。
实施访问控制和安全策略:比如对开源组件的下载、上传和修改都要做一些限制,防止整个开源组件在实施和使用过程中被不断的篡改错误,引发新的问题。
审查和评估开源组件:在做组件引用时,要查看开源组件的源代码、所属社区、风险报告等信息,来判断该组件是否适合企业引用。
建立应急响应计划:在发生安全事件或漏洞利用时,如0day漏洞、投毒组件,企业或组织应该建立应急响应计划,以及时响应并恢复正常运营。这包括对组件进行漏洞修复和安全更新,并与组件开发者和社区保持沟通。
三、开源治理解决方案
针对开源安全治理工作,总体能力方案主要从技术、安全和管理制度三个方面来展开,如下图所示。

1.管理制度
管理制度,包括组织架构、流程制度和安全培训。
组织架构,可以建立这样一个架构矩阵,最上层是统一领导工作的开源治理办公室,下面配备开源治理专家组以及开源治理管理员,给整个开源治理工作提供建议。再往下是安全部门和合规部门,对开源组件的漏洞和许可风险进行识别和规划,主导开源治理安全工作,最下层是产品研发部门,进行实际的风险修复工作。

2.安全
安全是最核心的部分,覆盖整个软件研发生命周期,可以分为三个阶段:源头安全、过程安全和运营安全。
2.1源头安全
源头安全,也就是需求设计阶段,在新项目启动时要做两件事。
一是建立开源软件引入及选型评估模型。
整个模型可以从4个维度去考虑:第一是组件可靠性,有些个人开发者因为兴趣上传之后不再维护,因此需要从社区的活跃度与软件活跃度来判断组件是否可靠。第二是安全漏洞,就是从漏洞利用难度和风险评估的角度来考虑。第三是法律合规,包括许可合规、专利使用要求、商标及著作权。最后是技术应用,就是性能满足度和业务满足度。
同时,开源软件的引入还需制定相关的引入和审批流程。在引入开源软件时,要经过软件成分分析、代码质量分析、代码安全分析和性能分析,只有开源软件满足所有要求,才会将其纳入到整个项目中。
二是做好组件管理,打造安全可信组件库。
将可信的组件纳入引入审批流程中,可加速开源组件选型,配合组件的准入流程和制度可以有效控制组件的引入。通过扫描制品库,得到企业或者组织内所有的制品信息,扫描的制品可以分为开源组件和自研组件,自研组件通过自研率分析可以区分出完全自研组件和修改的开源组件,这对后续的自研组件管理意义重大。当扫描完所有制品后,可以分为可修复和不可修复的组件,可修复的组件在资产定位中找到对应的项目进行逐步修复,修复完成后和无风险的组件共同纳入可信组件库中。对于不可修复的组件进行加白加黑或者其他操作处理。同时需要对可信组件库进行实时监控扫描,一旦发现可信组件库中的组件有风险,通过定位资产重新回到之前的流程中就行修复操作。
2.2过程安全
过程安全可以细分为五种情况。
全生命周期安全,自动化集成。在开发阶段,通过插件集成开发工具,帮助开发人员在编码过程中实时检测发现漏洞;集成代码仓库可以对企业或组织内所有的代码进行批量扫描检测,可以从管理视角全局审计代码使用的开源组件情况;通过集成CI(持续集成)平台,可以有效对违反安全策略(由平台设置的规则策略)的构建操作进行阻塞操作,并将异常构建发送到SOC中心进入提单流程。在发布前的安全测试环节,可以对物料包进行安全扫描,确定没有问题就可以直接发布。
源码安全,建立安全源码仓库。源码安全有四个阶段:第一是代码编写阶段,可以集成开发工具检测,遵循组件管理规范;第二是代码提交阶段,集成代码托管平台检测,集成策略规则,遵循代码访问控制;第三是修改开源阶段,进行代码同源检测识别修改的开源组件,以便在未来发生风险时可及时修复,同时要规避许可合规和漏洞风险,遵循代码修改控制策略;第四是源码仓库,要进行定时扫描和实时的风险预警。
制品安全,建立私服防火墙。前面在源头安全提到建立安全可信组件库,建立后还需要对可信组件库进行防护,要对外部和内部进入组件库的流量进行监听和审计,发现违反策略规则的组件进入时,要进行阻断;同时也要对制品库进行实时扫描,一旦发现风险要及时预警。
管控安全,建立安全卡口。基于全生命周期安全实施管控安全,在整个研发过程的关键节点,如代码仓库、持续集成平台、制品库等,增加安全卡口,进行合规校验,如果不符合规则,则进行预警。
安全预警,建立沟通渠道。当应用检测到漏洞或识别到未知风险时,可以通过邮件、短信等多种方式将检测结果通知给相关责任人,并且可以直接对接到第三方协作平台,如缺陷管理平台等,方便多人协作处理漏洞。
2.3运营安全
运营安全阶段,有三项重要工作。
第一是建立应急响应制度,通过知识库能力中风险预警,可以在24小时内同步新的威胁情报到SOC中心,配合应急响应机制进行响应。
第二是建立漏洞修复制度,当确认漏洞有效以及有对应的解决方案时,要根据管理能力中的资产管理,盘点出当前影响的漏洞在哪些项目中存在,并根据项目的属性定好修复优先级,统一进行逐步修复或者加固。
第三是建立组件更新制度,对新出现漏洞的组件的不同情况进行区别处理,比如老旧组件,在社区没有维护的情况下可以进行退出操作。对于要升级的组件,通过知识库中的组件兼容性分析和评估后,进行有规划的升级和更新。
3.开源组件安全及合规管理平台SourceCheck
开源组件安全及合规管理平台(SourceCheck)是开源网安自主研发的软件成分分析(SCA)产品,用于第三方组件的安全分析与管控,包括企业组件使用管理、组件使用合规审计、新漏洞感知预警、开源代码知识产权审计等,可实现对源码与制品的精准分析,是帮助企业实现开源风险治理的最佳工具。

很多企业内部不清楚使用了哪些组件、不清楚问题如何修复、无法掌握安全风险、应急分析响应慢、漏洞预警不及时、缺少响应的管控手段,这些都可以通过SourceCheck来解决,它能精准把控开源组件风险,透明化管理软件资产链条,最小化风险治理成本,最快实现安全组件选型,零人工介入自动化集成。
SourceCheck的优势主要体现在六个方面:
海量数据,专业可靠:支持Java、Python、Go、C++等15种以上主流语言,支持20多种包管理器,拥有1.2亿组件版本库,兼容CNNVD、CNVD、NVD等权威漏洞库。
多维检测,全面分析:支持源码包、二进制包、远程仓库、容器、私服检测,支持组件级、文件级、代码片段级检测,支持组件依赖分析、溯源分析,支持源码自研率分析,支持组件漏洞、许可合规分析检测库。
自主研发安全可控:入选国家信创产品名录,拥有数十项SCA领域发明专利,通过信通院开源可信工具评估测试,响应国家政策,优先兼容国产操作系统、国产数据库。
24小时预警与风险修复:支持新漏洞预警,支持组件推荐版本,支持漏洞修复建议。
无缝集成:支持与主流开发工具IDEA、Eclipse等插件集成,支持与GitLab、Jenkins、Jira等工具集成,有丰富的Restful API接口。
丰富的场景:私服安全,实现私服扫描及私服防火墙保护;安全左移,研发阶段早发现、早处理;持续集成,实现流水线、自动化;安全管控,黑白名单、阻断机制;安全审计,漏洞风险、合规风险。
四、开源治理总结
开源治理是一个体系建设的工作,涉及多个部门,而不仅仅由安全部门独立承担。在治理环节中,组织者对于企业内部的员工进行赋能培训非常重要,让员工意识到开源治理的重要性比制度流程强制监管更加有效;尤其在开源治理执行环节中,阶段性治理目标的明确非常重要。最后,工具大部分解决的是问题发现和处理的效率,并不能完全杜绝问题。