pip-audit 在 ci 中默认不阻断,必须显式启用 --strict 模式才能使漏洞检测真正阻断构建;需配合 -r、--refresh 使用,并确保 requirements.txt 格式规范、包名准确,禁用 --fix 以避免破坏性升级。

pip-audit 在 CI 中默认不阻断,必须显式启用严格模式
pip-audit 默认只报告漏洞,即使发现 CVE-2021-43818 这类高危问题,退出码仍是 0,CI 流程照常通过。这会让“扫描通过”产生严重误判。
要真正阻断构建,必须加 --strict 参数:它会让 pip-audit 在任意一个满足约束的版本存在已知漏洞时返回非零退出码(通常是 1)。没有这个参数,pip-audit -r requirements.txt 就只是个“查看器”,不是“守门员”。
-
--strict作用对象是版本约束(如django>=3.2,),不是当前安装版本——它会查这个区间内所有已发布的带漏洞版本,哪怕你本地装的是 3.2.15(无漏洞),只要 3.2.0 有 CVE,就报错 - 搭配
-r使用才有意义;对当前环境运行pip-audit --strict效果等同于不加,因为只检查已安装版本 - GitHub Actions 中需检查
steps.run的if条件或后续步骤是否依赖上一步的continue-on-error: false(默认即为阻断)
requirements.txt 解析失败导致漏报,常见于非标准包名和内联注释
CI 中常出现 Failed to resolve package 却没报错,结果是“扫描完成但什么都没查”。这不是静默成功,而是解析跳过——该包完全没进漏洞比对流程。
典型原因包括:PyYAML 写成 pyyaml(大小写不一致)、django-crispy-forms 写成 crispy-forms(实际 PyPI 分发名与 import 名不同)、某行末尾带 # dev-only 但前面多了一个空格导致整行被忽略。
- 用
pip-audit -r requirements.txt -v查看详细日志,重点找Resolved xxx to y.z.w或Skipping line ... - 确保所有包名与
https://pypi.org/project/<code>包名/ URL 完全一致(注意连字符、下划线、大小写) - 避免在
requirements.txt中混用--find-links、--index-url等 pip 指令行参数;pip-audit 不识别它们,遇到就整行跳过
自动修复(--fix)在 CI 中慎用,尤其不能用于生产环境构建
pip-audit --fix 会直接修改 requirements.txt 并重写文件,但在 CI 流水线中这么做风险极高:它可能把原本兼容的旧版(如 urllib3==1.25.11)升级到破坏性新版(1.26.0),导致测试失败甚至构建中断。
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
更关键的是,--fix 不处理间接依赖(transitive deps)——它只改顶层声明,而漏洞往往藏在 requests 依赖的 urllib3 里。此时修复表面包,实际漏洞仍在。
- CI 中应禁用
--fix,只做检测;修复动作留给开发者在本地验证后手动提交 - 若真需要自动化升级,优先用
pip-tools:先pip-compile requirements.in生成锁定版requirements.txt,再用pip-audit -r requirements.txt --strict扫描 - 对
pyproject.toml项目,pip-audit 目前不原生支持解析 [project.dependencies],需先导出为 requirements 格式(如用pip show+ 脚本提取)
数据库延迟与本地缓存干扰,CI 中必须强制刷新
pip-audit 使用的漏洞数据库(PPAD / OSV)更新有延迟,2026年9月30日当天新公开的 CVE 可能还未同步。更麻烦的是,它会复用本地 pip 缓存,如果 CI runner 复用旧镜像或缓存目录,可能加载数天前的陈旧漏洞数据。
CI 中最稳妥的做法是每次运行前加 --refresh,强制重新拉取最新数据库快照。不加的话,可能漏掉最近 24–48 小时内披露的关键漏洞。
-
pip-audit -r requirements.txt --strict --refresh是 CI 场景下的推荐最小命令集 - 若使用 GitHub Actions,建议在
pip-audit步骤前加run: rm -rf ~/.cache/pip-audit清理潜在脏缓存 - 对高安全要求项目,可额外调用
pip-audit --api(对接实时 API),但需注意速率限制和网络稳定性
真正卡住 CI 的从来不是工具本身,而是对 --strict 的依赖范围理解偏差、对 requirements.txt 格式隐含限制的忽视,以及把本地开发习惯直接搬进不可信的 CI 环境。漏洞数据库不会替你读项目约束,也不会为你判断哪个版本升级是安全的——这些决策点,必须由人来定义边界,再让工具严格执行。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










