微软和北卡罗来纳州立大学去年合作开展了一个学术研究项目,研究人员通过分析上传到 Node Package Manager (npm) 的大约 163 万个库的元数据,发现数千名 JavaScript 开发者正在使用域名过期的邮箱作为其 npm 帐户,从而导致他们托管在 npm 的项目会轻易被劫持。
据称,npm 上所有用户的邮件地址都是公开的。通过请求个人资料页面即可返回邮件地址:

npm 是最大的 JavaScript 软件包仓库。研究人员发现 2818 名项目维护者的帐户仍在使用域名过期的邮箱地址,而部分过期的域名正在 GoDaddy 等网站上出售。因此研究人员认为,攻击者可通过购买已过期的域名,然后在邮件服务器上重新注册这些维护者的地址,从而实现重置维护者的帐户密码并接管 npm 软件包。
下面的图片展示了一名开发者尝试接管ajv-formats
软件包(维护者是additiveamateur
)并成功“劫持”的过程:
0. 首先是获取帐户的注册邮件地址:carlo[@]machina.bio
1. 购买已过期的域名:machina.bio

2. 通过域名接管了帐户的邮件地址后,尝试重置密码:

此步骤遭遇了一些问题,但开发者通过联系技术支持得到解决:


最后成功重置了ajv-formats
软件包维护者的帐户密码:


登录并成功接管项目:


研究人员表示,他们在研究报告发布前将其研究结果发送给了 npm 安全团队,虽然对方没有反馈,但在研究报告正式发布前,npm 宣布了逐步为开发者帐户强制执行 2FA(双因素认证)的计划。