本月早些时候,Lupin & Holmes 的研究人员展示了 npm 注册表 结合 DoS(拒绝服务)攻击时 易受缓存投毒 的情况,揭示了对 npm 包的完整性和可用性的潜在风险。
缓存投毒拒绝服务(CPDoS)是一种针对禁用网络资源和网站的相对较新的 Web 缓存投毒攻击 类别。虽然传统的缓存投毒利用 Web 缓存系统中的漏洞来传递恶意内容,但 CPDoS 利用 DoS 不断中断服务并阻止合法访问。这些类型的漏洞 出人意料地普遍存在。
Lupin & Holmes 的研究人员正在测试研究模式下的多个子模块,以查看攻击者是否可以投毒页面,将 .tar.gz 文件的内容重定向到恶意内容,或完全拒绝该包:
攻击依赖于一系列不同的头部,这些头部被发现会触发后端系统的一个错误。通过发送包含这些头部的特别制作的请求,攻击者可以操纵注册表的缓存系统,为针对的包存储一个“未找到”的响应。
他们能够仅使用一台机器的资源成功地对生产中的一个包进行 CPDoS,该机器用于每隔几分钟发送一次请求,以维持在注册表的不同服务器上的投毒。
在最近一期关注供应链攻击和依赖混淆的 Critical Thinking 播客 中,研究人员描述了他们是如何偶然发现这个漏洞的,并对他们的脚本第一次尝试就工作感到惊讶:
缓存投毒对 npm 生态系统的影响
Lupin & Holmes 因为向 npm/GitHub 报告这个漏洞只收到了 500 美元,因为攻击依赖于一个已知有问题的头部,并且需要一个体积攻击,这被归类为滥用问题。
研究人员对 GitHub 的回应感到失望,并鼓励人们超越单个包不可用的不便,考虑这可能对依赖于被破坏包的项目和服务产生的连锁效应。如果这影响了像 Express 这样每周下载超过 3000 万次的流行打包器,它可能会导致构建失败、应用程序中断和广泛的中断。
npm 包不可用是否对供应链安全构成严重威胁?
如果一个广泛使用的包以这种方式被破坏,它将对 npm 生态系统构成巨大的不便。然而,研究并没有明确提到操纵包元数据或直接破坏 tarball 内容本身的能力。主要提出的关注点是使包不可用。
描述这种利用的帖子很有趣,但 Hacker News 上的回应是混合的,因为一些人不认为这是一个严重的问题:
我看不出标题建议的大安全影响,因为积极的大规模利用可能很快就会被注意到并被修复。我认为最有趣的攻击向量是小规模地阻止包的个别安全修复。
GitHub 无疑有资源迅速控制这样的攻击,但这并不减少保护 npmjs 这样全球使用规模的平台潜在 DoS 利用向量的重要性。有许多武器化的使用案例,用于目标干扰,超出了阻止特定用户的临界安全补丁。CPDoS 可以被利用在更复杂、复杂的攻击中,以在补丁不可用时掩盖恶意活动,导致运营停机、(CI/CD) 管道中断,并可能引发负面经济影响。
Socket 如何防范受损包
因为 Socket 下载您添加或更新的依赖项的实际代码,如果一个受损的包迫使您加载意外的资源,这将在它有机会对您的应用程序产生负面影响之前被检测到。
通过缓存投毒传递恶意 tarball 将需要更复杂的策略和/或利用其他漏洞。GitHub 可能有更多保护措施来防止缓存投毒,但很容易想象一个场景,CPDoS 可以被用来放大攻击,其中威胁行为者已经通过维护者的 CI/CD 管道意外泄露的秘密或 npmjs 凭据被破坏。
传递一个恶意 tarball,然后使用 CPDoS 阻止更新可能是灾难性的,对于这些每月下载数百万次的包来说。
这些是 Socket 会在一开始就保护您不添加恶意依赖到您的应用程序的严重情况。如果威胁行为者能够操纵包元数据或注入恶意代码,将由我们的威胁检测标记。
在任何包清单与其 tarball 内容不匹配的情况下,Socket 将默认将其标记为关键的 清单混淆 警报。自 2022 年 9 月以来,我们一直在保护用户免受清单混淆攻击。
在不太可能的情况下,如果威胁行为者能够对您的一个依赖项发起缓存投毒攻击,将 .tar.gz 文件的内容重定向到恶意内容,包锁文件(其中包含每个包的哈希值)将阻止这次攻击。锁文件中的哈希和从 npm 下载的文件的哈希不会匹配,npm CLI 将中止安装。
Socket 扫描实际的包,我们会自己下载被缓存投毒的包,并对任何恶意行为发出警报。重要的是在这些攻击发生之前就做好防护。谁会猜到 npm 注册表易受 CPDoS 攻击?还有更多尚未发现的错误和漏洞。
在最坏的情况下,Socket 为您提供保障。为了保护您的项目,您可以 免费安装 Socket 的 GitHub 应用。它只需 2-3 次点击即可安装,并且立即开始工作 - 无需配置。恶意包将在您安装它们或更新依赖项到新版本之前被标记。