
摘要
2018 年 7 月 12 日,攻击者入侵了一位 ESLint 维护者的 npm 帐户,并将 eslint-scope
和 eslint-config-eslint
软件包的恶意版本发布到 npm 注册表。安装后,恶意软件包从 pastebin.com
下载并执行代码,该代码将用户 .npmrc
文件的内容发送给攻击者。.npmrc
文件通常包含用于发布到 npm 的访问令牌。
恶意软件包版本为 eslint-scope@3.7.2
和 eslint-config-eslint@5.0.2
,均已从 npm 取消发布。这些软件包中链接的 pastebin.com
粘贴也已被删除。
npm 已撤销 2018-07-12 12:30 UTC 之前发布的所有访问令牌。因此,此次攻击泄露的所有访问令牌应不再可用。
帐户被盗的维护者在多个其他站点上重复使用了他们的 npm 密码,并且没有在其 npm 帐户上启用双因素身份验证。
我们 ESLint 团队对发生此事深感抱歉。我们希望其他软件包维护者可以从我们的错误中吸取教训,并提高整个 npm 生态系统的安全性。
受影响的软件包
eslint-scope@3.7
,一个作用域分析库,是几个流行的软件包的依赖项,包括一些旧版本的eslint
以及最新版本的babel-eslint
和webpack
。eslint-config-eslint@5.0
是 ESLint 团队内部使用的一个配置,在其他地方很少使用。
如果您运行自己的 npm 注册表,则应取消发布每个软件包的恶意版本。它们已从 npmjs.com 注册表中取消发布。
攻击方法
有关攻击的更多详细信息,请参见 此处。
建议
吸取此次事件的教训,我们对未来的 npm 软件包维护者和用户提出以下建议
- 软件包维护者和用户应避免在多个不同的站点上重复使用相同的密码。像 1Password 或 LastPass 这样的密码管理器可以帮助解决此问题。
- 软件包维护者应启用 npm 双因素身份验证。npm 有一个 指南。
- 如果您使用 Lerna,则可以关注此 问题。
- 软件包维护者应审核并限制有权在 npm 上发布的人员数量。
- 软件包维护者应谨慎使用任何自动合并依赖项升级的服务。
- 应用程序开发人员应使用锁定文件(
package-lock.json
或yarn.lock
)来防止自动安装新软件包。
时间线
- 事件发生前:攻击者大概在第三方泄露事件中找到了维护者重复使用的电子邮件和密码,并使用它们登录了维护者的 npm 帐户。
- 2018 年 7 月 12 日凌晨:攻击者在维护者的 npm 帐户中生成了一个身份验证令牌。
- 2018-07-12 9:49 UTC:攻击者使用生成的身份验证令牌发布了
eslint-config-eslint@5.0.2
,其中包含一个恶意的postinstall
脚本,该脚本尝试盗取本地计算机的.npmrc
身份验证令牌。 - 2018-07-12 10:25 UTC:攻击者取消发布了
eslint-config-eslint@5.0.2
。 - 2018-07-12 10:40 UTC:攻击者发布了
eslint-scope@3.7.2
,其中包含相同的恶意postinstall
脚本。 - 2018-07-12 11:17 UTC:一位用户发布了 eslint/eslint-scope#39,通知 ESLint 团队该问题。
- 2018-07-12 12:27 UTC:包含恶意代码的 pastebin.com 链接被删除。
- 2018-07-12 12:37 UTC:在收到 ESLint 维护者的联系后,npm 团队取消发布了
eslint-scope@3.7.2
。 - 2018-07-12 17:41 UTC:ESLint 团队发布了
eslint-scope@3.7.3
,其中包含来自eslint-scope@3.7.1
的代码,以便缓存可以获取新版本。 - 2018-07-12 18:42 UTC:npm 撤销了 2018-07-12 12:30 UTC 之前生成的所有访问令牌。