pip-audit是PyPA官方推荐的轻量级依赖漏洞扫描工具,专注检查已安装包或requirements.txt中的已知CVE,数据源为PyPI和GitHub Advisory,支持JSON输出、dry-run预演及--descend深度扫描,但默认不分析代码逻辑与间接依赖。

直接用 pip-audit 扫当前环境或 requirements.txt,配合 --json 输出,就能自动化检测并生成结构化报告——它不依赖外部服务、不需 API Key、结果可直接被 CI 解析。
pip-audit 是最稳的起点:为什么优先选它?
pip-audit 由 PyPA 官方维护,数据源来自 PyPI 的官方漏洞 API 和 GitHub Advisory Database,不走第三方商业库(比如 pyup.io),因此更新及时、无订阅门槛、离线可用性高。它默认扫描 site-packages 下所有已安装包,比只读 requirements.txt 更贴近真实运行态——手动升级、--force-reinstall、版本冲突导致的“实际装的是什么”,它都能看到。
常见误判点:
- 它不分析代码逻辑(比如你写了
eval(input())),只查包级 CVE - 它默认不递归检查间接依赖(如 A → B → C,C 有漏洞但 B 没声明 C 的版本),得加
--descend才进一层 - 如果项目用了
-e git+https://...这类可编辑安装,pip-audit会跳过——它只认 PyPI 上能查到的包名+版本号
safety 可作为快速预检,但别全信它的“无漏洞”结论
safety 启动快、命令极简,适合在 CI 流水线早期做“准入卡点”,但它依赖 pyup.io 的免费数据库,更新有延迟(通常滞后几小时到一天),严重漏洞可能漏报。尤其注意:
立即学习“Python免费学习笔记(深入)”;
- 它完全忽略
-e本地路径或 Git 依赖,requirements.txt里只要有一行-e ./mylib,对应包就不出现在报告里 -
safety check -r requirements.txt --ignore=PYSEC-2023-123这种忽略要慎用,--ignore是全局跳过,不是按包粒度控制 - 免费版不支持自定义策略或私有漏洞库,企业级审计场景下覆盖力明显弱于
pip-audit
生成机器可读报告的关键参数组合
想让扫描结果进 CI/CD 或对接内部安全平台,核心是稳定输出 JSON 并控制退出码语义:
- 标准扫描 + JSON 输出:
pip-audit -r requirements.txt --json > audit.json - 只让有中危及以上漏洞时才失败(CI 中常用):
pip-audit -r requirements.txt --vulnerability-severity medium - 预演升级方案但不真改环境:
pip-audit --dry-run,它会告诉你“如果升级 numpy,应该升到 1.26.4” - 想压平嵌套依赖树再扫(比如你怀疑子依赖有问题):
pip-audit --descend,但注意性能下降明显,不建议日常启用
容易被忽略的落地细节
很多团队扫完就扔报告,但真正卡住上线的是这几件事:
-
pip-audit不锁版本,它报告的“建议升级版本”未必兼容你的代码——必须搭配测试验证,不能只靠工具自动pip install --upgrade - 如果项目用
pyproject.toml+poetry或pdm,pip-audit -r requirements.txt仍有效,但得先用poetry export -f requirements.txt > requirements.txt导出锁定版本,否则扫的是未锁定的依赖范围 - CI 中运行时要注意 Python 环境干净,避免缓存旧包干扰结果;建议加
pip install --upgrade pip再跑pip-audit,防止因 pip 版本太老无法解析新格式元数据


















