导读:现代软件开发越来越多地依赖于开源软件,开源第三方库的层层复用使得下游软件开发者无法清楚知悉上游软件依赖情况。不透明的软件上游依赖会导致不可控的软件供应链风险,因此需要对软件供应链进行分析,检测与规避隐含的风险。下面将结合我们团队对软件供应链研究的理解,对风险种类与危害、风险引入途径进行总结。

1、风险种类和危害

1.1 安全漏洞

安全漏洞在生态中普遍存在】安全漏洞是开源软件供应链中最大的风险之一。根据Sonatype 2021年的报告[1],29%的流行项目包含了已知的第三方库安全漏洞,足以可见安全漏洞的普遍性。下图是摘自报告中关于不同语言生态安全漏洞的普遍性统计,可以看到项目中安全漏洞占比从15%到39%不等,平均达到了29%,也就是说接近1/3的软件项目都包含了已知安全漏洞。

软件供应链中的安全漏洞影响广泛】攻击者利用软件供应链中的安全漏洞进而可以植入恶意代码或者窃取敏感信息。例如Log4Shell[2]与Spring4Shell[3]是2021-2022年影响非常广泛的两个安全漏洞。Log4j是Java生态中非常流行的日志记录第三方库,Spring是Java Web开发中非常流行的Web开发框架。攻击者利用Log4j与Spring中的远程代码执行漏洞(RCE),进而可以控制以及窃取宿主机器上的敏感信息。这类安全漏洞的特点在于,通过对供应链上游软件进行攻击,进而可以影响大量下游使用的软件。根据Google安全团队的报告,Maven生态中超过8%的第三方库都受到Log4j漏洞的影响。考虑到Maven生态巨大用户基数,可见其覆盖的影响面之广泛[4]。

As of December 16, 2021, we found that 35,863 of the available Java artifacts from Maven Central depend on the affected log4j code. This means that more than 8% of all packages on Maven Central have at least one version that is impacted by this vulnerability. [4]

安全漏洞危害】安全漏洞被不法分子利用后,企业内部数据库的敏感数据很可能被黑客获取,并以此获利,严重影响数据安全。例如,2022年6月,某黑客在某论坛以10比特币(约为20万美元)的价格售卖TB级的数据,涉及到10亿人的个人信息。2022年7月,万豪酒店[5]被曝再次泄露了20GB的客户信息,加上2020年的数据泄露事件,万豪总共泄露超过5200万的客户个人信息。此前,万豪酒店曾因未能保护个人用户隐私而被英国法院罚款2000万英镑,可见数据保护与软件安全的重要性。因此,在开源软件广泛使用的今天,如何平衡开发效率与软件安全可信、数据安全是需要进一步探讨的问题。

1.2 恶意软件

恶意软件感染方式】除了通过供应链软件中的安全漏洞植入恶意代码以外,攻击者也可以通过供应链软件投毒的方式污染下游软件。例如,通过在第三方库发布网站(如Maven、PyPI、NPM等),使用Typosquatting[6]伪造相似名称的恶意第三方库,诱导开发者下载。由于开发者对上游供应链软件名称不熟悉,很容易下载一个名称相似但完全不同的恶意软件包,进而污染内部的软件依赖。如2019年PyPI上发现的恶意包jeIlyfish包python3-dateutil包,前者与合法包jellyfish仅仅在一个字母上有区别,后者仅仅比dateutil多了python的前缀。

恶意软件影响】俗话说“无利不起早”,安全漏洞被利用后,黑客可以掌握机器控制权限,植入恶意软件,并借此牟利,如挖矿软件、DDos恶意软件、勒索软件等[7]。例如2017年针对Windows操作系统的WannaCry[8]蠕虫病毒,在感染计算机后,WannaCry弹出窗口提醒用户他们的文件已经被加密,并且要求在3天内支付价值300美元的比特币,否则7天后将无法恢复他们的数据。WannaCry在全球造成了大规模感染,影响了超过150个国家、20万台计算机,包括波音、丰田、中国公安机关、山东大学、中山大学等[8],造成了几亿的经济损失。

1.3 软件许可证

软件许可证违反风险】开源软件许可证规范了软件的使用、修改、传播方式。而如果对使用的供应链软件规定的许可证不加以注意,则可能会造成潜在的许可证违规风险。开源软件许可证风险中最有代表性的当属GPL了[9],其允许下游软件使用者随意修改、分发上游供应软件,但同时规定需要将自身软件源码也开源,即大家常说的"Copyleft"。例如,BusyBox是知名的Unix工具包,包含了Linux一系列工具集合,其中包括一些GPL许可证授权的工具。部分与其相关的诉讼案件如下[10]:

Monsoon Multimedia Inc., Xterasys, High-Gain Antennas,Verizon Communications,Bell Microproducts, 2007

SuperMicro, Best Buy, JVC, Samsung, 2008

Westinghouse, 2010 (经济损失达9万美元,相关的律师与诉讼费用接近5万美元)

软件许可证修改风险】React是前端开发中常用的开发框架,虽然开源但其背后由Facebook公司主导维护。2017年9月,在开发社区舆论压力下,Facebook宣布React框架将由MIT许可证授权(原为BSD+专利许可证),这一宣布将影响包括React、Jest、Flow、Immutable、Fresco、React Native、Metro、Yoga等一众开源软件。Facebook做出此决定也是属于舆论压力之下的无奈之举。原来,原有的BSD许可证+专利授权,意味着基于此开发的软件项目在初期虽然可以正常使用。但是假如Facebook打算发布竞品,并侵犯了你的软件专利,由于BSD+专利授权许可,那么使用者将不能借此对Facebook发起侵犯软件专利诉讼。因此,该条款也引起了开发者热烈的讨论[11]。以下梳理了该问题的时间线[12]。

2013年,Facebook开源React.js。

2015年,随着React.js日渐流行,Facebook在3月份增加了专利条款。

2016年,在开源社区引起了巨大的争议,出于对专利条款的担忧,很多项目决定中止React使用。

2017年,WordPress, Apache 基金会以及其他知名开源软件与组织都不同程度地做出声明,表示Facebook这一行为有违开源精神;同年Facebook将React.js许可证更改为MIT。

1.4 软件维护

除了以上的风险以外,开源软件的维护也是软件供应链中隐含的风险。

开源软件开发者风险】开发者作为软件开发主体,对供应链软件的质量起到了主要的作用,而盲目地信任开发者则可能导致无法预料的风险。例如,2022年1月,NPM库,Faker.js库作者Marak提交了一个commit “EndGame”,将该NPM库下所有源码清空。事情起因是该开源库一直由Marak在维护,项目的增长与需求的增加并没有换来对应收入的增长,没有大公司愿意资助导致他缺少持续投入开发的收入来源。几天之后,Marak在NPM流行开发包colors提交了一个新版本[13] ,通过故意加入了一个死循环,导致使用colors的node.js服务器都出现了拒绝服务Denial of Service。

开源软件停止维护风险】可靠的软件供应链需要上游供应链软件社区的持续投入和长期支持(Long Time Support, LTS)。软件也存在生命周期,上游供应链软件开发团队能否对软件全周期进行持续高质量的维护与投入,也是软件供应链中的风险点。在安全漏洞披露之后,供应链软件对安全漏洞更新与修复速度影响到下游软件的安全与可靠性,而其依赖于背后是否有一支强大的开发与维护团队。此外,也要注意上游供应链软件的开发者生态。由于开源软件的非盈利性,开源社区往往依赖于开发者的无偿贡献与使用者的自愿资助,因此其软件周期存在很大的不确定性,很可能在资金缺乏后停止软件的维护End of Life[14] 。而软件的停止维护也意味着安全漏洞暴露之后,下游软件无法通过更新的方式规避安全漏洞的风险,使得软件项目暴露在安全风险之下。例如,红帽公司决定在2021年12月底停止对CentOS Linux 8的支持[15], 意味着国内大量使用CentOS的企业都需要进行上游操作系统的迁移与替换,而没有及时替换的软件在遇到安全漏洞之后可能面临无法得到红帽技术支持的帮助。

开源软件版本升级风险】虽然供应链下游软件开发者可以通过提交issue、提交PR等方式对上游开源软件做贡献。但总的来说,开源软件的贡献机制与责任划分使得其更新迭代路线并不受下游软件影响。同时上下游软件版本的异步更新机制可能对下游供应链软件质量产生影响。出于代码维护与质量的需要,软件项目常常需要重构代码、增加新功能、修复缺陷等。这些过程都会有意或无意地导致原有的程序接口(例如API)发生改变以及程序接口的行为发生改变。因此,软件版本更新升级带来的风险也是软件供应链中不可忽视的一方面。例如,2021年,阿里巴巴的前端开源项目AntD的“圣诞彩蛋”事件[16],其暗藏的圣诞定制主题在圣诞节当天会自动启用。这个彩蛋功能不但没有引起正面效应,反而是由于导致了客户对软件质量与稳定性的质疑,引起了巨大的负面效应。

风险引入途径

在分析了上面风险种类与危害后,我们结合软件的开发维护流程,对风险的引入途径进行了总结。我们发现,在软件开发、构建、交付、使用过程中,都有可能引入开源软件供应链风险。下面我将详细地介绍与开发流程相关的风险事件。

开发】开发时使用的集成开发环境(IDE)和软件版本管理服务器等可能引入风险。例如,Xcode是苹果生态开发必备的开发环境,但国内很多企业的开发者使用了第三方网站下载安装Xcode环境。2015年9月,XcodeGhost事件[17]爆发,其起因在于国内开发者由于网速等原因,不直接通过苹果官网,转而使用了经过第三方重签名发布的Xcode环境,被植入了恶意代码,影响了4000多款苹果App。又如,2021年3月,攻击者利用Php作者和JetBrains开发者账号,向git.php.net服务器上的php-src推送两次恶意提交并植入后门,从而获得Php网站的远程代码执行权限[18]。

构建】构建时使用的持续集成(CI/CD)软件等可能引入风险。例如,2020年12月SolarWinds的 SUNBURST攻击事件[19],攻击者渗透构建系统,并在SolarWinds的DLL库中植入后门,影响美国关键基础设施、军队、政府等多达18000个企业用户。2021年1月,一名安全研究人员通过微软Visual Studio Code持续集成脚本中的一个安全漏洞,渗透进官方GitHub仓库,并提交文件,影响使用的开发者。

交付】软件包的分发与交付时使用的中央仓库可能引入风险。例如,2020年4月,RubyGems被植入了超过725个恶意软件包[20],总下载量接近10万次(例如,恶意包atlas-client利用Typosquatting模仿atlas_client)。这些恶意包一旦被安装,会自动通过Windows剪切板获取加密货币的地址,从而将任意加密货币的转账重定向到恶意开发者的账户。2021年2月,一名安全研究员成功侵入微软、苹果、特斯拉等35家国家大型科技公司内网,导致数周内,NPM和PyPi增加近5千多个概念验证攻击包。

使用】软件包的部署使用可能存在风险。例如,2020年4月,is-promise更新发布版本2.2.0,但是并未遵循正确的ES模块标准,导致所有构建时使用is-promise库的项目几乎全部发生故障,影响超过340万的下游项目。2021年12月,Java第三方库Log4j-2中被发现存在JNDI注入漏洞[2],当程序调用日志记录的API时,可触发该安全漏洞,其被利用后可导致远程代码执行。

小结

本文对软件供应链风险种类与危害、风险引入途径进行了简单的介绍和概括。随着企业数字化的加速推进,网络攻击与软件产业竞争加剧,开源软件供应链的风险分析与治理会更加受到相关企业与部门的重视。由于软件供应链风险的复杂性,我们所揭露的内容可能仅仅只是冰山一角。希望借以此文可以引起更多研究者和产业界人士的思考,共同为数字世界的安全可信做出贡献。

参考

[1] https://www.sonatype.com/resources/state-of-the-software-supply-chain-2021

[2] https://en.wikipedia.org/wiki/Log4Shell

[3] https://securitylabs.datadoghq.com/articles/spring4shell-vulnerability-overview-and-remediation/

[4] https://security.googleblog.com/2021/12/understanding-impact-of-apache-log4j.html

[5] https://www.itsecurityguru.org/2022/07/07/marriott-hotels-suffers-second-data-breach-in-2022/

[6] https://www.darkreading.com/vulnerabilities-threats/beware-the-package-typosquatting-supply-chain-attack

[7] https://baijiahao.baidu.com/s?id=1720265358604371151&wfr=spider&for=pc

[8] https://en.wikipedia.org/wiki/WannaCry_ransomware_attack

[9] https://en.wikipedia.org/wiki/GNU_General_Public_License

[10] https://en.wikipedia.org/wiki/BusyBox#GPL_lawsuits

[11] https://www.freecodecamp.org/news/facebook-just-changed-the-license-on-react-heres-a-2-minute-explanation-why-5878478913b2/

[12] https://react-etc.net/entry/react-js-patents-clause-to-be-removed-with-react-16-release

[13] https://snyk.io/blog/open-source-npm-packages-colors-faker/

[14] https://www.openlogic.com/blog/hidden-costs-unsupported-eol-oss#end-of-life

[15] https://www.zdnet.com/article/centos-linux-8-is-about-to-die-what-do-you-do-next/

[16] http://www.360doc.com/content/21/0318/18/74290474_967664153.shtml

[17] https://en.wikipedia.org/wiki/XcodeGhost

[18] https://php.watch/news/2021/03/git-php-net-hack

[19] https://www.varonis.com/blog/solarwinds-sunburst-backdoor-inside-the-stealthy-apt-campaign

[20] https://arstechnica.com/information-technology/2020/04/725-bitcoin-stealing-apps-snuck-into-ruby-repository/

声明:本文来自CodeWisdom,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。