一个孤独的程序员依靠自己的天才和技术敏锐度来创建下一个伟大的软件的想法总是有点牵强。今天,它比以往任何时候都更像是一个神话。竞争激烈的市场力量意味着软件开发人员必须依赖数量不详的其他程序员创建的代码。因此,大多数软件最好被认为是组装——多样化的,通常是开源的组件,通常称为依赖项,与一些自定义代码拼接到一个新的应用程序中。

这种软件工程范式——程序员重用开源软件组件,而不是重复他人的劳动——这已经带来了巨大的经济收益。根据现有的最佳分析,开源组件现在占大多数软件应用程序的90%。经济上重要且广泛使用的开源组件——谷歌的深度学习框架TensorFlow或其Facebook赞助的竞争对手PyTorch、无处不在的加密库OpenSSL或容器管理软件Kubernetes——列表很长,而且还在不断增长。军事和情报界也依赖开源软件:像Palantir这样的程序已经成为对于反恐行动至关重要,而F-35包含数百万行代码。

问题在于开源软件供应链可能会引入未知的、可能是有意的安全漏洞。先前对所有公开报告的软件供应链危害的一项分析表明,大多数恶意攻击都针对开源软件。换言之,针对专有软件(如SolarWinds)的抢眼软件供应链攻击实际上只占少数案例。因此,由于现代软件依赖树的巨大复杂性,现在阻止攻击变得很困难:依赖于其他组件的组件无限地依赖于其他组件。了解您的软件中存在哪些漏洞对于软件开发人员来说是一项全职且几乎不可能完成的工作。

幸运的是,这事还有希望。我们建议软件生产商和政府监管机构可以采取三个步骤来提高开源软件的安全性。首先,生产者和消费者应该接受软件透明度,创建一个可审计的生态系统,其中软件不仅仅是通过网络连接传递的神秘blob。其次,软件开发者和消费者应该采用软件完整性和分析工具来实现知情的供应链风险管理。第三,政府改革可以帮助减少开源软件入侵的数量和影响。

依赖之路

关于可重用软件组件兴起的传统说法通常可以追溯到1960年代。贝尔实验室的Douglas McIlroy等软件专家已经注意到构建新软件的巨大费用。为了使任务更容易,McIlroy呼吁创建一个“软件组件”子行业,用于大规模生产软件组件,这些组件将广泛适用于机器、用户和应用程序——或者换句话说,这正是现代开源软件供应。

当开源开始时,它最初是围绕提供监督、一些管理和质量控制的技术社区联合起来的。例如,Debian是基于Linux的操作系统,由全球开源软件开发人员网络提供支持,这些开发人员维护和实施关于哪些软件包将成为和不会成为Debian发行版一部分的标准。但是这种相对密切的监督已经让位于一个更自由、可以说更具创新性的包注册系统,主要由编程语言组织。将这些注册项视为软件开发人员的应用商店,允许开发人员下载免费的开源组件来构建新的应用程序。一个例子是Python包索引,它是Python编程语言的包注册表,任何人——从理想主义的志愿者到公司员工再到恶意程序员——都可以在上面发布代码。这些注册表的数量是惊人的。

这种软件模型的有效性使得社会很大程度上依赖于开源软件。开源倡导者很快就援引莱纳斯定律为当前系统辩护:“只要有足够的眼睛,所有的错误都是浅薄的。” 也就是说,由于软件源代码是免费检查的,软件开发者在网上工作和共享代码会在影响社会之前发现问题,因此社会不应该过分担心它对开源软件的依赖,因为这支无形的军队会保护它。如果你眯着眼睛,这在1993年可能是正确的。但从那以后发生了很多变化。2022年,届时将有数亿新的几行开源代码,眼睛太少,bug就会很深。这就是为什么在2018年8月,花了整整两个月的时间才发现一个加密货币窃取代码已被溜进下载超过700万次的软件中。

事件流

故事开始于开发者Dominic Tarr将名为“event-stream”的开源JavaScript包的发布权转让给仅通过句柄“right9ctrl”知道的另一方。转让发生在GitHub 上,GitHub是数千万软件开发人员经常光顾的流行代码托管平台。用户right9ctrl提出维护事件流,当时每周下载近200万次。Dominic Tarr的决定是明智而平凡的。他在授权许可下免费创建了这款开源软件——该软件按原样提供——但他自己不再使用它。他还已经免费维护了数百个其他开源软件。因此,当 right9ctrl请求控制权时,Tarr 同意了该请求。

将一个开源软件的控制权转移给另一方总是在没有任何后果的情况下发生。但这一次却出现了恶意扭曲。在Tarr转让控制权后,right9ctrl添加了一个新组件,该组件试图从受害者的计算机中窃取比特币。数以百万计的计算机下载了这个恶意软件包,直到开发者Jayden Seric在 2018年10月发现异常。

事件流只是代码矿中的金丝雀。近年来,计算机安全研究人员发现攻击者使用了一系列新技术。有些人在模仿域名抢注:诱骗拼错软件包名称的软件开发人员下载恶意软件(dajngo与django)。其他攻击利用软件工具错误配置,诱使开发人员从错误的软件包注册表中下载软件包。这些攻击的频率和严重程度在过去十年中一直在增加。而且这些统计数据甚至不包括开源软件中可能更多的意外安全漏洞案例。2021年底以来,广泛使用的log4j软件包的无意漏洞促使白宫召开开源软件安全峰会。发现此漏洞后,一位记者稍稍夸张地为一篇文章命名为“互联网着火了”。

三步走计划

值得庆幸的是,包括美国政府在内的软件生产商和消费者可以采取几个步骤,使社会能够在最大限度地减少这些风险的同时获得开源软件的好处。第一步已经得到了美国商务部和工业界的支持,它涉及使软件透明化,以便对其进行评估和理解。这始于鼓励使用软件物料清单的努力。该清单是一个软件组件的完整列表或清单。有了这个列表,软件就可以更容易地搜索可能受到威胁的组件。

从长远来看,该措施应该超越简单的组件列表,包括有关谁编写软件以及如何构建软件的信息。借用日常生活中的逻辑,想象一种食品具有明确指定但未知且未经分析的成分。这份清单是一个好的开始,但如果不进一步分析这些成分,大多数人都会通过。个体程序员、科技巨头和联邦组织都应该对软件组件采取类似的方法。这样做的一种方法是采用Software Artifacts的供应链级别,这是一套用于防篡改组织的软件供应链的指南。

下一步涉及软件安全公司和研究人员构建工具。首先,签署和验证软件,其次,分析软件供应链并允许软件团队对组件做出明智的选择。签名商店项目,Linux基金会、谷歌和许多其他组织之间的合作,就是这样一项努力,专注于使用数字签名使开源软件的监管链透明和可审计。这些技术方法相当于防篡改密封的数字等效物。国防部的Platform One软件团队已经采用了Sigstore的元素。此外,收集、管理和分析全球软件供应链以应对攻击的软件供应链“观察站”也可以提供帮助。一个可能由大学联盟运营的观测站可以同时帮助衡量开源软件入侵的普遍性和严重性,提供支持检测的基础数据,并定量比较不同解决方案的有效性。Software Heritage Dataset提供了这样一个观测站的种子。各国政府应帮助支持这一举措以及其他类似的以安全为重点的举措。科技公司还可以采用各种“营养标签” 项目,这些项目提供软件项目供应链“健康”的概览。

然而,这些相对技术性的努力将受益于更广泛的政府改革。这应该从修复识别和披露开源漏洞的激励结构开始。例如,软件许可中通常包含的“ DeWitt 条款”需要供应商在发布对软件安全性的某些评估之前获得批准。这减少了社会对哪些安全实践有效而哪些无效的知识。立法者应该找到一种方法来禁止这种反竞争行为。国土安全部还应考虑为开源软件漏洞赏金设立一个非营利基金,奖励发现和修复此类漏洞的研究人员。最后,正如最近的网络空间日光浴室委员会所提议的那样,网络统计局可以跟踪和评估软件供应链危害数据。这将确保相关方不会被困在构建重复的、特殊的数据集上。

如果没有这些改革,现代软件将变得像弗兰肯斯坦的怪物,一个笨拙的可疑部分的汇编,最终转向它的创造者。然而,随着改革,美国经济和国家安全基础设施可以继续受益于开源合作所带来的活力和效率。

原文链接:

https://warontherocks.com/2022/05/dependency-issues-solving-the-worlds-open-source-software-security-problem/



原文来源:网空闲话

“投稿联系方式:010-82992251 sunzhonghao@cert.org.cn”