pip-audit:Python 依赖安全扫描工具

pip-audit 是 PyPA(Python Packaging Authority)维护的依赖安全扫描工具,用于检查 Python 环境和依赖文件中是否存在已知漏洞。数据来源是 Python Packaging Advisory Database,通过 PyPI JSON API 或 OSV 查询。

和 npm audit 类似,但 pip 本身没有内置 audit 功能,pip-audit 填补了这个空缺。

安装

pip install pip-audit

需要 Python 3.10+。也支持 conda 安装:

conda install -c conda-forge pip-audit

基本用法

扫描当前环境

pip-audit

直接扫描当前虚拟环境中安装的所有包,输出有漏洞的包及 CVE 编号。

扫描 requirements 文件

pip-audit -r requirements.txt

扫描项目路径

pip-audit /path/to/project

会自动识别项目中的依赖文件(requirements.txt、pyproject.toml、setup.cfg 等)。

扫描 lock 文件

pip-audit --locked /path/to/project

输出格式

默认是列格式,支持多种输出:

pip-audit -f json        # JSON
pip-audit -f markdown    # Markdown 表格
pip-audit -f cyclonedx-json   # CycloneDX SBOM
pip-audit -f cyclonedx-xml    # CycloneDX SBOM

JSON 格式适合接入 CI/CD 流水线做自动化处理,CycloneDX 格式可以生成 SBOM(软件物料清单)。

自动修复

pip-audit --fix

--fix 会自动升级有漏洞的依赖到安全版本。加 --dry-run 可以预览修复结果而不实际执行:

pip-audit --fix --dry-run

漏洞源

pip-audit 支持三个漏洞数据库:

  • PyPI(默认):通过 PyPI JSON API 查询,数据来自 Python Packaging Advisory Database
  • OSV:Google 的开源漏洞数据库,覆盖范围更广
  • ESMS:Ecosystem SBOM Service

切换漏洞源:

pip-audit -s osv

实用参数

参数作用
-l / --local只显示本地安装的包,跳过依赖的依赖
-S / --strict依赖收集失败时直接报错退出
--skip-editable跳过 editable 模式安装的包
--no-deps不做依赖解析,要求所有包锁定精确版本
--ignore-vuln ID忽略指定漏洞(可多次使用)
-o FILE输出到文件
--require-hashes要求 requirements 中有 hash 校验

集成 CI/CD

Gitea Actions

pip-audit 有官方 GitHub Action,Gitea Actions 兼容该格式:

jobs:
  pip-audit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pypa/gh-action-pip-audit@v1.1.0
        with:
          inputs: requirements.txt

pre-commit

- repo: https://github.com/pypa/pip-audit
  rev: v2.10.1
  hooks:
    - id: pip-audit
      args: ["-r", "requirements.txt"]
ci:
  skip: [pip-audit]

注意 pre-commit.ci 不允许网络调用,所以 CI 环境中需要跳过。

和其他工具的对比

  • safety:商业产品,漏洞数据库需要付费订阅,pip-audit 完全免费开源
  • Snyk:SaaS 服务,需要注册账号,pip-audit 本地运行不传数据
  • Trivy:通用扫描器(容器+依赖),pip-audit 专注 Python 生态,更轻量

pip-audit 的优势在于:PyPA 官方维护、MIT 协议、本地运行、复用 pip 缓存、支持自动修复。