安全研究人员发现了一种 npm 定时攻击,该攻击揭示了私有包的名称,因此威胁者可以公开发布恶意克隆,以诱使开发人员改为使用它们。
与存储库中不存在的包相比,在搜索私有包时,该攻击依赖于返回“404 Not Found”错误的微小时间差。
虽然响应时间差只有几百毫秒,但足以判断是否存在私有包进行包冒充攻击。
组织为内部项目和某些软件产品创建私有包,以最大程度地降低其开发团队 遭受仿冒攻击的风险,并对其代码和功能保密。
保持私有包 的私密 性对于使用它们的组织至关重要 。否则,攻击者可以创建克隆或仿冒软件包,黑客可能会诱使组织员工下载并在软件项目中使用。
如果开发人员和内部软件测试人员没有发现妥协,产品可能会到达最终用户,从而实现 供应链妥协。
Aqua Security 威胁研究团队在发布前与 BleepingComputer 分享了其调查结果的报告中,攻击者越来越关注供应链攻击,从而推动 2021 年相关活动增加了 300%。
定时攻击细节
npm 包含一个 注册表 API ,允许用户下载现有包、检查包是否存在以及接收有关特定范围内所有包的信息。
使用npm注册中心下载不存在或设置为private的包时,网站会返回404 HTTP错误码,表示找不到包。

Aqua Security 通过使用此 API 检查他们在 npm 上创建的私有包是否存在,并将 404 HTTP 错误的响应时间与 API 检查不存在的包进行比较,从而发现了 npm 定时攻击。
研究人员通过五次检查包名称的存在来进行测试。他们发现 npm 响应请求所需的平均时间存在显着差异,这使他们能够辨别包是私有的还是不存在的。
更具体地说,私有包存在时的平均响应时间为 648 毫秒,而私有包不存在时的平均响应时间下降到仅 101 毫秒。

研究人员认为这是由于 npm 的 API 的缓存机制和架构,它引入了这种信息披露的潜力。
黑客可以尝试“盲目”字典攻击或在目标组织的公共包中查找命名模式和组合,以获取可能的私有包名称。
此外,在线信息包含历史包信息,因此攻击者可以使用它们来确定哪些公共包可能已被私有化。
在后一种情况下,对克隆包的潜在妥协可能非常隐蔽,因为曾经公开的包的旧副本可能仍保留足够的功能,以便在使用它的软件产品中按预期工作。
GitHub 不会解决这个问题
Aqua Security 于 2022 年 3 月 8 日向 GitHub 披露了该漏洞,但在 3 月 25 日被告知,由于架构限制,该漏洞无法修复。
“由于这些架构限制,我们无法阻止定时攻击确定 npm 上是否存在特定的私有包,”GitHub 告诉 Aqua Security。
研究人员表示,组织可以通过经常在 npm 中搜索可疑包来采取预防措施,这些包会以重复或相似的名称欺骗他们的私有包。
此外,组织可以创建公共包来欺骗他们的私有包作为占位符,因为 npm 不允许在公共存储库上上传同名包。