开源安全 | 探究Starjacking(星标劫持)现象

文摘   2024-12-11 00:07   广东  

前言

随着开源包数量的持续增长,开发者在挑选既满足需求又安全可靠的包时面临着日益严峻的挑战。为协助开发者做出明智选择,包仓库引入了多种评估指标,如下载量、GitHub统计数据及用户评分等。尽管如此,流行度依然是影响包选择的关键因素之一,流行的包往往被视为维护得当且值得信赖,这一普遍认知在两年前催生了“Starjacking(星标劫持)”现象。


星标劫持是一种利用包与其GitHub代码库之间缺乏验证的漏洞,让开源包看起来受欢迎的手段。该技术在曝光后,人们发现,像npm和Yarn这样的多个主流软件包仓库,也允许发布包含非发布者所拥有的GitHub仓库链接的软件包。


近期,我们对超过20个包仓库进行了深入研究,以评估当前星标劫持的现状。研究结果显示,在安全防护方面已出现了积极的进展。


软件包仓库研究

我们的研究涵盖了广泛的包存储库,总计21个独立存储库。既包括npm、maven和PyPI等大型且知名的存储库,也涵盖了如CPAN、LuaRocks和Hackage这样的小型但同样重要的存储库。为了更清晰地展示研究范围,下表详细列出了每个被研究的存储库及其主要支持的编程语言:


表1.软件包仓库


根据构件管理方法的不同,这些存储库被划分为两大类别:


● 工件存储库:这类存储库保存了在构建、编译或打包代码过程中生成的工件。这些工件是软件开发过程中的重要产物,用于确保软件的可构建性和可运行性。


● 引用存储库:与工件存储库不同,这类存储库仅提供指向包含包安装所需必要文件的GitHub仓库的引用。像pkg.go.dev和RubyGems这样的包管理器就属于这一类别。由于它们直接从GitHub仓库显示数据,因此天生具备防止星标劫持的保护机制。这种直接集成的方式有效消除了从一个仓库链接而提供来自另一个仓库代码的可能性,从而增强了安全性。


图1.仅引用GitHub仓库的包管理器示例


尽管这类包仓库在防止星标劫持方面具有一定的天然优势,但显示的GitHub统计数据仍可能带来误导。通过更复杂的技术,这些数据是可以被操纵的。


举例来说,如果攻击者成功地伪造了统计数据,那么Swift Package Index和Packagist等平台所展示的全面GitHub仓库详细信息,就有可能误导用户,使其难以分辨真伪。 


图2.Packagist

图3.Swift Package Index


结果

大多数包仓库并不会显示所引用GitHub仓库的统计信息。尽管PyPI和Yarn等平台在过去曾提供过这类信息,但随后它们调整了策略:Yarn决定完全移除这些统计信息,而PyPI则引入了一个更为复杂的元数据显示系统,以替代原有的简单展示方式。


然而,仍有一些包仓库在继续显示GitHub统计信息。例如,npm就仍然会在其包元数据中展示所指定GitHub仓库中的问题和拉取请求数量。这些信息的展示,虽然可能为开发者提供一定的参考价值,但也需要谨慎对待,因为统计数据的真实性和准确性可能受到多种因素的影响。


图4.npm显示数据一览


此外,CPAN Perl包存储库也展示GitHub统计信息。


图5.CPAN包存储库显示信息一览


PyPI的GitHub统计显示转换历程

PyPI在增强包元数据验证的道路上采取了稳健而逐步的策略。


早期,它未设立任何验证机制,便直接显示了GitHub仓库的统计信息,这种做法使得平台极易成为星标劫持攻击的目标,因为任何包都能随意宣称与任意GitHub仓库存在关联。


为了应对这一风险,PyPI迈出了关键的第一步——将包信息明确划分为未验证信息与验证信息两大类。


这一改变虽然在一定程度上帮助用户辨别信息的可信度,但遗憾的是,未验证信息区域依然展示着任意GitHub仓库的统计信息,这对于大多数用户而言,依然难以有效区分信息的真伪。


然而,PyPI通过引入基于受信任发布者管理功能的综合验证系统,取得了关键进展。自2024年8月起,PyPI确保了GitHub统计信息仅出现在验证信息区域,并且这些信息仅针对通过受信任发布者管理功能上传的包进行展示。该系统利用了OpenID Connect技术,通过与GitHub Actions等受信任服务的集成,实现了安全、可靠的发布流程。


在新的发布机制下,PyPI项目维护者只需在其GitHub仓库中设定一个用于自动发布包的工作流。一旦触发,该工作流将与PyPI进行身份验证,从而证实代码确实来自预期的来源。只有在成功验证后,包才会被正式发布。这一新系统严格规定,只有当链接指向已经通过受信任发布工作流验证的代码仓库时,PyPI才会显示相应的GitHub仓库统计信息。


回顾PyPI针对星标劫持所采取的安全措施,其发展历程可以清晰地划分为三个阶段:


1. 初始阶段:GitHub统计信息被无差别地展示,缺乏任何验证或真实性标识。


2. 第二阶段:将验证信息和未验证信息分开,将GitHub统计信息特别放置在未验证信息部分。


3. 当前阶段:GitHub统计信息现在仅显示在验证信息部分,并且仅显示通过受信任发布者管理功能上传的包。


这一系列的进步不仅体现了PyPI在维护平台安全性方面的坚定决心,同时也体现了其致力于为用户提供准确、可靠的仓库信息的承诺。


图6.PyPI提供验证信息承


结论

尽管npm和CPAN等仓库平台至今仍在显示未经验证的GitHub统计信息,但在过去两年里,星标劫持的风险已经显著下降。这一积极变化主要归因于两个方面的努力:一方面,许多仓库采取了更为谨慎的做法,要么完全移除了GitHub统计信息的显示,要么仿效PyPI,实施了更为强大的验证系统。


另一方面,我们也观察到,尽管除PyPI外,多数仓库依然显示未经验证的包元数据链接,但这些链接本身已不再像过去那样容易被恶意利用。恶意行为者虽然仍可能尝试利用这些未验证的链接进行不当操作,但与原始的星标劫持技术相比,其误导用户、损害平台信誉的风险已经大大降低。这在一定程度上反映了整个软件生态对于安全问题的日益重视,以及用户在选择和使用软件包时日益增强的警觉性。


文章来源:https://checkmarx.com/blog/falling-stars/,本文由网安加社区编译。



专家群聊

扫码添加安仔微信,邀请进群

与行业专家深入交流探讨~

· 往期推荐 ·
1. 2024年软件供应链安全挑战迈入新阶段!
2. 卡巴斯基:2025年高级持续性威胁(APT)趋势预测

网安加社区
网安加社区,网络安全技术爱好者交流与分享技术的社区,致力于安全赋能软件开发。通过组织线下沙龙、峰会,促进行业交流,赋能行业交付可信、客户满意的软件产品。我们诚邀有分享精神的专家积极加入,共同传播安全技术与理念,推动数字化社区的可信发展。
 最新文章