PyPitfall: Dependency Chaos and Software Supply Chain Vulnerabilities in Python

本文介绍了 PyPitfall 研究,通过对 378,573 个 PyPI 包的依赖结构进行量化分析,揭示了 Python 软件供应链中广泛存在且易被忽视的漏洞依赖问题,旨在提升业界对 Python 供应链安全的关注。

Jacob Mahon, Chenxi Hou, Zhihao Yao

发布于 2026-03-11
📖 1 分钟阅读☕ 轻松阅读

Each language version is independently generated for its own context, not a direct translation.

这篇论文讲述了一个关于 Python 软件世界里的“隐形地雷”的故事。为了让你更容易理解,我们可以把整个 Python 软件生态系统想象成一个巨大的、由无数乐高积木搭建的城堡

🏰 核心故事:乐高城堡的“连锁反应”

想象一下,你是一位建筑师(程序员),你想建一座宏伟的城堡(你的软件应用)。为了省力,你不想自己从零开始烧制每一块砖,而是直接去市场上购买别人造好的“预制积木”(第三方软件包)。

  • PyPI(Python 包索引):就是那个巨大的乐高积木市场,里面有超过 60 万个不同的积木包。
  • 依赖关系(Dependencies):当你买了一个“窗户”积木,它可能自带了“螺丝”和“胶水”;而那个“螺丝”积木可能又需要特定的“金属片”。这就是依赖
  • 传递依赖(Transitive Dependencies):最麻烦的是,你买的“窗户”里的“螺丝”又需要“金属片”,而“金属片”又需要“胶水”……这种层层嵌套的关系,就像是一个俄罗斯套娃,或者一条长长的多米诺骨牌链

💣 问题所在:带毒的积木

这篇论文(PyPitfall)的研究人员发现了一个严重的问题:

在这个巨大的乐高世界里,很多“预制积木”本身是有缺陷的(存在安全漏洞)。

  1. 直接带毒:有些建筑师(开发者)直接买了一个已知有缺陷的“窗户”积木,并且必须用它才能盖房子。
  2. 间接带毒:更多的建筑师买了看似完美的“窗户”,但这个窗户里藏着一个有缺陷的“螺丝”。只要这个“螺丝”被安装进去,整个城堡的某个角落就埋下了定时炸弹。

最可怕的是:因为积木太多、关系太复杂,建筑师们往往根本不知道自己买的那块“窗户”里,其实藏着一个来自 10 层楼深的“金属片”的缺陷。

🔍 研究人员做了什么?(PyPitfall 工具)

为了搞清楚这个“地雷阵”有多危险,研究人员开发了一个叫 PyPitfall 的“超级扫描仪”。他们做了以下几件事:

  1. 清点积木:他们扫描了 PyPI 市场上 378,573 个正在使用的积木包。
  2. 追踪链条:他们不仅看直接买的积木,还顺着链条一直挖下去,看看每一层嵌套里有没有坏掉的零件。
  3. 对比黑名单:他们手里有一份“已知缺陷积木清单”(CVE 漏洞库),把市场上的积木和清单进行比对。

📊 发现了什么惊人的真相?

扫描结果让人倒吸一口凉气:

  • 直接踩雷:有 4,655 个积木包,明确地、强制地要求使用已知有缺陷的版本。这就好比你必须用一颗生锈的螺丝才能把墙砌好,如果不换,墙就塌了(或者被黑客攻破)。
  • 潜在风险:有 141,044 个积木包,虽然没强制用坏螺丝,但它们允许使用坏螺丝。只要安装程序(pip)在自动匹配时不小心配到了坏的那一款,你的城堡就危险了。
  • 深度惊人:很多漏洞藏在非常深的地方。平均来说,漏洞藏在第 4 到 6 层嵌套里。有些积木包的依赖链条甚至长达 23 层!这意味着你买的积木,可能依赖着一个你从未听说过的、远在 23 层楼下的“小零件”,而那个小零件坏了。

🧩 一个具体的例子:urllib3

论文里举了一个叫 urllib3 的积木包。它就像乐高城堡里的“通用连接器”,很多著名的积木(比如 requests)都依赖它。

  • 研究发现,urllib3 有 5 个已知的严重漏洞。
  • 结果导致 4,655 个顶级积木包中,有 1,926必须使用带毒版本,还有 10 万多个 可能用到带毒版本。
  • 这就好比,因为“通用连接器”有个小裂缝,导致整个城市里成千上万栋大楼的承重墙都变得不安全。

🛡️ 为什么这很重要?(结论)

这篇论文想告诉大家:

  1. 便利的代价:使用现成的代码(乐高积木)虽然让开发变得飞快,但也让我们把安全控制权交给了别人。
  2. 看不见的风险:很多开发者只关注自己写的代码,却忽略了那些层层嵌套的“亲戚”(依赖包)可能已经“黑化”了。
  3. 需要警惕:就像盖房子不能只看表面,软件安全也需要检查每一层“套娃”。如果最底层的那个“小零件”坏了,整个软件供应链(Supply Chain)都会崩塌。

一句话总结
这篇论文就像给 Python 软件世界做了一次全身体检,发现虽然大家建房子很快,但地基里埋着成千上万个“定时炸弹”。如果不把依赖关系理清楚,再漂亮的软件城堡也可能因为一颗小小的“坏螺丝”而瞬间瓦解。