Python 依赖供应链的安全审计

1次阅读

pip audit 不能直接查出所有漏洞,仅检测已安装包的已知cve,不分析源码、不覆盖私有包、存在数据延迟且忽略可编辑安装等。

Python 依赖供应链的安全审计

pip audit 能直接查出所有漏洞吗

不能。pip audit 只检查已安装包的已知 CVE,不分析源码、不检测间接依赖的逻辑缺陷、不覆盖未打包进 PyPI 的私有包或 git 直接引用的依赖。

它依赖 pip-audit 自带的 pip-api 和官方 NVD 数据快照,更新有延迟(通常 1–3 天),遇到新爆的漏洞大概率漏报。

  • 只对 pip install 后的环境生效,对 requirements.txt 文件本身不扫描
  • 默认跳过可编辑安装(-e)和本地路径依赖,需加 --include-editable 才能覆盖
  • 若项目用 poetrypipenv 管理,得先导出为 pip freeze 格式再扫,否则审计结果不完整

如何让 pip audit 发现更多真实风险

关键不是多扫几次,而是补全上下文:把锁文件、构建环境、运行时实际加载的包都纳入判断范围。

  • pip freeze --all 替代 pip freeze,强制包含 setuptools、wheel 等底层工具链包(它们也有 CVE)
  • 对 CI 流程,在 venv 激活后、跑测试前执行 pip audit --require-hashes,能揪出哈希不匹配导致的包篡改
  • 配合 safetysafety check -r requirements.txt)交叉验证:它用不同数据源,常能发现 pip audit 漏掉的旧版本高危包

pyproject.toml 里写 dependency-groups 会影响审计结果吗

会,而且影响很隐蔽。如果只在 [project.optional-dependencies] 里声明 devtest 组,但没在 CI 中显式安装,pip audit 就完全看不到这些包——哪怕它们在开发机上装了。

立即学习Python免费学习笔记(深入)”;

更麻烦的是,pip-tools 生成的 requirements.txt 默认不包含 optional 组,除非你手动加 --extra dev

  • 审计前务必确认:当前环境是否真包含了你要上线的全部依赖组合
  • CI 中建议用 pip install .[dev,test] 安装,再跑 pip audit,避免“本地能过、线上翻车”
  • dependency-groups 是 PEP 732 提案,尚未被 pip audit 原生支持,别指望它自动识别组间冲突

audit 报 Warning: No known vulnerabilities found 是好事吗

不一定。这个提示只是说「没查到已知 CVE」,不代表安全。常见陷阱是依赖链里混入了被弃用但仍在用的包(比如 urllib3 ),NVD 可能还没给它打标,但社区早已公开绕过方案。

  • 检查 pip show <pkg_name></pkg_name> 输出的 VersionHome-page,确认是否还在维护周期内
  • pip install --upgrade --dry-run <pkg></pkg> 看升级路径,有些包升到新版要改代码(比如 requests 从 2.x 到 3.x),硬升反而引入新问题
  • 真正要盯的是 pip audit --strict 下的 exit code:0=无已知漏洞,1=有漏洞,2=网络错误或解析失败——别只看 stdout

依赖安全不是扫一次就完事的事。最危险的漏洞往往藏在没人碰的旧子依赖里,而 pip audit 的静默通过最容易让人放松警惕。

text=ZqhQzanResources