我们在开源软件上遇到了一些引人注目的安全问题。一个心怀不满的开发者最近故意发布了他的faker.js和colors.js包的修改版本,这破坏了"成千上万的项目这都依赖于他们。有些人想知道使用开源软件是否安全。白宫当然是——他们已经这是对主要科技公司的询问来评论Log4j问题之后的软件安全问题,这个问题暴露了无数服务器被远程利用。

志愿者编写的代码是否比专业开发人员编写的代码更不安全?如果产品不合格,你需要有人去起诉吗?你真的一分钱一分货吗?

什么是开源?

正如说所有的闭源项目都没有bug是错误的一样,说所有的开源项目都有安全风险也是错误的。不同的项目有不同的侧重点;他们中的一些人更关心他们释放的安全。

Josh Berkus已经确认五种类型的开源项目根据它们的结构:

  • 一个独奏项目是一个人的激情,或者最多是几个具有相同愿景的敬业的人的激情。
  • 一个君主政体是一个像Linux这样成功的独立项目,它获得了大量贡献者的支持,所以最初的创造者就像一个仁慈的暴君。
  • 一个社区类似PostgreSQL这样的项目在具有类似目标的同行中涌现出来,并受到共识的驱动。
  • 一个企业项目通常作为商业项目的分支发布,就像Sun发布OpenOffice作为StarOffice的开源分支一样。它的方向是由发布它的公司指引的。
  • 一个基金会最正式的是独立的业务结构——Apache可能是最好的例子。在那里,一个指导委员会做出决定。

一般来说,个人项目面临的安全风险最大。就像作家可以用任何内容更新自己的网页一样,独立开发者也可以用同样的方式更新自己的代码。通常,社区对独立项目没有足够的兴趣,因此它们成为事实上的标准。当Marak Squires修改他的代码以打印标志并进入无限循环时,我们在fake .js和colors.js中就看到了这一点。

开源和闭源项目的安全性取决于贡献者的关注点,而不是它们的结构。我们很幸运,莱纳斯·托瓦兹的安全问题是他关心的问题之一。Theo de Raadt,这位“终身仁慈的独裁者”,从一开始就意识到OpenBSD的安全问题。相反,StarOffice(商业)和OpenOffice都存在安全漏洞,允许远程执行XML文档中的任意代码。

很多眼睛都盯着别处?

开源的一个讽刺之处在于,它假设许多眼睛可以提高安全性。多年来,我们一直听到一些传道士声称开源更安全,因为“社区”可以审查代码。问题是:“社区”很少审查代码,每个人都认为是其他人在做。在“心脏出血”期间,这种错误的安全感真的被摧毁了——太多的代码和太少的眼睛意味着我们需要更好的过程和自动化来提高开源的安全性。

但是,还有另一种错误的安全感:不要仅仅因为您看不到,就认为闭源软件有更好的进程。在“心脏出血”的案例中,“社区”最终审查了OpenSSL中的漏洞,解决方案是……更加开源。LibreSSL是OpenSSL的一个分支,它关注的是安全性而不是向后兼容性。

开源需要共享责任

虽然在使用开源软件时不需要付费,但这并不意味着您没有义务——对您的企业、对您的客户和对社区。使用开源软件时负责:

  • 知道你用的是什么。一些生态系统最大的危险之一是一个开源项目可以轻易地包含另一个。今天的许多项目都包含其他项目作为组成部分。像npm这样的系统很容易在没有实现的情况下引入代码。现在有一些工具可以帮助生成软件材料账单(soms),并扫描代码,看看您是否依赖于一些您不知道的东西。
  • 避免单独或被放弃的项目。一个恶意的开发人员可能会带来很多危害—尤其是在自动升级的情况下。使用废弃项目的危险在于,它们可能无法解释现代的脆弱性。评估每个版本所使用的项目的状态。
  • 在发布之前进行测试。开源项目的许多危险来自于没有测试的升级。如果您的代码包含一个带有漏洞的开源库,您的用户将会保留负责。使用项目的特定版本进行认证,并保持这些版本的更新。Fork您使用的开源库,并专门提供资源来检查已提交的内容。
  • 计划更新。Log4j漏洞特别危险,因为它允许在将软件嵌入ROM的平台上执行任意代码。对于一些物联网设备,没有办法升级Log4j库来修复它。这就留下了一个无法解决的持久漏洞。不要让你的产品陷入同样的困境。为每个组件提供一个升级(和降级!)路径。也不要等到出现安全问题才升级代码——计划定期更新到最新版本,以改善代码的卫生状况。
  • 为开源项目做出贡献。许多开放源码项目使用很少的资源交付有用的代码。承诺为您使用的开源库提供资金或开发或QA资源。不要把你的开源贡献限制在你离开图书馆的那天——开源需要持续的支持,所以把开源贡献包括在你的年度预算和长期计划中。您需要确保最新版本与您第一次取出的版本一样安全。
  • 在DevSecOps投资。假设频繁更新是常态,而不是例外。无论是您自己的团队创建的代码,还是您从开源项目中引入的代码,都要意识到会发生错误,需要更新,并且在某些情况下,需要快速迭代来跟上变化。DevOps,以CI/CD的形式,现在是桌上赌注;通过添加“Sec”来增加赌注——将自动安全检查直接转移到开发周期的能力,这样当更新到来时,你就可以更好地准备解决问题,而不用熬夜,更少的辛苦和压力。

从噩梦中醒来

如果你害怕使用开源,那就太晚了。今天您不太可能使用没有开源组件的产品。几乎可以肯定的是,你正在使用基于开源技术的浏览器阅读这篇文章,它由一个具有开源核心的web服务器提供服务——所有这些都是用开源工具构建的。虽然噩梦不是现实,但它可能是对合理焦虑的一种反应。负责任地使用开源软件,避免起鸡皮疙瘩。