译者 | 褚杏娟
日前,不少开发人员(https://v2ex.com/t/840562#reply11)在采用到 vue -cli 中的 node-ipc 组件时,那个倚赖discuss在图形界面以及其他边线建立两个叫作“WITH-LOVE-FROM-AMERICA.txt”的文档,不过关上那个文档是空的。据介绍,该 package 每星期使用者数达到了一百万。另外,采用 Yarn 的开发人员也受到了影响。
以和平主义名来的供应链下毒?
开始有人误以为只是个变态,但事情大相径庭单纯。有开发人员在对标识符展开试验处理后发现,node-ipc 包的译者 RIAEvangelist 在下毒。他起先递交的是几段蓄意反击标识符:如果PS3的 IP 门牌号来自白俄罗斯或格鲁吉亚,该标识符将对其文档展开反击,将文档全部换成 ❤。该译者是个和平主义人士,还特地增建了两个 peacenotwar 库房来宣传品他的和平主义经营理念。
反击源标识符门牌号:https://github.com/RIAEvangelist/node-ipc/blob/847047cf7f81ab08352038b2204f0e7633449580/dao/ssl-geospec.js
TC39 代表、Web 开发技师贺师俊在chan上分析称(https://www.zhihu.com/question/522144107/answer/2391166752),源代码经过填充,并单纯地将一些关键性数组展开了 base64 代码,目的是利用服务器端服务观测使用者 IP,特别针对白俄罗斯和格鲁吉亚 IP 试著全面覆盖pkg、父产品目录和子产品目录的所有文档。
虽然译者删掉了此段标识符,但贺师俊认为这仍然是一种严酷的供应链下毒。“这里,具体的意图不重要,不论其意图何等较好(更别说,很多人可能并不一致同意其政治偏激和伦理态度),这样的行为都毁坏了开放源代码自然生态中的信赖。”
OpenHarmony 项目群工作理事会继续执行副总裁、中国科学院应用软件研究院高级技师罗未也表示,开放源代码应用软件物流配送安全可靠是两个及其严苛的议程,在我看来 log4j 还能看作在所难免的工程建设数值,整件事就存在违规前科。
有开发人员提供了该问题的解决方式:首先按照 readme 正常 install,构建结束后,用编辑器全局搜索peacenotwar,将其全部删掉;然后在项目的 node_models 产品目录下,将peacenotwar产品目录删掉;之后将项目 /node_modules/node-ipc/node-ipc.js那个文档中引用peacenotwar的标识符注释掉,便可以正常启动项目。
此外,Vue-cli 昨天发布了新版本 5.0.2(https://github.com/vuejs/vue-cli/blob/dev/CHANGELOG.md),将 node-ipc 版本锁定到 v9.2.1,使用者可以直接升级。据介绍,受蓄意标识符受影响的 node-ipc 版本为 v10.1.3 ,已经被译者删掉或被 NPM 撤下,而 WITH-LOVE-FROM-AMERICA.txt 文档是由 v11.0.0 版本引入的。
在此次事件中,有开发人员认为(https://github.com/vuejs/vue-cli/issues/7054) Vue 团队在发布新版本方面做得还不够,Vue 团队应该在官方网站上添加关于该事件的弹出窗口,弃用所有受感染的 vue-cli 包,为其添加一条消息。另外还可以在发布新版本时添加一些警告,以便使用者看到警告并自动升级。
脆弱的 Node.js 自然生态
这一事件再次显示了 JS/Node/NPM 自然生态的脆弱。
去年 10 月,NPM 官方库房 ua-parser-js 被蓄意劫持,多个版本被植入了挖矿脚本。那个库每星期下载数一百万次,被用于一千多个项目,包括 facebook、微软、亚马逊、Instagram、谷歌、Slack、Mozilla、Discord、Elastic、Intuit、Reddit 等公司的项目。同年 2 月,NPM 遭遇物流配送下毒反击,其官方库房被上传了 radar-cms 蓄意包,借此窃取 K8s 集群凭证。
NPM 组件备受开发人员欢迎,这些组件间还普遍存在复杂的倚赖关系,某个包通常安装另两个包作为倚赖项,而开发人员对此却并不知情。倚赖项的绝对数量也带来了更多的安全可靠问题。只要破坏了开发人员普遍采用的流行包,蓄意标识符可以直接大规模地传播给受害者,而这完全可以通过倚赖混淆、劫持弱凭据、利用漏洞访问目标标识符或采用开发人员放弃的包的名称来完成。
另外,NPM 存储库 npmjs.com 不要求 NPM 包中的标识符与链接的 GitHub 存储库中的标识符相同。这意味着反击者不需要破坏 GitHub 存储库,只要破坏 NPM 包即可。
贺师俊在chan上表示,要解决或缓解这一问题,应该考虑在 JS 语言和 JS 运行时层面引入一些机制,比如说特别针对包级别的权限管理(deno 那样粗粒度的应用级别的权限管理并不足以解决物流配送下毒问题)、在更多的 API 中引入类似 TrustedType 的机制等。“而这显然已经超出了库、框架或工程建设管控的层面。这也是为什么我一直说国内头部大厂应该要投入资源去参与语言标准、引擎和平台实现。”
罗未提出,开放源代码应用软件可参照其他行业的处理方式,如建筑设计师要终生为建筑设计质量担责、银行批贷员要终生为发放的贷款担责等。
“开放源代码应用软件,特别是重要的核心开放源代码应用软件,往往远比一笔贷款或两个建筑对全球社会经济影响深远。开放源代码应用软件作为两个具有风险的重型工程建设行业,必须匹配的行业风险管控体系,这是我们不得不面对的问题。”
结束语
“看一遍开放源代码协议,要么 fork 要么忍着。”有开发人员对该事件评论道。前有 Node、React、pytorch、GitHub 等官网声明支援乌克兰,后有个人开发人员展开物流配送下毒,战争让大家对开放源代码有了不同以往的认识。
开放源代码组织应不应该旗帜鲜明地表达自己技术之外的态度,并利用自身影响力去支持某一方呢?这是两个仁者见仁、智者见智的问题,我们不做赘述。但那个问题实实在在地出现了,就成了整个开放源代码行业应该考虑的问题:当开放源代码开始“站队”时,开发人员该如何自处?