npm:威胁和缓解措施

我们创建了此页面,概述 npm 面临的最常见攻击,如何缓解这些攻击的高级描述以及指向更多信息的链接。

帐户接管

通过泄露密码

这是最常见的攻击,不仅针对 npm,而且针对任何 Web 服务。保护您帐户的最佳方法是启用双因素身份验证(2FA)。最强大的选择是使用安全密钥,无论是内置在您的设备中还是外部硬件密钥;它将身份验证绑定到您正在访问的网站,从而使网络钓鱼极其困难。但是,并非每个人都可以使用安全密钥,因此我们还支持生成一次性密码以进行 2FA 的身份验证应用程序。

由于这种攻击非常普遍,并且 npm 包对更广泛的软件生态系统至关重要,因此我们在强制执行 npm 包维护者的 2FA 时采用了分阶段的方法。这已经推广到前 100 个包维护者前 500 个包维护者,在不久的将来,所有高影响力包(每周下载量超过 100 万次或有 500 个以上依赖项的包)的维护者都将被纳入强制性 2FA。

我们还认识到,密码不会很快消失。对于没有选择加入 2FA 的用户,我们通过发送到其电子邮件的一次性密码进行增强登录验证,以防止帐户被接管。

通过注册过期电子邮件域名

另一种接管帐户的方法是通过识别使用过期域作为其电子邮件地址的帐户。攻击者可以注册过期域名并重新创建用于注册帐户的电子邮件地址。通过访问帐户的注册电子邮件地址,攻击者可以接管未受 2FA 保护的帐户,方法是通过密码重置。

发布包时,帐户关联的电子邮件地址(**在发布包时**)会包含在公共元数据中。攻击者可以利用这些公共数据来识别可能容易受到帐户接管的帐户。重要的是要注意,**存储在包的公共元数据中的电子邮件地址不会在维护者更新其电子邮件地址时更新**。因此,抓取公共元数据以识别容易受到过期域名接管的帐户会导致误报,即看起来容易受到攻击但实际上并非如此的帐户。

npm 定期检查帐户电子邮件地址是否有过期域名或无效 MX 记录。如果域名已过期,我们将禁用帐户进行密码重置,并要求用户进行帐户恢复或完成成功身份验证流程,然后才能重置其密码。

上传恶意包

通过“错字欺骗”/依赖关系混淆

攻击者可能会尝试通过注册与热门包名称相似的包来欺骗他人安装恶意包,希望人们会输错或以其他方式混淆两者。npm 能够检测到错字欺骗攻击并阻止发布这些包。

这种攻击的一种变体是,当一个公共包以组织正在使用的私有包的相同名称注册时。我们强烈建议使用作用域包,以确保私有包不会被来自公共注册表中的包替换。虽然 npm 无法检测到依赖关系混淆攻击,但我们对注册表中的恶意包采取零容忍态度。如果您认为您已识别出依赖关系混淆包,请告诉我们

通过更改现有包以具有恶意行为

攻击者除了诱骗人们使用类似名称的包之外,还会尝试在现有的热门包中添加恶意行为。npm 与微软合作,扫描包以查找已知的恶意内容,并运行这些包以查找可能存在恶意的行为的新模式。这导致 npm 包中恶意内容大幅减少。此外,我们的信任与安全团队会检查并删除用户报告的恶意内容。与依赖关系混淆攻击类似,我们不断使用新示例更新我们的检测服务,因此,如果您认为某个包包含恶意行为,请告诉我们