AI 从过时训练数据生成 requirements.txt,导致依赖版本过旧带有已知漏洞。提出静态扫描方案检测隐形安全问题。
AI 编程助手会根据训练数据编写 requirements.txt 中的依赖项,而不是查询实时的 PyPI 索引。它固定的版本通常是训练语料库中最常见的版本,而这些版本往往在模型训练截止日期前 12~24 个月处于主流。等到团队安装这些依赖时,其中一些版本可能已经存在公开记录的漏洞。包名是正确的,安装也能成功。在审计运行之前,不会出现任何警告。
这与 slopsquatting 是两类不同的问题。slopsquatting 指 AI 幻觉出一个 PyPI 上不存在的包名,或者这个包名已经被攻击者注册成 typosquat 包。安装失败时,slopsquatting 会立刻暴露;而依赖版本存在漏洞的问题,默认情况下始终不可见。
AI 编程助手会根据训练数据生成 requirements.txt 中的依赖项,而不是查询实时的 PyPI 索引:它们写下的是训练过程中最常见的版本。这个版本通常流行于模型训练截止日期前 12~24 个月,并且可能存在截止日期之后才公开记录的已知漏洞。BrassCoders 的 AI 模式扫描器能够发现 phantom import,也就是 PyPI 上不存在的包;但真实存在却版本有漏洞的包可以正常安装,并通过所有 import 检查。
模型使用具有固定截止日期的代码快照进行训练。当你让模型搭建一个 Flask 应用时,它会写出 Flask==2.3.2,是因为这个版本在训练窗口期内的数千个 GitHub 仓库中出现过,而不是因为它今天早上查询了 PyPI。同样的规律也适用于 requests、cryptography 和 Pillow——任何拥有活跃 CVE 历史的依赖都可能成为候选对象。
对于频繁发布安全补丁的包,这一时间差尤其值得关注。cryptography 每年都会披露数次 CVE。Pillow 在其发布历史中已经累计出现超过 20 个 CVE。如果 AI 推荐 cryptography==41.0.3,而当前版本已经是 43.x,并且中间包含多项安全修复,那么你的环境从第一天起运行的就是已知存在漏洞的代码。
安装不会失败,import 可以正常执行,测试也能通过。正因如此,这类风险才如此容易被忽视。
BrassCoders 的 AI 模式扫描器能够发现 phantom import,也就是 PyPI 上不存在的包;但真实存在却版本有漏洞的包可以通过所有 import 检查,并顺利完成安装。只有显式运行依赖审计时,漏洞才会暴露出来。
slopsquatting 获得了大部分关注,因为它的攻击过程极具戏剧性:AI 编造了一个包名,攻击者在 PyPI 上注册这个名称并植入恶意代码,随后按照 AI 指令操作的开发者便会运行攻击载荷。由于涉及软件供应链,这类事件很容易成为引人注目的安全报道。
相比之下,有漏洞版本的问题更隐蔽,却会影响范围广得多的一类软件包。每一个有 CVE 历史的包都有可能中招。这个包真实存在于 PyPI,声誉良好;AI 固定的版本在模型接受训练时也是安全的,而标准开发流程不会暴露其中的时间差。
由 Python Packaging Authority 维护的 PyPI Advisory Database 会追踪特定软件包版本对应的已知漏洞。pip-audit 可以在几秒内完成查询,而你的 AI 助手对训练截止日期之后发布的 CVE 一无所知。
pip-audit 是 PyPA 官方的依赖审计工具,可以在几秒内将你的 requirements.txt 与 PyPI Advisory Database 和 GitHub Advisory Database 进行交叉核对。它基于实时漏洞索引而非训练数据运行,因此能够发现 AI 助手遗漏的问题。BrassCoders 与 pip-audit 分别覆盖不同层面,两者都应该加入 CI。
pip-audit 的安装和运行非常简单:
pip install pip-audit
pip-audit
请在 pip install -r requirements.txt 之后运行它,以便扫描实际安装的内容。无需身份验证,也不需要 API key。发现任何问题时,pip-audit 都会以状态码 1 退出,因此配置 CI 构建失败非常简单。检查结果会显示 CVE ID、受影响版本、修复版本和严重性评分——你可以在一分钟内获得分类处理该问题所需的全部信息。
有一类问题不在 pip-audit 的覆盖范围内:团队自己编写的代码中存在的安全缺陷。硬编码凭据、不安全的 subprocess 调用、SQL 注入模式——这些都属于存在于你自己模块内部的代码层风险。这正是 BrassCoders 发挥作用的地方。
BrassCoders 在 CI 中运行,负责发现你所编写软件包中的代码层安全缺陷,包括 SQL 注入、硬编码凭据和不安全的 subprocess 调用。pip-audit 则针对依赖清单运行,发现所导入软件包中的已知漏洞。两者应该出现在同一条 CI pipeline 中。
BrassCoders 会对源代码运行 12 个静态分析扫描器:Bandit、Pylint、Pyre/Pysa、Semgrep、ast-grep、detect-secrets,以及 6 个自定义检测器。在一个可复现的语料库中,AI-coder bug benchmark 显示,BrassCoders 能够发现 12 个 AI 生成 bug 中的 11 个,而 Bandit 只能发现 12 个中的 6 个。这些检测覆盖的是你的代码,而不是依赖清单。
这 6 个自定义检测器进一步覆盖了 secret 模式、PII/隐私风险、AI 生成的 phantom import、性能反模式、内容审核风险,以及 JavaScript/TypeScript。它们与上游扫描器在同一台本地机器上运行,OSS core 不会发起任何出站网络请求。
OSS core 免费提供,采用 Apache 2.0 许可证,可以通过以下方式安装:
pip install brasscoders
brasscoders scan .
BrassCoders Paid 的价格为每位开发者每月 12 美元,它增加了一轮 AI 驱动的增强处理,能够对检查结果去重,并按照结果与具体项目的相关性排序。它只会把已经脱敏的检查结果和项目签名发送到 gateway,绝不会发送原始源代码。
将这两个工具放在同一个 CI job 中。pip-audit 负责发现 AI 固定的、已经过时且存在漏洞的依赖;BrassCoders 负责发现 AI 写入 route handler 的 SQL 注入问题。两者无法互相替代。
运行 pip install brasscoders。在 pip install -r requirements.txt 之后立即加入 pip-audit。两者结合,便能同时覆盖代码层 bug 和依赖层 CVE。
如需采取进一步措施,你可以考虑屏蔽此人和/或举报滥用行为。