RepoJacking(仓库劫持)是指攻击者通过获取对原始仓库的控制权来替换或篡改代码库的行为。这种攻击通常发生在代码托管平台(如GitHub)上。
对于GitHub仓库进行RepoJacking攻击,大致流程如下:
- 现有仓库的安装脚本install.sh文件指向的是旧仓库。
- 自述文件README.md或构建文件指向的是旧仓库。
- 发布的下载链接指向的是旧仓库。
1. 通过ghtorrent.org网站可以访问GitHub上用户名和组织名的历史记录。数据集在http://ghtorrent-downloads.ewi.tudelft.nl/mysql中
2. 通过托管在Google Cloud Platform(GCP)上的BigQuery数据集。其中有GitHub的所有开源内容。
许多软件包管理器允许开发者通过维护者的登录名和项目名称来标识软件包,例如:Microsoft/TypeScript或swagger-api/swagger-codegen。这是一种描述依赖关系的高效方式,但有时维护者会删除或重命名他们的帐户,使得其他开发者可以有意或无意地创建具有相同名称的项目。
为了防止开发者下载潜在不安全的软件包,GitHub现在会停用在拥有者的帐户重命名或删除之前一周内克隆次数超过100次的任何开源项目的命名空间。开发者仍然可以使用被重命名或删除的帐户的登录名进行注册,但他们将无法创建与被停用命名空间相同的仓库名称。
尽管GitHub近年来一直尝试阻止RepoJacking,但是这些保护仍然会存在一些问题,如上述第三节,GitHub对一周内克隆超过100次的命名空间进行了保护,使得已删除用户能被重建,却无法创建与被停用的仓库名称相同的仓库。该保护通过创建仓库后,再更名为所想劫持的原用户名即可绕过。如想要劫持的仓库命名空间为user_A/repo_A,此时我们随意创建一个用户user_B/repo_A,随后改名为user_A即可绕过保护。
故而,对于RepoJacking攻击的防范不能完全依靠代码托管平台的防护,开源项目的开发者以及其使用者同样需要对RepoJacking攻击进行防范。对于开源项目的开发者来说,建议定期检查仓库是否从外部GitHub仓库获取资源,并且使用专用的包管理器(npm,pip,maven等)来管理依赖,当然这些依赖同样可能通过GitHub仓库获取资源,因此并非绝对安全。同时发布时锁定版本并计算哈希,这样就算依赖的组件被劫持,哈希的更改也会导致安装的失败。对于使用这些开源项目的使用者,应检查其安装文件中或自身克隆下来的仓库是否被劫持,并使用终端安全工具对下载的资源进行检查。
安全工程师:hu1y40
2023 年 6 月 30 日
作者:洞源实验室