NPM 的安全困扰:仅有 9.27% 的 npm 开发者使用 2FA

作为 JavaScript 生态系统中最大的包管理器,npm 正遭遇安全困扰。其开发人员中,仅有 9.27% 的人使用 2FA,这意味着绝大多数 npm 开发人员的账户处于不安全状态。一旦黑客窃取开发人员账户,后果相当严重。

近日,npm 安全副总裁 Adam Baldwin 发推文称, npm JavaScript 库的所有维护者中,只有 9.27% 的人使用 2FA(双因素认证)来保护其账户。

这一数字竟如此之低!

Adam Baldwin 表示, 开发人员账户安全已经成为 npm 安全团队关注的主要问题。

从安全角度考虑,npm 安全团队希望 2020 年,有更多的 npm 开发者使用 2FA。

2FA,即双因素认证,它是一种相对更安全的认证方法。与传统单一的密码认证不同,2FA 使用两种不同的元素,合并在一起,来确认使用者的身份。比如,我们常用的手机短信验证码验证就是 2FA 的一种形式。

NPM ,全称是 Node Package Manager。它不仅是 JavaScript 生态系统中最大的 JavaScript 包管理器,而且还是所有编程语言中最大的包存储库,拥有超过 350000 个 索引库

此外,它每个星期大约有 30 亿次的下载量,包含超过 600000 个包(package)。

而这种“地位”和影响力,也让 npm 成为供应链攻击的主要目标。黑客会入侵开发人员的 npm 账户,从而在其库中插入恶意代码。

最近几年,这类事件层出不穷:

  1. 2019 年 7 月,有开发者在 purescript npm 安装程序中发现一些恶意代码。原来是有攻击者获取了 @shinnn(purescript npm 安装程序原始作者)的 npm 账户,随后在 purescript npm 安装程序中插入恶意代码。
  2. 2019 年 6 月 ,黑客向 npm 发布一个“useful”的包(electron-native-notify),等到它被目标(某应用程序)使用后更新包内容,加入恶意代码。而某应用程序又是 Agama 加密货币钱包的一部分。
  3. 2018 年 11 月 ,npm 下载量超过 200 万的 package 被注入了恶意代码,黑客利用该恶意代码访问热门 JavaScript 库,目标是 copay(开源比特币钱包)及其衍生产品的用户,以此窃取用户的数字货币。
  4. 2018 年 7 月,黑客利用恶意代码破坏 ESLint 库。该恶意代码被设计用来窃取其他开发人员的 npm 证书。
  5. 2018 年 5 月,黑客试图在名为 getcookies 的流行 npm 包中隐藏后门。

一份发表的 学术研究表明 ,大多数 npm 软件包“彼此交织在一起”,并且入侵 20 个备受瞩目的开发人员账户,就可能使黑客植入被整个 npm 生态系统一半使用的恶意代码。

因此,确保 npm 库所有者的账户安全应该是未来的重中之重。

或许,Mozilla 的做法提供了一种不错的方式。Mozilla 最近 宣布 ,从 2020 年 1 月起,所有 Firefox 浏览器扩展程序的开发人员都必须为其账户启用 2FA,才能更新其扩展程序。

此前,InfoQ 在《 npm 安全事故频频发生,程序员都绝望了 》的文章中报道过,有一位名叫 Sebastian K 的网友认为 npm(客户端和 registry)是一个有缺陷的系统,需要完全替换,新系统应具有这些功能:

  • 没有 unscoped 的包;
  • 作用域是 1 对 1 绑定到单个用户或组织;
  • 发布包必须要双因子验证,包必须通过 GPG 签名;
  • 除 registry 的维护人员外,任何人都不允许取消发布包;
  • 不允许在最终版本中使用模糊依赖项版本,我曾多次目睹在新克隆之后,运行 npm install 时修改项目的包锁定文件,下载了比锁定文件中指定的更高版本的可传递依赖项。

此外,npm 安全副总裁 Adam Baldwin 还披露了一些 其他数据

  • 2019 年发布的安全公告:595
  • npm 数据库的安全警报总数:1285
  • 错误吊销到 the registry 或 GitHub 的 npm 令牌数:737