自从我开始学习编程以来,我一直感到好奇的是,我们居然对我们放在命令行工具中这样一个简单命令如此信任:
某些编程语言(例如 Python)带有一种简单的或多或少正式的方法来为项目安装依赖项。 这些安装程序通常与公共代码存储库绑定,并且任何人都可以自由上传代码包供他人使用。
您可能已经听说过这些工具 ——Node 具有 npm 和 npm 注册表,Python 的 pip 使用 PyPI(Python 包索引),并且 Ruby’s Gems 可以在 RubyGems 上找到。
从这些来源中的任何一个下载和使用软件包时,您实际上是在相信其发布者在您的计算机上运行代码。 那么这种盲目的信任会被恶意行为者利用吗?
当然可以。
任何程序包托管服务都无法保证其用户上传的所有代码均不含恶意软件。 过去的研究表明,域名抢注(利用流行包名称的错字版本进行的攻击)在访问全球随机 PC 方面非常有效。
其他众所周知的依赖项链攻击路径包括使用各种方法来破坏现有软件包,或以不再存在的依赖项名称上传恶意代码。
想法
在 2020 年夏季,Justin Gardner(@Rhynorater)和我一起尝试入侵 PayPal 时,他分享了在 GitHub 上发现的一些有趣的 Node.js 源代码。
该代码旨在供内部 PayPal 使用,并且在其 package.json 文件中似乎包含公共和私有依赖项的混合 —— 来自 npm 的公共程序包以及非公共程序包名称,很可能由 PayPal 内部托管。 这些名称当时在公共 npm 注册表中不存在。
由于逻辑上不清楚哪个包将从何处获得,出现了一些问题:
- 如果以这些名称将恶意代码上传到 npm 会发生什么? PayPal 的一些内部项目是否有可能开始默认为新的公共软件包而不是私有软件包?
- 开发人员、自动化系统会开始在库中运行代码吗?
- 如果这行