为什么你应该关心你安装的 npm 内容
仿佛我们还没有从11 月 26 日的Left-pad事件中吸取任何教训,JavaScript 世界再次发生了震动。
一个拥有超过 200 万次安装量的热门 Npm 库竟然被植入了后门。等等,什么?!没错,你没听错,这个当时尚未被归档、从车库脚本小子到企业系统都在使用的event-stream库,被感染了一个令人厌恶的后门——一个加密货币挖矿/窃取程序/之类的东西。为了增加戏剧效果,我们以后就叫它 C 病毒吧。
该死的加密货币炒作,泡沫早就该破灭了,让我们回归正常生活吧。—— 我,2018年12月
但是,这一切究竟是如何发生的呢?嗯,一系列不幸的巧合,加上作者对人性的信任,才造就了我们今天所看到的局面。
作者很久以前就停止使用和维护这个图书馆了。由于没有进行归档,随着时间的推移,它逐渐成为许多项目的依赖项。巧合的是,有一天,一位好心人主动联系了他的邮箱,表示愿意承担维护图书馆的重任,并将这份工作传承下去。然而,这位好心人却并非善类,不是吗?
作者将 Npm 模块的版权转让给了这位好心的陌生人,但模块的代码仍然保留在自己的 GitHub 账户上,因为他在尝试将代码转移到陌生人的账户时遇到了名称冲突的问题——至少他是这么说的,但我认为这并非偶然。这位好心人其实是个阴险狡诈的阴谋家。
他一拿到库文件,就撤销了原作者的发布权,添加了flatmap-stream包含 C 病毒的模块,然后进行了一次小版本更新,最后在 Npm 上发布了新版本。
全球范围内的 event-stream 库都被更新到了新的小版本。
植入 C 病毒后,他立即flatmap-stream从库中移除了该模块,然后进行了一次大版本更新,再次在 Npm 上发布了新版本。真是高明啊!代码库本身并没有什么可疑之处,但由于这是一次大版本更新,大多数系统都锁定在之前的版本,因此不会更新,它们仍然会保留着被感染的代码。
甚至我的一位同事也被感染了,几乎没人注意到,但凯文·博蒙特注意到了。
以上只是简要概述,可能漏掉了一两个步骤,但你应该明白我的意思了。
简短通知:
我们不应该责怪作者,他可能确实没有深思熟虑,但维护开源软件确实很麻烦,而且会给作者带来巨大的精神压力,尤其是在当今这个人们凡事都想不劳而获的社会。所以,我们不要责怪他。
现在让我们回到正题!哦,这里还有凯文·博蒙特的一首佳作。
从这场混乱中我们能吸取到的关键教训:
- 有时我们习以为常,却不去思考我们通过 Npm install/composer require/yarn add 添加了什么。
- 开发者们变得懒惰了。我们开始过于字面地理解“不要重复发明轮子”这句话,与其多写几行代码,我们宁愿使用库,有时甚至对于最简单的任务也是如此(尤其是在 JavaScript 领域,这似乎是一种趋势)。
- 选择依赖项时务必慎重考虑,依赖项越多,技术债务也就越大。
- 添加一层抽象,并设计一个接口作为领域逻辑和库之间的桥梁/适配器,以便在需要时更容易地进行替换。
- 当一个库停止维护后,该代码的所有权就归我们所有,我们有责任将其修复并纳入我们自己的代码库,或者找到合适的替代方案。
今年11月,许多企业再次惨痛地吸取了这些教训。
感谢你耐心看完我的长篇抱怨!
在你离开之前……
如果您喜欢这篇文章,请分享。也欢迎浏览我们的其他文章,您或许也会感兴趣!我们会不定期撰写关于软件开发、技巧秘诀以及如何成为更优秀的开发者和商业人士的文章。加入我们,一起不断进步吧!
请在Facebook、Twitter、LinkedIn、Medium或DEV.to上关注我们。
原文发表于jsguru.io。
文章来源:https://dev.to/jsguru_io/why-you-should-care-what-you-npminstall-267c
