
Audite les environnements Python, les fichiers requirements et les arbres de dépendances pour les vulnérabilités de sécurité connues, et peut les corriger automatiquement
pip-audit est un outil pour analyser les environnements Python à la recherche de paquets présentant des vulnérabilités connues. Il utilise la Base de données d'avis Python Packaging Advisory Database (https://github.com/pypa/advisory-database) via l'API JSON PyPI comme source de rapports de vulnérabilité.
Ce projet est maintenu en partie par Trail of Bits avec le soutien de Google. Il ne s'agit pas d'un produit officiel de Google ou de Trail of Bits.
requirements--fix)pip locaux existantspip-audit nécessite Python 3.10 ou plus récent, et peut être installé directement via pip :```bash
python -m pip install pip-audit
### Paquets tiers
Il existe plusieurs paquets **tiers** pour `pip-audit`. Les matrices et badges ci-dessous en listent quelques-uns :
[](https://repology.org/project/python:pip-audit/versions)
[](https://repology.org/project/pip-audit/versions)
[][#conda-forge-package]
[][#conda-forge-package]
[#conda-forge-package]: https://anaconda.org/conda-forge/pip-audit
En particulier, `pip-audit` peut être installé via `conda` :```bash
conda install -c conda-forge pip-audit
Les paquets tiers ne sont pas directement supportés par ce projet. Veuillez consulter la documentation de votre gestionnaire de paquets pour des instructions d'installation plus détaillées.
pip-audit a une action GitHub officielle !
Vous pouvez l'installer depuis le GitHub Marketplace, ou l'ajouter manuellement à votre CI :```yaml jobs: pip-audit: steps: - uses: pypa/[email protected] with: inputs: requirements.txt
Voir la
[documentation de l'action](https://github.com/pypa/gh-action-pip-audit/blob/main/README.md)
pour plus de détails et des exemples d'utilisation.
### Support de `pre-commit`
`pip-audit` prend en charge [`pre-commit`](https://pre-commit.com/).
Par exemple, utiliser `pip-audit` via `pre-commit` pour auditer un fichier requirements :```yaml
- repo: https://github.com/pypa/pip-audit
rev: v2.10.1
hooks:
- id: pip-audit
args: ["-r", "requirements.txt"]
ci:
# Leave pip-audit to only run locally and not in CI
# pre-commit.ci does not allow network calls
skip: [pip-audit]
Tous les arguments pip-audit documentés ci-dessous peuvent être passés.
Vous pouvez exécuter pip-audit en tant que programme autonome, ou via python -m:```bash
pip-audit --help
python -m pip_audit --help
<!-- @begin-pip-audit-help@ -->```
usage: pip-audit [-h] [-V] [-l] [-r REQUIREMENT] [--locked] [-f FORMAT]
[-s SERVICE] [--osv-url OSV_URL] [-d] [-S]
[--desc [{on,off,auto}]] [--aliases [{on,off,auto}]]
[--cache-dir CACHE_DIR] [--progress-spinner {on,off}]
[--timeout TIMEOUT] [--path PATH] [-v] [--fix]
[--require-hashes] [--index-url INDEX_URL]
[--extra-index-url URL] [--skip-editable] [--no-deps]
[-o FILE] [--ignore-vuln ID] [--disable-pip]
[project_path]
audit the Python environment for dependencies with known vulnerabilities
positional arguments:
project_path audit a local Python project at the given path
(default: None)
options:
-h, --help show this help message and exit
-V, --version show program's version number and exit
-l, --local show only results for dependencies in the local
environment (default: False)
-r REQUIREMENT, --requirement REQUIREMENT
audit the given requirements file; this option can be
used multiple times (default: None)
--locked audit lock files from the local Python project. This
flag only applies to auditing from project paths
(default: False)
-f FORMAT, --format FORMAT
the format to emit audit results in (choices: columns,
json, cyclonedx-json, cyclonedx-xml, markdown)
(default: columns)
-s SERVICE, --vulnerability-service SERVICE
the vulnerability service to audit dependencies
against (choices: osv, pypi, esms) (default: pypi)
--osv-url OSV_URL URL to use for the OSV API instead of the default
(default: https://api.osv.dev/v1/query)
-d, --dry-run without `--fix`: collect all dependencies but do not
perform the auditing step; with `--fix`: perform the
auditing step but do not perform any fixes (default:
False)
-S, --strict fail the entire audit if dependency collection fails
on any dependency (default: False)
--desc [{on,off,auto}]
include a description for each vulnerability; `auto`
defaults to `on` for the `json` format. This flag has
no effect on the `cyclonedx-json` or `cyclonedx-xml`
formats. (default: auto)
--aliases [{on,off,auto}]
includes alias IDs for each vulnerability; `auto`
defaults to `on` for the `json` format. This flag has
no effect on the `cyclonedx-json` or `cyclonedx-xml`
formats. (default: auto)
--cache-dir CACHE_DIR
the directory to use as an HTTP cache for PyPI; uses
the `pip` HTTP cache by default (default: None)
--progress-spinner {on,off}
display a progress spinner (default: on)
--timeout TIMEOUT set the socket timeout (default: 15)
--path PATH restrict to the specified installation path for
auditing packages; this option can be used multiple
times (default: [])
-v, --verbose run with additional debug logging; supply multiple
times to increase verbosity (default: 0)
--fix automatically upgrade dependencies with known
vulnerabilities (default: False)
--require-hashes require a hash to check each requirement against, for
repeatable audits; this option is implied when any
package in a requirements file has a `--hash` option.
(default: False)
--index-url INDEX_URL
base URL of the Python Package Index; this should
point to a repository compliant with PEP 503 (the
simple repository API); this will be resolved by pip
if not specified (default: None)
--extra-index-url URL
extra URLs of package indexes to use in addition to
`--index-url`; should follow the same rules as
`--index-url` (default: [])
--skip-editable don't audit packages that are marked as editable
(default: False)
--no-deps don't perform any dependency resolution; requires all
requirements are pinned to an exact version (default:
False)
-o FILE, --output FILE
output results to the given file (default: stdout)
--ignore-vuln ID ignore a specific vulnerability by its vulnerability
ID; this option can be used multiple times (default:
[])
--disable-pip don't use `pip` for dependency resolution; this can
only be used with hashed requirements files or if the
`--no-deps` flag has been provided (default: False)
pip-audit permet aux utilisateurs de configurer certains indicateurs via des variables d'environnement plutôt :
| Option | Équivalent en variable d'environnement | Exemple |
|---|---|---|
--format | PIP_AUDIT_FORMAT | PIP_AUDIT_FORMAT=markdown |
--vulnerability-service | PIP_AUDIT_VULNERABILITY_SERVICE | PIP_AUDIT_VULNERABILITY_SERVICE=osv |
--desc | PIP_AUDIT_DESC | PIP_AUDIT_DESC=off |
--progress-spinner | PIP_AUDIT_PROGRESS_SPINNER | PIP_AUDIT_PROGRESS_SPINNER=off |
--output | PIP_AUDIT_OUTPUT | PIP_AUDIT_OUTPUT=/tmp/example |
À la fin, pip-audit se termine avec un code indiquant son état.
Les codes actuels sont :
0 : Aucune vulnérabilité connue détectée.1 : Une ou plusieurs vulnérabilités connues ont été trouvées.Le code de sortie de pip-audit ne peut pas être supprimé.
Voir Supprimer les codes de sortie de pip-audit
pour des alternatives prises en charge.
pip-audit prend en charge l'option --dry-run, qui peut être utilisée pour contrôler si
une étape d'audit (ou de correction) est réellement effectuée.
pip-audit --dry-run ignore l'étape d'audit et affiche
le nombre de dépendances qui auraient été auditées.pip-audit --fix --dry-run effectue l'étape d'audit et affiche
le comportement de correction (c'est-à-dire quelles dépendances seraient mises à niveau ou ignorées)
qui aurait été effectué.Auditer les dépendances pour l'environnement Python actuel :```console $ pip-audit No known vulnerabilities found
Auditer les dépendances pour un fichier requirements donné :```console
$ pip-audit -r ./requirements.txt
No known vulnerabilities found
Auditer les dépendances pour un fichier requirements, à l'exclusion des paquets système :```console $ pip-audit -r ./requirements.txt -l No known vulnerabilities found
Auditer les dépendances d'un projet Python local :```console
$ pip-audit .
No known vulnerabilities found
Auditer les lockfiles pour un projet Python local :```console $ pip-audit --locked . No known vulnerabilities found
`pip-audit` recherche divers fichiers de « projet » Python dans le chemin fourni.
Pour l'instant, seuls `pyproject.toml` et `pylock.*.toml` sont pris en charge.
Auditez les dépendances lorsque des vulnérabilités sont présentes :```console
$ pip-audit
Found 2 known vulnerabilities in 1 package
Name Version ID Fix Versions
---- ------- -------------- ------------
Flask 0.5 PYSEC-2019-179 1.0
Flask 0.5 PYSEC-2018-66 0.12.3
Auditer les dépendances, y compris les alias :```console $ pip-audit --aliases Found 2 known vulnerabilities in 1 package Name Version ID Fix Versions Aliases
Flask 0.5 PYSEC-2019-179 1.0 CVE-2019-1010083, GHSA-5wv5-4vpf-pj6m Flask 0.5 PYSEC-2018-66 0.12.3 CVE-2018-1000656, GHSA-562c-5r94-xh97
Auditer les dépendances incluant les descriptions:```console
$ pip-audit --desc
Found 2 known vulnerabilities in 1 package
Name Version ID Fix Versions Description
---- ------- -------------- ------------ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Flask 0.5 PYSEC-2019-179 1.0 The Pallets Project Flask before 1.0 is affected by: unexpected memory usage. The impact is: denial of service. The attack vector is: crafted encoded JSON data. The fixed version is: 1. NOTE: this may overlap CVE-2018-1000656.
Flask 0.5 PYSEC-2018-66 0.12.3 The Pallets Project flask version Before 0.12.3 contains a CWE-20: Improper Input Validation vulnerability in flask that can result in Large amount of memory usage possibly leading to denial of service. This attack appear to be exploitable via Attacker provides JSON data in incorrect encoding. This vulnerability appears to have been fixed in 0.12.3. NOTE: this may overlap CVE-2019-1010083.
Auditer les dépendances au format JSON :```console $ pip-audit -f json | python -m json.tool Found 2 known vulnerabilities in 1 package [ { "name": "flask", "version": "0.5", "vulns": [ { "id": "PYSEC-2019-179", "fix_versions": [ "1.0" ], "aliases": [ "CVE-2019-1010083", "GHSA-5wv5-4vpf-pj6m" ], "description": "The Pallets Project Flask before 1.0 is affected by: unexpected memory usage. The impact is: denial of service. The attack vector is: crafted encoded JSON data. The fixed version is: 1. NOTE: this may overlap CVE-2018-1000656." }, { "id": "PYSEC-2018-66", "fix_versions": [ "0.12.3" ], "aliases": [ "CVE-2018-1000656", "GHSA-562c-5r94-xh97" ], "description": "The Pallets Project flask version Before 0.12.3 contains a CWE-20: Improper Input Validation vulnerability in flask that can result in Large amount of memory usage possibly leading to denial of service. This attack appear to be exploitable via Attacker provides JSON data in incorrect encoding. This vulnerability appears to have been fixed in 0.12.3. NOTE: this may overlap CVE-2019-1010083." } ] }, { "name": "jinja2", "version": "3.0.2", "vulns": [] }, { "name": "pip", "version": "21.3.1", "vulns": [] }, { "name": "setuptools", "version": "57.4.0", "vulns": [] }, { "name": "werkzeug", "version": "2.0.2", "vulns": [] }, { "name": "markupsafe", "version": "2.0.1", "vulns": [] } ]
Auditer et tenter de mettre à jour automatiquement les dépendances vulnérables :```console
$ pip-audit --fix
Found 2 known vulnerabilities in 1 package and fixed 2 vulnerabilities in 1 package
Name Version ID Fix Versions Applied Fix
----- ------- -------------- ------------ ----------------------------------------
flask 0.5 PYSEC-2019-179 1.0 Successfully upgraded flask (0.5 => 1.0)
flask 0.5 PYSEC-2018-66 0.12.3 Successfully upgraded flask (0.5 => 1.0)
Vous avez résolu un problème avec pip-audit ? Aidez-nous en contribuant à cette section !
pip-audit affiche des rapports de vulnérabilité non pertinents !Dans un monde parfait, les flux de vulnérabilités auraient un rapport signal/bruit infini : chaque rapport de vulnérabilité serait (1) correct et (2) applicable à chaque utilisation de chaque dépendance.
Malheureusement, rien de tout cela n'est garanti : les flux de vulnérabilités ne sont pas à l'abri de rapports superflus ou de spam, et toutes les utilisations d'une dépendance particulière ne correspondent pas à toutes les classes potentielles de vulnérabilités.
Si vos exécutions de pip-audit produisent des rapports de vulnérabilité qui ne sont pas exploitables pour votre application ou cas d'utilisation particulier, vous pouvez utiliser l'option --ignore-vuln ID pour ignorer des rapports de vulnérabilité spécifiques. --ignore-vuln prend en charge les alias, vous pouvez donc utiliser un ID GHSA-xxx ou CVE-xxx au lieu d'un ID PYSEC-xxx si le rapport en question ne possède pas d'ID PYSEC.
Par exemple, voici comment ignorer GHSA-w596-4wvx-j9j6, qui est une source courante de rapports de vulnérabilité bruyants et de faux positifs pour les utilisateurs de pytest :```console
$ pip-audit --ignore-vuln GHSA-w596-4wvx-j9j6
L'option `--ignore-vuln ID` fonctionne avec toutes les autres options de résolution de dépendances et d'audit, ce qui signifie qu'elle devrait fonctionner correctement avec les entrées de type requirements, les flux de vulnérabilités alternatifs, etc.
Elle peut également être passée plusieurs fois, pour ignorer plusieurs rapports :```console
# Run the audit as normal, but exclude any reports that match these IDs
$ pip-audit --ignore-vuln CVE-XXX-YYYY --ignore-vuln CVE-ZZZ-AAAA
pip-audit prend plus de temps que prévu !Selon la façon dont vous l'utilisez, pip-audit peut devoir effectuer sa propre résolution des dépendances, ce qui peut prendre à peu près autant de temps que pip install pour un projet. Voir le modèle de sécurité pour une explication.
Vous avez deux options pour éviter la résolution des dépendances : auditer un environnement préinstallé, ou s'assurer que vos dépendances sont déjà entièrement résolues.
Si vous savez que vous avez déjà entièrement configuré un environnement équivalent à celui que pip-audit -r requirements.txt auditerait, vous pouvez simplement le réutiliser :```console
$ pip-audit
$ pip-audit --local
Sinon, si votre entrée est entièrement épinglée (et éventuellement hachée), vous
pouvez dire à `pip-audit` d'ignorer la résolution des dépendances avec soit `--no-deps`
(épinglé sans hachages) soit `--require-hashes` (épinglé avec hachages).
Cette dernière est équivalente au [mode de vérification de hachage](https://pip.pypa.io/en/stable/cli/pip_install/#hash-checking-mode) de `pip` et est préférée, car elle offre une intégrité supplémentaire.```console
# fails if any dependency is not fully pinned
$ pip-audit --no-deps -r requirements.txt
# fails if any dependency is not fully pinned *or* is missing hashes
$ pip-audit --require-hashes -r requirements.txt
pip-audit ne peut pas s'authentifier à mon index tiers !pip-audit prend en charge --index-url et --extra-index-url pour configurer des index de paquets alternatifs ou supplémentaires, tout comme pip.
Lorsqu'ils sont non authentifiés, ces indices devraient fonctionner comme prévu. Cependant, lorsqu'un index tiers nécessite une authentification, pip-audit a quelques restrictions supplémentaires par rapport à pip normal :
pip-audit ne vous demandera pas de nom d'utilisateur/mot de passe pour l'index.keyring de pip est prise en charge, mais de manière limitée : pip-audit utilise le fournisseur de keyring subprocess, car les audits ont lieu dans des environnements virtuels isolés. Le fournisseur subprocess est lui-même soumis à des restrictions supplémentaires (comme un nom d'utilisateur obligatoire) ; la documentation de pip les explique en détail.En plus de ce qui précède, certains index tiers ont des noms d'utilisateur obligatoires et codés en dur. Par exemple, pour Google Artifact Registry, le nom d'utilisateur codé en dur est oauth2accesstoken. Voir #742 et pip#11971 pour plus de contexte.
pipenvpipenv utilise à la fois un fichier Pipfile et Pipfile.lock pour suivre et figer les dépendances au lieu d'un fichier requirements.txt. pip-audit ne peut pas traiter directement les fichiers Pipfile[.lock], mais ceux-ci peuvent être convertis en un fichier requirements.txt pris en charge que pip-audit peut analyser. pipenv dispose d'une commande intégrée pour convertir les dépendances en fichier requirements.txt (depuis la v2022.4.8) :```console
$ pipenv run pip-audit -r <(pipenv requirements)
### Suppression des codes de sortie de `pip-audit`
`pip-audit` ne supporte intentionnellement pas la suppression interne de ses propres codes de sortie.
Les utilisateurs qui ont besoin de supprimer un appel `pip-audit` en échec peuvent utiliser l'un des idiomes shell standard pour ce faire :```bash
pip-audit || true
ou, pour quitter complètement :```bash pip-audit || exit 0
Le code de sortie peut également être capturé et géré explicitement :```bash
pip-audit
exitcode="${?}"
# do something with ${exitcode}
Consultez Codes de sortie pour une liste des codes potentiels qui nécessitent une gestion.
Dans les workflows de développement, vous pouvez souhaiter ignorer les vulnérabilités qui n'ont pas encore été corrigées et ne les examiner que lors de votre processus de publication. pip-audit ne prend pas en charge l'ignorance des vulnérabilités non corrigées. Cependant, vous pouvez exporter sa sortie au format JSON et la traiter en externe. Par exemple, si vous voulez quitter avec un code non nul uniquement lorsque les vulnérabilités détectées ont des versions de correctif connues, vous pouvez traiter la sortie en utilisant jq comme suit :```shell
test -z "$(pip-audit -r requirements.txt --format=json 2>/dev/null | jq '.dependencies[].vulns[].fix_versions[]')"
Un exemple simple (et inefficace) d'utilisation de cette méthode serait:```shell
test -z "$(pip-audit -r requirements.txt --format=json 2>/dev/null | jq '.dependencies[].vulns[].fix_versions[]')" || pip-audit -r requirements.txt
which runs pip-audit as usual and exits with a non-zero code only if there are fixed versions for the known vulnerabilities.
This section exists to describe the security assumptions you can and must not
make when using pip-audit.
TL;DR: If you wouldn't pip install it, you should not pip audit it.
pip-audit is a tool for auditing Python environments for packages with
known vulnerabilities. A "known vulnerability" is a publicly reported flaw in
a package that, if uncorrected, might allow a malicious actor to perform
unintended actions.
pip-audit can protect you against known vulnerabilities by telling
you when you have them, and how you should upgrade them. For example,
if you have somepackage==1.2.3 in your environment, pip-audit can tell
you that it needs to be upgraded to 1.2.4.
You can assume that pip-audit will make a best effort to fully resolve
all of your Python dependencies and either fully audit each or explicitly
state which ones it has skipped, as well as why it has skipped them.
pip-audit is not a static code analyzer. It analyzes dependency trees,
not code, and it cannot guarantee that arbitrary dependency resolutions
occur statically. To understand why this is, refer to Dustin Ingram's
excellent post on dependency resolution in Python.
As such: you must not assume that pip-audit will defend you against
malicious packages. In particular, it is incorrect to treat
pip-audit -r INPUT as a "more secure" variant of pip-audit. For all intents
and purposes, pip-audit -r INPUT is functionally equivalent to
pip install -r INPUT, with a small amount of non-security isolation to
avoid conflicts with any of your local environments.
pip-audit is first and foremost an auditing tool for Python packages.
You must not assume that pip-audit will detect or flag "transitive"
vulnerabilities that might be exposed through Python packages, but are not
actually part of the package itself. For example, pip-audit's vulnerability
information sources are unlikely to include an advisory for a vulnerable shared
library that a popular Python package might use, since the Python package's
version is not strongly connected to the shared library's version.
pip-audit is licensed under the Apache 2.0 License.
pip-audit reuses and modifies examples from
resolvelib, which is licensed under
the ISC license.
See the contributing docs for details.
Everyone interacting with this project is expected to follow the PSF Code of Conduct.