
Esegue audit degli ambienti Python, dei file dei requisiti e degli alberi delle dipendenze per vulnerabilità di sicurezza note e può correggerle automaticamente
pip-audit è uno strumento per scansionare ambienti Python alla ricerca di pacchetti con vulnerabilità note. Utilizza il Python Packaging Advisory Database (https://github.com/pypa/advisory-database) tramite l'API JSON di PyPI come fonte di report di vulnerabilità.
Questo progetto è mantenuto in parte da Trail of Bits con il supporto di Google. Questo non è un prodotto ufficiale di Google o Trail of Bits.
--fix)pippip-audit richiede Python 3.10 o successivo e può essere installato direttamente tramite pip:```bash
python -m pip install pip-audit
### Pacchetti di terze parti
Ci sono diversi pacchetti **di terze parti** per `pip-audit`. Le matrici e i badge sottostanti elencano alcuni di essi:
[](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
In particolare, `pip-audit` può essere installato tramite `conda`:```bash
conda install -c conda-forge pip-audit
I pacchetti di terze parti non sono supportati direttamente da questo progetto. Consulta la documentazione del tuo gestore di pacchetti per una guida all'installazione più dettagliata.
pip-audit ha una GitHub Action ufficiale!
Puoi installarla dal GitHub Marketplace, o aggiungerla manualmente alla tua CI:```yaml jobs: pip-audit: steps: - uses: pypa/[email protected] with: inputs: requirements.txt
Vedi la
[documentazione dell'azione](https://github.com/pypa/gh-action-pip-audit/blob/main/README.md)
per maggiori dettagli ed esempi di utilizzo.
### Supporto di `pre-commit`
`pip-audit` supporta [`pre-commit`](https://pre-commit.com/).
Ad esempio, utilizzando `pip-audit` tramite `pre-commit` per verificare un file dei requisiti:```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]
Tutti gli argomenti di pip-audit documentati di seguito possono essere passati.
Puoi eseguire pip-audit come programma autonomo, o tramite 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 consente agli utenti di configurare alcuni flag tramite variabili d'ambiente:
| Flag | Equivalente d'ambiente | Esempio |
|---|---|---|
--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 |
Al termine, pip-audit terminerà con un codice che indica il suo stato.
I codici attuali sono:
0: Nessuna vulnerabilità nota rilevata.1: Una o più vulnerabilità note trovate.Il codice di uscita di pip-audit non può essere soppresso.
Vedere Sopprimere i codici di uscita da pip-audit
per alternative supportate.
pip-audit supporta il flag --dry-run, che può essere usato per controllare se
un passo di audit (o fix) viene effettivamente eseguito.
pip-audit --dry-run salta il passo di audit e stampa
il numero di dipendenze che sarebbero state sottoposte ad audit.pip-audit --fix --dry-run esegue il passo di audit e stampa
il comportamento di fix (cioè quali dipendenze sarebbero state aggiornate o saltate)
che sarebbe stato eseguito.Analizza le dipendenze per l'ambiente Python corrente:```console $ pip-audit No known vulnerabilities found
Controlla le dipendenze per un dato file di requisiti:```console
$ pip-audit -r ./requirements.txt
No known vulnerabilities found
Controlla le dipendenze per un file dei requisiti, escludendo i pacchetti di sistema:```console $ pip-audit -r ./requirements.txt -l No known vulnerabilities found
Verifica delle dipendenze per un progetto Python locale:```console
$ pip-audit .
No known vulnerabilities found
Verifica i file di blocco per un progetto Python locale:```console $ pip-audit --locked . No known vulnerabilities found
`pip-audit` cerca nel percorso fornito vari file "progetto" Python.
Al momento, sono supportati solo `pyproject.toml` e `pylock.*.toml`.
Controlla le dipendenze quando sono presenti vulnerabilità:```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
Controlla le dipendenze compresi gli 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
Controlla le dipendenze incluse le descrizioni:```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.
Controlla le dipendenze in formato 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": [] } ]
Verifica e tenta di aggiornare automaticamente le dipendenze vulnerabili:```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)
Hai risolto un problema con pip-audit? Aiutaci contribuendo a questa sezione!
pip-audit mostra report di vulnerabilità irrilevanti!In un mondo perfetto, i feed di vulnerabilità avrebbero un rapporto segnale/rumore infinito: ogni report di vulnerabilità sarebbe (1) corretto e (2) applicabile a ogni utilizzo di ogni dipendenza.
Sfortunatamente, nessuna di queste garanzie è certa: i feed di vulnerabilità non sono immuni da report estranei o spam, e non tutti gli utilizzi di una particolare dipendenza corrispondono a tutte le potenziali classi di vulnerabilità.
Se le esecuzioni di pip-audit producono report di vulnerabilità che non sono attuabili per la tua applicazione o caso d'uso specifico, puoi usare l'opzione --ignore-vuln ID per ignorare specifici report di vulnerabilità. --ignore-vuln supporta alias, quindi puoi usare un ID GHSA-xxx o CVE-xxx invece di un ID PYSEC-xxx se il report in questione non ha un ID PYSEC.
Ad esempio, ecco come potresti ignorare GHSA-w596-4wvx-j9j6, che è una fonte comune di report rumorosi e falsi positivi per gli utenti di pytest:```console
$ pip-audit --ignore-vuln GHSA-w596-4wvx-j9j6
L'opzione `--ignore-vuln ID` funziona con tutte le altre opzioni di risoluzione delle dipendenze e di auditing, il che significa che dovrebbe funzionare correttamente con input in formato requirements, feed di vulnerabilità alternativi e così via.
Può anche essere passata più volte, per ignorare più report:```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 impiega più tempo del previsto!A seconda di come lo utilizzi, pip-audit potrebbe dover eseguire la propria risoluzione delle dipendenze, che può richiedere più o meno lo stesso tempo di pip install per un progetto. Consulta il modello di sicurezza per una spiegazione.
Hai due opzioni per evitare la risoluzione delle dipendenze: eseguire un audit su un ambiente preinstallato oppure assicurarti che le dipendenze siano già completamente risolte.
Se sai di aver già configurato completamente un ambiente equivalente a quello che verrebbe sottoposto ad audit da pip-audit -r requirements.txt, puoi semplicemente riutilizzarlo:```console
$ pip-audit
$ pip-audit --local
In alternativa, se il tuo input è completamente bloccato (e opzionalmente hashato),
puoi dire a `pip-audit` di saltare la risoluzione delle dipendenze con `--no-deps`
(bloccato senza hash) o `--require-hashes` (bloccato con hash inclusi).
La seconda è equivalente a `pip`'s
[modalità di controllo hash](https://pip.pypa.io/en/stable/cli/pip_install/#hash-checking-mode)
ed è preferibile, poiché offre una maggiore integrità.```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 non riesce ad autenticarsi al mio indice di terze parti!pip-audit supporta --index-url e --extra-index-url per configurare un indice
alternativo o supplementare di pacchetti, proprio come pip.
Quando non autenticati, questi indici dovrebbero funzionare come previsto. Tuttavia, quando un indice
di terze parti richiede autenticazione, pip-audit ha alcune restrizioni aggiuntive rispetto
al normale pip:
pip-audit non
ti chiederà un nome utente/password per l'indice.keyring di pip
è supportata, ma in modo limitato: pip-audit utilizza il provider subprocess per keyring,
poiché gli audit avvengono in ambienti virtuali isolati. Il provider subprocess a sua volta
è soggetto a ulteriori restrizioni (come la necessità di un nome utente);
la documentazione di pip
spiega queste restrizioni in dettaglio.In aggiunta a quanto sopra, alcuni indici di terze parti hanno nomi utente obbligatori e fissi.
Ad esempio, per Google Artifact Registry, il nome utente fisso è oauth2accesstoken.
Vedere #742 e
pip#11971 per ulteriori informazioni.
pipenvpipenv utilizza sia un file Pipfile che Pipfile.lock per tracciare e congelare le dipendenze
invece di un file requirements.txt. pip-audit non può elaborare direttamente i file Pipfile[.lock],
tuttavia, questi possono essere convertiti in un file requirements.txt supportato
contro cui pip-audit può essere eseguito. pipenv ha un comando integrato per convertire le dipendenze
in un file requirements.txt (a partire dalla v2022.4.8):```console
$ pipenv run pip-audit -r <(pipenv requirements)
### Soppressione dei codici di uscita da `pip-audit`
`pip-audit` non supporta intenzionalmente la soppressione interna dei propri codici di uscita.
Gli utenti che devono sopprimere una chiamata fallita di `pip-audit` possono utilizzare uno dei modi standard della shell per farlo:
pip-audit ... || true # On POSIX shells pip-audit ... || ver # On Windows Powershell
pip-audit || true
```
oppure, per uscire completamente:```bash
pip-audit || exit 0
```
Il codice di uscita può anche essere catturato e gestito esplicitamente:```bash
pip-audit
exitcode="${?}"
# do something with ${exitcode}
```
Vedi [Codici di uscita](#exit-codes) per un elenco dei codici potenziali che necessitano di gestione.
### Segnalazione solo delle vulnerabilità risolvibili
Nei flussi di lavoro di sviluppo, potresti voler ignorare le vulnerabilità che non sono state ancora risolte e investigarle solo nel processo di rilascio. `pip-audit` non supporta l'ignorare le vulnerabilità non risolte. Tuttavia, puoi esportare il suo output in formato JSON ed elaborarlo esternamente. Ad esempio, se vuoi uscire con un codice non zero solo quando le vulnerabilità rilevate hanno versioni di fix conosciute, puoi elaborare l'output usando [jq](https://github.com/jqlang/jq) come:```shell
test -z "$(pip-audit -r requirements.txt --format=json 2>/dev/null | jq '.dependencies[].vulns[].fix_versions[]')"
```
Un esempio semplice (e inefficiente) dell'utilizzo di questo metodo potrebbe essere:```shell
test -z "$(pip-audit -r requirements.txt --format=json 2>/dev/null | jq '.dependencies[].vulns[].fix_versions[]')" || pip-audit -r requirements.txt
```
che esegue `pip-audit` come al solito e termina con un codice diverso da zero solo se esistono versioni corrette per le vulnerabilità note.
## Modello di Sicurezza
Questa sezione esiste per descrivere le ipotesi di sicurezza che **puoi** e **non devi** fare quando usi `pip-audit`.
TL;DR: **Se non lo `pip install`eresti, non dovresti `pip audit`arlo.**
`pip-audit` è uno strumento per controllare gli ambienti Python alla ricerca di pacchetti con *vulnerabilità note*. Una "vulnerabilità nota" è un difetto segnalato pubblicamente in un pacchetto che, se non corretto, *potrebbe* permettere a un attore malevolo di compiere azioni non desiderate.
`pip-audit` **può** proteggerti dalle vulnerabilità note dicendoti quando le hai e come dovresti aggiornarle. Ad esempio, se hai `somepackage==1.2.3` nel tuo ambiente, `pip-audit` **può** dirti che deve essere aggiornato a `1.2.4`.
Puoi **assumere** che `pip-audit` farà del suo meglio per *risolvere completamente* tutte le tue dipendenze Python e *o* controllarle completamente *oppure* dichiarare esplicitamente quali ha saltato e perché.
`pip-audit` **non** è un analizzatore statico di codice. Analizza alberi delle dipendenze, non codice, e **non può** garantire che risoluzioni arbitrarie delle dipendenze avvengano staticamente. Per capire perché, fai riferimento all'[eccellente articolo di Dustin Ingram sulla risoluzione delle dipendenze in Python](https://dustingram.com/articles/2018/03/05/why-pypi-doesnt-know-dependencies/).
Pertanto: **non devi** dare per scontato che `pip-audit` ti **difenda** da pacchetti malevoli. In particolare, è **sbagliato** considerare `pip-audit -r INPUT` come una variante "più sicura" di `pip-audit`. A tutti gli effetti, `pip-audit -r INPUT` è funzionalmente equivalente a `pip install -r INPUT`, con una piccola dose di **isolamento non di sicurezza** per evitare conflitti con i tuoi ambienti locali.
`pip-audit` è prima di tutto uno strumento di controllo per pacchetti *Python*. **Non devi** presumere che `pip-audit` rilevi o segnali vulnerabilità "transitive" che potrebbero essere esposte attraverso pacchetti Python, ma non fanno effettivamente parte del pacchetto stesso. Ad esempio, è improbabile che le fonti di informazioni sulle vulnerabilità di `pip-audit` includano un avviso per una libreria condivisa vulnerabile che un popolare pacchetto Python *potrebbe* utilizzare, poiché la versione del pacchetto Python non è fortemente collegata alla versione della libreria condivisa.
## Licenza
`pip-audit` è concesso in licenza secondo la licenza Apache 2.0.
`pip-audit` riutilizza e modifica esempi da [`resolvelib`](https://github.com/sarugaku/resolvelib), che è concesso in licenza secondo la licenza ISC.
## Contributi
Vedi [la documentazione per contribuire](https://github.com/pypa/pip-audit/blob/main/CONTRIBUTING.md) per i dettagli.
## Codice di Condotta
Chiunque interagisca con questo progetto è tenuto a seguire il [Codice di Condotta della PSF](https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md).