如何防范仓库劫持

如何防范仓库劫持

💡 原文英文,约1800词,阅读约需7分钟。
📝

内容提要

“Repo-jacking”是一种供应链攻击,可能对开源软件产生影响。从软件包管理器获取软件依赖项可以避免直接受到repo-jacking的影响。直接从GitHub获取依赖项需要小心,可以通过锁定到特定的提交ID来解决。供应链攻击是严重问题,但通过repo-jacking实现大规模供应链攻击的机会很小。软件包管理器是最有可能的攻击向量,但除非具有维护者凭据,否则不允许使用repo-jacking上传恶意软件。

🔎

延伸解读

仓库劫持的实际风险与限制

仓库劫持攻击的成功实施需要满足特定条件:目标仓库的使用量低于GitHub的墓碑算法阈值,且攻击者能够注册到被释放的用户名。由于GitHub会对高使用量的仓库名称组合进行永久保留,大规模攻击的可能性很低。此外,攻击者通常需要获取维护者凭据才能通过包管理器上传恶意软件,这进一步限制了攻击的可行性。

包管理器与直接下载的风险差异

从包管理器(如npm、PyPI)获取依赖通常比直接从GitHub下载更安全,因为包管理器要求身份验证,且不会自动从GitHub拉取最新版本。然而,如果包管理器自动抓取GitHub发布(如Packagist曾有的行为),则可能放大仓库劫持风险。因此,开发者应优先使用包管理器,并注意其更新机制。

锁定提交ID与仓库ID检查

直接从GitHub引用依赖时,应锁定到具体的提交ID(SHA-1哈希),以降低代码被替换的风险。对于使用GitHub API的系统,可以通过检查仓库ID是否变化来检测仓库劫持,因为仓库ID在重命名后保持不变,而新仓库会有不同的ID。这种方法简单有效,适合集成到自动化流程中。

供应链安全的未来防护

OIDC构建来源和SLSA框架等新兴技术正在增强供应链安全。OIDC令牌包含仓库ID等信息,可防止仓库劫持,并已集成到npm、PyPI等平台。SLSA框架促进了跨组织合作,帮助提升软件工件的安全性。这些进展为防御供应链攻击提供了额外保障。

❓

Q&A

什么是 repo-jacking?

Repo-jacking 是一种供应链攻击,攻击者通过注册被重命名或释放的 GitHub 用户名,创建同名仓库来替换原始仓库,从而向依赖该仓库的开发者分发恶意软件。

如何防范 repo-jacking 攻击?

防范 repo-jacking 的主要方法包括:从软件包管理器获取依赖项;如果直接从 GitHub 下载,则锁定到特定的提交 ID;使用 GitHub API 检查仓库 ID 是否变化;利用 OIDC 构建来源和 SLSA 框架增强供应链安全。

GitHub 如何降低 repo-jacking 的风险?

GitHub 使用 tombstoning 算法,永久退休特定的所有者名称和仓库名称组合,防止攻击者重新创建同名仓库。此外,自动重定向和仓库 ID 检查也有助于检测和缓解风险。

直接从 GitHub 下载依赖时,如何避免 repo-jacking?

最简单的方法是引用特定的提交 ID(commit ID),因为提交 ID 是 SHA-1 哈希,攻击者难以伪造。对于 Go 语言,可以使用 go.sum 文件锁定依赖的加密哈希;对于 GitHub Actions,可以锁定 action 的提交 ID。

软件包管理器能防止 repo-jacking 吗?

是的,软件包管理器(如 npm、PyPI)通常提供额外防护,因为上传恶意包需要维护者凭据,仅靠 repo-jacking 无法直接上传。但若包管理器自动从 GitHub 拉取最新版本(如 Packagist 曾有的问题),则可能放大攻击风险。

如何检测一个 GitHub 仓库是否被 repo-jacking?

可以通过 GitHub API 检查仓库的唯一 ID 是否变化。如果仓库被替换,其 ID 会改变。此外,还可以检查仓库是否被重命名。示例代码使用 PyGithub 库获取仓库 ID 并与预期值比较。

🏷️

标签

➡️

继续阅读