近日发现的一个新漏洞让攻击者可以利用GitHub的代码库创建和用户名重命名操作中的竞态条件。该技术可用于执行代码库劫持攻击(劫持流行的代码库以分发恶意代码)。这一发现标志着已第四次发现了一种独特的方法,有可能绕过GitHub的“流行代码库命名空间退役”机制。这个漏洞已报告给了GitHub,已得到修复。
• 发现了一个新颖的漏洞,利用在GitHub上创建代码库和重命名用户名的进程之间的竞态条件。
• 成功利用该漏洞可以劫持Go、PHP和Swift等语言的4000多个代码包,以及劫持GitHub操作,从而影响开源社区。值得注意的是,数百个这样的代码包已获得了1000多颗星,数百万用户和无数应用程序可能因此受到影响。
• 该漏洞已被负责任地披露给GitHub,GitHub随后发布了补丁。
代码库劫持是一种攻击者通过利用逻辑漏洞控制GitHub代码库的技术,该漏洞可使重命名的用户容易受到攻击。
攻击者劫持GitHub上一个合法的、常常很流行的命名空间。命名空间是用户名和代码库名称的组合,比如:example-user/example-repo。
当使用GitHub的“用户重命名”功能更改原始用户名时,命名空间可能容易受到代码库劫持的攻击。
用户名更改过程快速又简单。一则警告让你知道旧代码库URL的所有流量将被重定向到新代码库。
在关于这项功能的文档中,GitHub提到了重要的影响:
“更改用户名之后,其他任何人都可以声称拥有你的旧用户名。”
一旦用户名被重命名,攻击者可以声明旧的用户名,在匹配的代码库名称下打开代码库,并劫持命名空间。
为了缓解这种潜在的有害行为,GitHub实施了“流行代码库命名空间退役”保护措施:任何在用户帐户重命名时克隆超过100次的代码库都被视为“退役”,无法被其他人使用。
澄清一下:被认为“退役”的是命名空间,意指用户名和代码库名称这个组合。
比如说,不妨以用户名“account-takeover-victim”的名为“repo”的代码库为例。
这个代码库最近被克隆了100次,因此它符合流行代码库命名空间退役的条件。
此时,帐户的所有者决定将用户名重命名为他所选择的名称。
这么做的实际结果是,用户名“account-takeover-victim”现在可以被任何人声称拥有。
然而,一旦这个用户名的新所有者试图打开一个名为“repo”的新代码库,他们将被阻止,并得到以下消息:
这样一来,任何人都可以声称拥有旧用户名,但是一旦这个新用户名所有者试图用“退役”的名称创建新的代码库,GitHub会阻止这种尝试。
成功利用漏洞使攻击者可以接管几个包管理器中的流行代码包,包括“Packagist”、“Go”和“Swift”等。我们已经在这些包管理器中发现了超过4000个使用重命名用户名的包,如果发现新的绕过技术,它们可能受到这种技术的攻击。在这些面临险境的代码包中,数百个已在GitHub上获得了1000多颗星。
此外,利用这种绕过机制还可能导致流行的GitHub操作被接管,这些操作也可以通过指定GitHub命名空间来使用。对流行的GitHub操作投毒可能会导致重大的供应链攻击,会带来重大影响。
Aqua最近的研究表明,像谷歌和Lyft这样的大企业都很容易受到这种形式的攻击。这凸显了该漏洞的严重性,因为它可能会影响到科技行业的一些大公司,这些公司在接到漏洞通知后迅速降低了风险。
新的利用方法利用了代码库创建和用户名重命名之间潜在的竞态条件。Checkmarx SCS部门架构师Elad Rapoport能够演示通过几乎同时创建代码库和更改用户名,如何能绕过GitHub检查。
重现这个漏洞的步骤如下:
1. 受害者拥有命名空间“victim_user/repo”。
2. 受害者将“victim_user”重命名为“renamed_user”。
3. “victim_user/repo”代码库现在已经退役。
4. 拥有用户名“attacker_user”的攻击者准备了一个命令,该命令创建一个名为“repo”的代码库,并几乎同时将用户名“attacker_user”重命名为受害者的用户名“victim_user”。这是使用创建代码库的API请求和拦截用户名更改的重命名请求来完成的。
使用pseudo-exploitation命令的示例
这一发现标志着已第四次发现执行代码库劫持的替代方法。Checkmarx在2022年两次发现并报告了绕过“流行代码库命名空间退役”机制的活动,GitHub在这两次都修复了漏洞。
外部研究人员Joren Vrancken在2022年发现了绕过该机制的第三个漏洞,GitHub也解决并修复了这个漏洞。
我们建议避免使用退役的命名空间以尽量减小攻击面,并确保代码中没有导致GitHub代码库容易受到代码库劫持攻击的依赖项。
此外,考虑使用ChainJacking(https://github.com/Checkmarx/chainjacking),这是一个由Checkmarx开发的开源项目,旨在帮助你了解是否有任何Golang直接GitHub依赖项容易受到代码库劫持攻击。
2023年3月1日——Checkmarx发现了一个绕过GitHub命名空间退役功能的额外漏洞,并向GitHub披露了它。
2023年9月1日——GitHub回复,它已修复了这个漏洞。
在GitHub的代码库创建和用户名重命名操作中发现这个新漏洞突显了与“流行代码库命名空间退役”机制相关的持续风险。
许多GitHub用户(包括控制流行代码库和包的用户)选择使用GitHub提供的“用户重命名”功能。出于这个原因,试图绕过“流行代码库命名空间退役”对于供应链攻击者来说仍然是一个颇有吸引力的攻击点,有可能造成重大破坏。
此外,值得注意的是,GitHub提供的保护是基于内部指标激活的,并且根本没有向用户表明某个特定的命名空间是否受其保护。这可能会使一些代码库和包在不知情的情况下处于险境。
我们建议避免使用退役的命名空间,并考虑使用我们的ChainJacking开源项目来识别易受攻击的包。
我们的团队继续努力识别这些漏洞,以确保开源社区的安全。该漏洞已报告给了GitHub。
参考及来源:
https://checkmarx.com/blog/persistent-threat-new-exploit-puts-thousands-of-github-repositories-and-millions-of-users-at-risk/