介绍
近几个月来,对开源存储库的主要威胁就包括存储仓库劫持,通常称为RepoJacking。RepoJacking 是指恶意攻击者通过一定手段接管托管存储库的所有权或维护者的账户。通过获取对账户的访问权限,攻击者可以将恶意代码注入到使用对应仓库作为依赖项的项目中。
RepoJacking 如何攻击?
存储库攻击,也称为供应链攻击,通常利用 GitHub 等托管平台中的漏洞。RepoJacking 中常用有两种方法:
- 名称更改:当用户在托管平台上更改其用户名时,攻击者可能会使用原始用户名注册,这样攻击者就可以创建同名仓库,而依赖这个项目的软件包仍可能通过访问原始存储库 URL 进行更新。
- 账户删除:与上述方法类似,恶意行为者可以重新注册已删除的账户并重新创建原始存储库。对于尝试通过 URL 获取存储库的项目,这可能会导致读取错误,因为链接会中断。但是,攻击者可以通过在删除账户和项目刷新的这段期间内快速注册已删除的同名账户来获取仓库权限。
一旦攻击者获得了对存储库的控制权,他们就可以执行各种特权操作。这包括指定其他恶意用户或自行创建的账户为管理员或维护者,使他们能够批准未经授权的代码更改。它们可以强制在新的项目版本中包含恶意或不需要的代码,甚至从存储库中删除功能代码,从而导致现有功能遭到破坏或损坏。
repojacking的安全影响是什么?
成功的存储库劫持攻击可能会对安全造成严重影响,尤其是对于充当依赖项的受影响软件包的用户而言。这些攻击允许通过现有或新发布的版本上传不受限制的恶意代码,这些代码可以通过自动或手动升级到最新版本直接影响外部项目。
repojacking通常会在很长一段时间内被忽视,有时持续数天或数周。它们通常由专门的安全研究人员、细心的用户或意识到其存储库已被劫持的原始所有者披露。解决问题的责任通常在于托管平台,托管平台可以通过删除或暂停受感染的账户来采取措施来减轻恶意包版本的影响。
虽然这些攻击似乎很容易被利用,但它们取决于特定条件,这在受欢迎的项目所有者的账户中并不常见,尤其是那些经常收到更新的项目所有者。对于比较活跃的账户所有者,攻击者通常使用网络钓鱼或更复杂的“捕鲸”技术,以访问其账户或通过跨站点脚本攻击操纵他们执行操作。但是,许多浏览器和网站都有针对此类攻击的内置保护措施。
RepoJacking 事件的真实例子:
- CTX 劫持:2022 年 10 月,Python 包 CTX 在 PyPI 上遭遇存储库劫持。所有者账户的原始域名托管电子邮件已过期,允许第三方重置密码并重新注册域名。攻击者迅速上传恶意包,替换原始版本。劫持事件在10 天内未被发现,在此期间发生了超过27000次恶意 CTX 版本的下载。包中添加的代码将敏感用户信息泄露到外部端点。PyPI 管理员暂停了被劫持的账户并删除了所有版本的 CTX。
- PhPass:PHP 包 PhPass 在 2022 年 5 月以类似的方式被利用。所有者的账户已删除,然后被以相同的名称重新注册来访问原始存储库。攻击者将原始包版本替换为包含提取环境变量的代码的恶意版本。作为解决方案,创建了一个分支存储库来托管非恶意版本,并将原始下载 URL 重定向到新的分支。
- UAParser.js:2021 年10月,当作者的 NPM 账户被接管时,流行的 JavaScript 库 UAParser.js 被武器化。攻击者发布了该库的三个恶意版本,导致了大规模攻击,因为它在各个项目中被广泛使用。这些版本中的恶意代码从远程服务器下载并执行二进制文件,包括加密货币挖掘软件和从 Windows 系统泄露敏感信息的木马。受感染的版本很快被删除,并发布了新版本以减轻恶意版本的影响。
结论
可以实施多种措施来保护组织免受 RepoJacking 和其他供应链攻击。一种关键方法是使用多因素身份验证,特别是双因素身份验证(2FA)。GitHub 宣布,从 2023年开始,所有维护者账户都必须强制使用 2FA,从而显著提高其安全性。然而,尽管存在风险,但像 NPM 这样的一些平台尚未强制执行 2FA。还可以通过主动暂停或删除具有过期或即将过期域的账户来防止域接管。但是,这种方法需要托管平台增加维护和监控。
随着开源项目的不断发展,并且越来越成为很多项目的依赖,repojacking事件可能会不断增加。为了解决这个问题,有必要更多地采用2FA等预防技术。强制执行 2FA 等安全措施可以通过确保存储库所有者的更高级别的账户安全性来帮助减轻存储库劫持的影响。