开源组件在软件开发场景中越来越重要。无论是持续集成/部署、DevOps还是常规软件更新,开源都为众多开发者带来了很大的帮助。
在去年发布的一份报告中,芯片设计自动化厂商Synopsys发现,2021年内有97%的代码库中包含开源组件。而在研究涉及的17个行业中,有4个行业(分别为计算机硬件与芯片、网络安全、能源与清洁技术,以及物联网)参与审计的代码库100%包含开源片段,其他垂直行业的最低“开源含量”也有93%。
很明显,开源的成功已经在提高效率、节约成本和增强开发者生产力方面体现得淋漓尽致。
Synopsys公司高级技术作家Fred Bals在评论博文中写道,“开源已经是无处不在。”
但与此同时,开源软件包在应用程序开发中的不断普及,也给那些打算利用软件供应链传播后门的恶意黑客群体创造了前所未有的机会。
开源软件包在开发领域的大规模应用,意味着企业往往不清楚这里面到底有些什么。由于在各方之间不断过手,审查的复杂度开始直线飙升,软件供应链的实际情况也愈发模糊。去年VMware的一份报告发现,由于必须依靠社区来修复漏洞,再考虑到相应的安全风险,人们对开源软件的安全问题开始保持高度警惕。
Endor Labs是一家专司保障应用开发内开源软件安全的厂商,该公司联合创始人兼CEO Varun Badhwar将开源软件称为“我们关键基础设施中的骨干”。但他同时补充称,也有相当一部分开发者和企业高管没有意识到自己的应用程序已经被开源软件所全面渗透。
Badhwar指出,纵观所有安全漏洞,高达95%的比例源自“依赖项”——也就是由开源软件包间接引入,而非开发者的主动选择。
“这是个巨大的隐患,但却常常被人们所忽视。”
逐渐摸清威胁的真面目
对开源软件包的依赖早已不是什么新鲜事。根据软件供应链管理供应商Sonatype联合创始人兼CTO Brian Fox的介绍,这一习惯在开发者群体中至少已经有十几年的历史。
Fox在采访中表示,开发人员经常将源代码组件拼凑起来,再向其中添加业务逻辑。通过这种方式,开源就成了软件成果的基础。
而近年来最显著的趋势性变化,就是除了大规模使用开源组件的开发者之外,人们对于IT运作的普遍认识也有所增强。
“攻击者也摸清了开发的底细。过去这五年左右当中,出现了影响整个行业的重大变化,也就是针对供应链的恶意软件攻击开始兴起。”
真正为这场变化拉开序幕的,是2020年的SolarWinds攻击事件。与俄罗斯相关的恶意黑客入侵了该公司软件系统并植入了恶意代码,随后在更新期间,用户不知不觉间下载了恶意代码并遭到波及。接下来又有类似的攻击出现,先是Kaseya、之后是声量巨大的Log4j。
从Log4j事件说开去
Fox认为,这款基于Java的日志记录工具,正是大量合并开源组件所引发风险的直接证明。而且这类实践在软件开发当中其实非常普遍。
“Log4j是软件中的一款简单组件。它的应用极广,几乎可以认为存在于任何一款Java应用程序当中,覆盖率大概有99.99%。那么作为攻击者,自然有必要关注这类影响范围巨大的目标。只要能找到利用它的办法,就能在互联网上「大杀四方」。这跟1990年代那会的情况完全不同,当时攻击者得一个个研究不同Web应用程序的突破方法,因为那时候的程序会分别使用自己的定制代码。”
所以从本质上讲,企业“已经把90%的开发工作外包给了我们既不认识、也不信任的人。这听起来很可怕,但过去十年间的事实就是如此。我们现在才刚刚开始探究这到底意味着什么。”
Log4j还凸显出软件供应链中的另一个问题,即如何判断一款软件对于开源代码的依赖程度。而且尽管修复补丁早已发布,但估计仍有29%的Log4j下载量对应的是未修复版本。
根据Sonatype公司的分析,企业客户在大多数情况下使用的都是易受攻击的组件版本。经过修复的版本不是没有,但企业很少全貌和。Fox称,这个问题需要安全意识教育来解决。“96%的问题都出在人们继续吃「脏东西」上,大家往往没有意识去挑选干净的版本来用。”
矛头指向代码仓库
开源软件普及带来的另一大威胁是:黑客开始将恶意软件注入GitHub、Python软件包索引(PYPI)和NPM等代码仓库当中。利用依赖项混乱扬起的迷雾,恶意黑客开始为各种流行软件开发恶意版本,并诱导开发者将其纳入自家软件。
比方说,他们可能把正确软件中的破折号替换成下划线,这样粗心的开发者就很可能选定了错误的组件。
Fox认为,“这里的挑战在于,开发者一旦开始获取错误的组件版本,攻击就已经开始了。这跟以往通过浏览器主动下载不一样,现在的下载过程被隐藏在了工具中、发生在幕后,这同样有可能导致恶意软件的传播。”
“这类攻击手段的复杂度不高,有些恶意组件甚至懒得把自己伪装成合法组件。不编译、不测试,只是把有效载荷发布出来。就这么简单粗暴,也仍不乏受害者上钩。”
防御方正在集结
尽管开源软件存在固有的安全风险,但其优势仍然不可否认。Fox强调,开源软件比商业软件更透明、更清晰。他仍然以Log4j事件为例,当时贡献团队在几天内就放出了修复程序,这是商业组织很难做到的。
网络安全服务商Vulcan Cyber的高级技术工程师Mike Parkin对此表示赞同,他认为开源模型的公开性是把双刃剑——既有助于缓解网络威胁,也可能拉低潜在的攻击门槛。
Parkin在采访中指出,“从历史角度看,应该还是开发者相对更占优势。”
SolarWinds事件也让人们开始认真关注软件供应链的安全问题。以总统拜登的2021年网络安全行政令为基础,白宫方面于2022年9月正式要求各联邦机构在使用第三方软件时必须遵循NIST指南,包括软件开发商需要自证安全并提交软件材料清单(SBOM)。
软件开发商也在推动广泛努力,希望加强软件供应链的整体安全性。具体手段包括开放软件供应链攻击参考,发布漏洞可用性交流(VEX)等工具,并使用由各网络安全厂商开发的相关产品。
但这还不够,Sonatype公司的Fox希望看到更多举措——例如要求软件开发商召回存在缺陷的软件组件。而这项工作的前提条件,就是首先普及软件材料清单。Fox将其与汽车制造业进行了比较:厂商只需要向买家提供一份零配件清单,即可明确责任划分。如果证实是其中某一配件的缺陷,则整车本体不需要召回。
“软件也应该建立起类似的召回机制,这意味着开发商知道用了哪些组件、这些组件来自哪里,还有应用程序的正常运行依赖于哪些开源软件版本。只有这样,安全隐患才有被发现和管理起来的可能。这才是正确的安全发展方向。”
Fox还希望各方能专注于维护开源软件包。政府在这方面已经有所行动,《欧盟网络弹性法案》也谈到了软件召回问题,只是相关表述还不够确切。在这方面,美国很可能会走在世界前列。
他也提到了组件级防火墙的想法,这些防火墙的性质类似于检查网络流量并提前阻断恶意信息的数据包防火墙,区别是在组件层级上阻止恶意代码损害软件失。
“如果我们压根不了解软件里有些什么,那就不可能搞清楚里面有没有恶意软件。这不仅代表着易受攻击,甚至可以说是种「我为鱼肉」的消极姿态。只要被对方触及,恶意黑客就能立刻制造伤害。而且很遗憾,大多数人还没有认真思考过这个问题。”
Sonatype公司的方案是将Nexus防火墙构建至平台当中,依托于衍生自信用卡欺诈保护的技术阻断恶意代码。防火墙理解正常运作时的状态,并利用AI和机器学习技术检测异常活动。2022年,该防火墙就标记出了108000多次恶意攻击尝试。
“很多组织甚至压根没有意识到这个问题。但现实就是如此,恶意黑客们仍然逍遥法外、肆无忌惮。”
不止如此,防火墙功能还需要跟软件材料清单结合起来。
“没错,必须了解软件中的各部分组件在哪。这样当下一次Log4j事件发生时,我们才能立即做出纠正,而不必临时对成千上万的应用程序做划分。但理解软件构成还只是第一步,我们需要建立保护体系才能真正拒恶意攻击于边界之外。”