News Hacker|极客洞察

330 12 天前 semgrep.dev
⚠️Shai-Hulud 恶意包通过 PyPI 入侵 Lightning AI 的 PyTorch Lightning
难道现在生产环境的依赖管理就是开盲盒吗?

🎯 讨论背景

这条讨论围绕 Lightning AI 的 PyTorch Lightning(一个开源训练库)被名为 Shai-Hulud(《Dune》里的沙虫名,被借来当作恶意活动代号)的恶意包污染展开。维护者澄清,问题不是 GitHub 主仓库被合并了恶意代码,而是 PyPI(Python 官方第三方包仓库)上的发布凭证泄露后,2.6.2 和 2.6.3 被直接投毒,建议暂时回退到 2.6.1。评论里还提到大量带有 Dune 词汇的新 GitHub 仓库和 “A Mini Shai-Hulud has Appeared” 字样,像是被盗 GitHub token/账号被用来批量泄露凭证或制造噪音。整场讨论因此延伸到 Python/ML 生态的依赖管理、uv(Astral 出的 Python 包/版本管理工具)、Nix(强调可复现构建的包管理系统)以及 LLM 辅助开发会不会放大供应链风险。

📌 讨论焦点

供应链攻击已成常态

不少评论认为这不是错觉,而是软件供应链攻击确实在快速增加。有人直接引用数据,称过去 12 个月发生的严重案例已经超过此前很多年的总和。讨论里反复出现的原因包括“先发布再修补”的文化、对依赖包几乎不审查,以及项目从业余代码变成下游关键依赖后,攻击收益被放大。另一些人指出,攻击者如今更常盯着云凭证和勒索收益,这让成功攻击的价值比十年前高得多。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9]

Python/ML 生态的脆弱性

评论把问题很大一部分归咎于 Python 和 ML 生态长期存在的安装即执行风险。`setup.py`、`pip install`、`requirements.txt` 这些老问题并没有随着时间自动消失,很多人仍然在生产环境里直接装源包。有人用自己维护 Python 包的经历说明,PyPA 的变动经常打断构建,而 wheel 和 RECORD 校验出错也常常没人发现。ML 生态还被批评得更“野”,历史上常用 Python pickle 这类可执行对象分发模型,本身就把安全边界做得很弱。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6]

减少依赖 vs 维护成本

有一部分人借机表达对“依赖海洋”的厌倦,转而追求更少依赖或直接 vendoring。有人说自己给孩子做交互教育项目时,已经尽量只用 plain JS 和 HTML,不再堆几百个包。也有人主张 Go 的 stdlib 足够强,或者用 Nix、Docker、单一 lockfile 把构建和版本锁住。反方则提醒,零依赖并不等于零维护,浏览器 API、时区规则和平台变化最终还是会把责任全部压回开发者。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9]

本次事件的入侵路径

评论不断澄清,这次并不是 GitHub 主仓库被直接合并了恶意代码。维护者说明,问题来自 PyPI 凭证泄露,恶意版本 2.6.2 和 2.6.3 是直接发布到 PyPI 上的,而 GitHub 源码本身据称没有被污染。另一条线索是大量新建的 GitHub 仓库,仓库名带着 Dune 词汇和 “A Mini Shai-Hulud has Appeared” 之类的文本,看起来像是被盗账号或 token 被用来批量投递、泄露凭证或制造噪音。还有人贴出了 `router_runtime.js` 的 hash,方便用户本地排查是否感染。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12] [来源13] [来源14]

LLM/AI 放大了安装风险

不少人担心 AI/LLM 正在把老问题放大。有人说现在很多 `pip install` 都是 Claude Code 建议后直接回车,而模型训练数据再新,也不知道这一周哪个包已经被投毒。另一些人强调,真正的问题不是模型“懂不懂安全”,而是它不会在安装前检查包里会执行什么代码,尤其是 `setup.py` 和各类 hook。更远一点的猜测是,未来可能出现专门污染训练数据或 agent 链路的供应链攻击,但也有人怀疑这类攻击的迭代周期太长、成本太高。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10] [来源11] [来源12]

应急防护与版本控制

在恐慌之外,讨论也落到了能立刻做的防护措施上。有人建议锁版本、使用 pip 的上传时间冷却、uv 的 `exclude-newer`,或者用 SBOM 辅助识别和回滚依赖。AWS 侧则建议启用 CloudTrail、限制密钥权限,因为被盗凭证最常见的滥用方式往往是悄悄起一堆昂贵的 EC2 实例。维护者也明确建议先停留在 2.6.1,等 2.6.4 发布再升级,而 PyPI 侧更严格的 2FA 也被点名要求。

[来源1] [来源2] [来源3] [来源4] [来源5] [来源6] [来源7] [来源8] [来源9] [来源10]

📚 术语解释

Shai-Hulud: 《Dune》里的沙虫名,这里被用作这轮恶意活动的主题代号。

PyPI: Python Package Index,Python 的官方第三方包仓库,恶意版本常直接在这里发布。

setup.py: 传统 Python 打包脚本,安装时可能执行代码,是供应链攻击的常见入口。

requirements.txt: Python 依赖清单文件,很多项目只写版本范围而没有真正锁死依赖。

版本锁定(lockfile): 把依赖固定到具体版本,减少自动升级到受污染版本的风险。

SBOM: Software Bill of Materials,软件物料清单,用于追踪组件和受影响版本。

uv: Astral 出的 Python 包/环境管理工具,评论中常被拿来和 asdf、pip 对比。