返回档案库

案例库 · 软件与 IT · 技术决策 · 2016

一个 11 行的 JavaScript 包被删,导致全网构建翻车

2016 年,一名开发者在争议后把自己发布的 npm 小包「left-pad」下架。成千上万个项目依赖它,结果全网构建接连出错。

npm · 2016-03-22

怎么回事

2016 年 3 月 22 日,独立程序员 Azer Koçulu 把自己在 npm 上发布的 273 个包全部下架。里面包括一个只有 11 行代码的 left-pad,用来在字符串开头补字符。它看起来很不起眼,但因为被成千上万个项目依赖,下载量超过 1500 万次。

这次删除是一次小事引爆的大争执。Koçulu 发布了名为「kik」的包,Kik Messenger 背后的公司要求他把名字让出来;他拒绝后,npm 直接把这个包转给了对方。Koçulu 很恼火,去问 npm 的 CEO 怎么删掉自己全部包,结果拿到了命令。他照做了,把 left-pad 也一并删掉。

影响立刻扩散。因为很多流行工具都直接或间接依赖 left-pad,包括 Babel、Webpack 和 React,JavaScript 生态里的构建和安装开始失败,Facebook、Netflix、PayPal、Spotify 等公司的流程都冒出 404 错误。npm 在几小时内恢复了这个包,随后改了规则,限制广泛使用的包被轻易下架。短短几小时,一个 11 行函数就让互联网相当一部分环节翻了车。

为什么会这样

  • 现代 JavaScript 项目依赖大量细碎的第三方包,一个小包被删,就可能沿着依赖树连锁影响成千上万次构建。
  • left-pad 经常被 Babel、Webpack、React 这类高流量工具间接依赖,它一消失,很多项目甚至都没听说过它,却照样被牵连。
  • npm 起初允许单个作者随意下架一个被广泛依赖的包,没有给下游用户任何保护。
  • 整件事由包名争议触发,说明关键基础设施竟然建立在松散、个人化的控制之上。
代价全网数小时构建失败丢脸

教训

靠成千上万个小包堆出来的代码库,少了其中一个也可能崩。left-pad 只有 11 行,却被 JavaScript 世界大量依赖。要清楚自己的依赖关系,并把关键依赖锁死。

后来呢

npm 在几小时内恢复了 left-pad,并把政策改成:发布超过 24 小时且已有依赖的包,不能再被下架。这件事成了软件供应链脆弱性的标志案例,暴露出现代互联网有多少东西压在一层很薄、常常没人维护、又由个人控制的开源小包上;后来的其他供应链事故和攻击也不断重复这个问题。对开发者来说,教训就是审计依赖树,把离不开的包固定版本并做本地镜像,不要以为「免费又热门」就等于「可靠且永久」。

资料来源

发现哪里写错了?告诉我们。

Comments · 0

    登录 后就能评论。

    类似的案例

    这家公司栽倒的地方,别处有人漂亮地解开过。 第二意见 →