对于所有从事Web或Node应用的人而言,噩梦可能正在唤醒我们:
媒体迅速报道了这件事,现在也出现了关于密码货币和安全的大规模丑闻,而JavaScript则是最好的处方。而且不止这些:这个丑闻从根本上合法地质疑了我们用Node.js构建(开源)软件的方式。
长话短说
NPM模块应该是多重签名的。而证书和信任模式应该是在区块链上完成的。开源开发者可签署package,并根据他们对付费软件的贡献来接收共享。这可以通过密码支付和智能合约来自动实现。相比发布权限,新的维护者 = 潜在黑客,只能被授予相对签名权限。模块管理器中的自动签名和验证检查,可以确定未知和不可信的新签名,并根据规则和各个威胁模块接受或拒绝更新。然后可通过更有针对性的方式审核这些模块。
免责声明:本文意见仅代表作者自己。
那到底发生了什么?
我们在GitHub和NPM上的 event-stream存储库中找到答案:
7年前,开发者dominictarr(好意)创建了一个名为“event-stream”的NPM模块,这是一个易于创建和使用stream的工具包。该模块非常成功,其每周的下载量约为200万。
在大约两个月前(经历了82个版本的更新),4.0.1 版本的模块被发布了。但是,这次是一个名为@ right9ctrl的黑客发布了它,而不是dominictarr。并且这个版本模块的目的并不是轻松创建和使用stream,而是窃取用户的密码货币。并且因为没有人会自愿使用这样的模块,所以他们对代码进行加密处理,并使用event-stream模块的品牌,将恶意代码隐藏到数百万个其它项目当中。
那么他们是如何进入官方NPM账户的呢?他们入侵了账户吗?他们是否使用了社会工程,他们是否胁迫了dominictarr?还是他是在枪口下被迫交出凭证的?
并没有,黑客只是通过电子邮件进行了请求,显然,这已经足以获得每周200万(或每年1.12亿)次安装的完全发布权!
很多开发者会是鲁莽的,他们把用户置于危险之中,人们可能因此已经或将会损失他们的资金。
面对来自外部的巨大压力,最初的开发者两天前发布了一份官方声明,陈述了一些非常有效的观点:
嗨,大家好,这不仅仅是一件小事,在您的依赖树中可能还有很多其它模块,这些模块现在成了作者的负担。我不是为了利他主义动机而创建的代码,我只是为了乐趣而做的这件事。[…]
如果它变得不再有趣了,那么维护一个流行的package实际上什么也得不到。[…]
所以现在,我们正处在一个奇怪的山谷,那里有一大堆依赖关系,这些依赖关系被失去兴趣的人所“维护”着,或者甚至他已经耗尽了兴趣,并且连他们自己都不再去使用。我看到了这个问题的两个强有力的解决方案……
1、支付维护费!
2、当你依赖某件事时,你应该参与维护它。
开源代码
我还没见到有哪个行业能够像软件行业一样,其中有很多工作是免费的,开源开发者们经常会这样做,很多只是为了“乐趣”,或者他们想要得到“反馈”,因为他们知道如果没有开源软件,我们就无法实现那么多的进步。然而,我们对这些项目的责任和期望与付费软件却是相同的。开发人员和维护人员经常因“不做”工作或没有“及时”回应,而受到骚扰。但是,我们忘记了大多数开发者都是按照自己的时间表来工作的,如果你有一份主业,并且希望和家人一起生活,或者对编代码并不是那么热衷,那么“及时”反馈根本就是一种奢望。人们常常忘记开发者不欠任何人任何东西。
维护是一个巨大的负担,这就是在付费软件行业中通过维护赚取大量资金的原因。但我们忘记了 npm install cat-ascii-faces –save 并不包含终身维修服务这种要求。
一旦使用统计数字或付款下降,就很容易造成项目的停止。那些已停产的项目,正在成为一个大规款的安全问题,现在应该让每个人都清楚。或者引用Electron核心开发人员之一Paul Betts的话就是:
想要进行正确的更新,是极其困难的,而具有讽刺意味的是,这些天用于构建最流行代码编辑器以及密码钱包的Electron框架,现在存在着大量问题,例如具有公开记录长达一年之久的Chromium漏洞。很多依赖Electron 的应用,致使数百万用户面临风险。但即使你经常更新自己的软件(正如你希望的那样!),是什么阻止恶意NPM程序包偷偷潜入应用的代码库?我还没有检查它,但如果event-stream 进入了非常流行的应用,例如VS Code,它可以很容易地升级到相同的完整远程代码执行(RCE)攻击。拥有完整的主机系统,就好像黑客正坐在它前面,他可以完全访问键盘、鼠标、文件系统、相机…?攻击场景不仅仅限于从钱包从窃取密码货币。
NPM模块安全性
这个月初,我在以太坊 Devcon IV 大会上就浏览器和钱包安全性问题发表了演讲。其中有一张演讲幻灯片,它讨论了过去基于Electron应用的攻击向量以及成功的攻击案例。
这张幻灯片基于Luca Carettoni令人敬畏的黑帽演示“Electronegativity”和威胁模型:
NPM模块打开了一个巨大的攻击面,在3周前,我就向听众进行了警告,他们不知道在当时正在发生另一起攻击。NPM 或依赖项安全性对于Electron或Node.js而言,并不是一个特定的问题(即使那里会更糟糕)。它也不是新的或未知的,不幸的是,它也不会被新的审计特性所解决。而且,在GitHub上进行更好的AV集成或扫描,或者AI或漏洞检查和标记,并不能解决此问题。尽管这些都是巨大的进步,它表明我们最终可以清醒过来,并且更加意识到我们面临的安全问题。
那么,我们怎样才能修复我们的生态系统呢?
在dominictarr发布的声明中,他写道:
“开源是由共享驱动的!这很棒!在比特币流行之前,这种方式就工作得很好了。”
有趣的是,我认为区块链技术并不是一个问题,而是一个解决方案,我们需要两件事来创造一个更好的生态系统:
- 我们需要一种更简单的方法,来根据某些规则自动向开源开发人员进行支付。
- 代码和模块需要进行多重签名,并且证书应该更便宜且易于验证。
传统上,这两件事都是很难的,但我们几乎可通过“区块链技术”的最新进展来免费获得到它们。
那么,我们如何用区块链技术来避免这些场景呢?
比方说,我们有一个项目,它使用了开源模块,并使用密码货币作为应用内置支付方式。
我们的依赖项之一可能变成一个恶意package,就像event-stream事件中看到的那样。但是,原开发人员不给予新合作者完全维护或完全发布权限,而是给予新维护者或CI系统仅签署权限。所以新开发者会在他们发布的版本上签名,而原作者经过仔细的审查后,会附签声明,表示他检查并批准了这些更改。
【随着每次发布和附加签名,新作者自己的签名当然会获得更多的信任。】
如果稍后有人收到使用此模块软件的付款,那么在运行环境中可能有一些逻辑,这些逻辑基于此开源代码的影响或贡献,将自动把每笔付款的一部分资金分发给模块作者,而每年1.12亿次下载,足以积累成一笔巨大的财富,并实际鼓励作者维护流行和有用的项目。
虽然这听起来有点未来主义,但今天我们实际上可能已经拥有了,我们应该尽快到达那里。
其他签署模块的项目已开始基于PGP密钥,并且采用此标准,听起来是符合逻辑的下一步骤,该标准在其他软件领域已经是一种常见做法。
我敢肯定会有更多的改进方案,而签名和支付有望很快成为普遍现象,并帮助生态系统创建更高质量的代码,鼓励更多的开源开发人员做出贡献,因为我们非常需要它们。
注:原文作者是以太坊软件工程师Philipp Langhans