Safety checks your installed dependencies for known security vulnerabilities.
100K+
Safety checks your installed dependencies for known security vulnerabilities.
By default it uses the open Python vulnerability database Safety DB,
but can be upgraded to use pyup.io's Safety API using the --key option.
Install safety with pip. Keep in mind that we support only Python 3.5 and up.
Look at Python 2.7 section at the end of this document.
pip install safety
To check your currently selected virtual environment for dependencies with known security vulnerabilites, run:
safety check
You should get a report similar to this:
+==============================================================================+
| |
| /$$$$$$ /$$ |
| /$$__ $$ | $$ |
| /$$$$$$$ /$$$$$$ | $$ \__//$$$$$$ /$$$$$$ /$$ /$$ |
| /$$_____/ |____ $$| $$$$ /$$__ $$|_ $$_/ | $$ | $$ |
| | $$$$$$ /$$$$$$$| $$_/ | $$$$$$$$ | $$ | $$ | $$ |
| \____ $$ /$$__ $$| $$ | $$_____/ | $$ /$$| $$ | $$ |
| /$$$$$$$/| $$$$$$$| $$ | $$$$$$$ | $$$$/| $$$$$$$ |
| |_______/ \_______/|__/ \_______/ \___/ \____ $$ |
| /$$ | $$ |
| | $$$$$$/ |
| by pyup.io \______/ |
| |
+==============================================================================+
| REPORT |
+==============================================================================+
| No known security vulnerabilities found. |
+==============================================================================+
Now, let's install something insecure:
pip install insecure-package
Yeah, you can really install that.
Run safety check again:
+==============================================================================+
| |
| /$$$$$$ /$$ |
| /$$__ $$ | $$ |
| /$$$$$$$ /$$$$$$ | $$ \__//$$$$$$ /$$$$$$ /$$ /$$ |
| /$$_____/ |____ $$| $$$$ /$$__ $$|_ $$_/ | $$ | $$ |
| | $$$$$$ /$$$$$$$| $$_/ | $$$$$$$$ | $$ | $$ | $$ |
| \____ $$ /$$__ $$| $$ | $$_____/ | $$ /$$| $$ | $$ |
| /$$$$$$$/| $$$$$$$| $$ | $$$$$$$ | $$$$/| $$$$$$$ |
| |_______/ \_______/|__/ \_______/ \___/ \____ $$ |
| /$$ | $$ |
| | $$$$$$/ |
| by pyup.io \______/ |
| |
+==============================================================================+
| REPORT |
+==========================+===============+===================+===============+
| package | installed | affected | source |
+==========================+===============+===================+===============+
| insecure-package | 0.1.0 | <0.2.0 | changelog |
+==========================+===============+===================+===============+
Just like pip, Safety is able to read local requirement files:
safety check -r requirements.txt
Safety is also able to read from stdin with the --stdin flag set.
To check a local requirements file, run:
cat requirements.txt | safety check --stdin
or the output of pip freeze:
pip freeze | safety check --stdin
or to check a single package:
echo "insecure-package==0.1" | safety check --stdin
For more examples, take a look at the options section.
To scan a docker image IMAGE_TAG, you can run
docker run -it --rm ${IMAGE_TAG} "/bin/bash -c \"pip install safety && safety check\"
Safety can be easily executed as Docker container. It can be used just as described in the examples section.
echo "insecure-package==0.1" | docker run -i --rm pyupio/safety safety check --stdin
cat requirements.txt | docker run -i --rm pyupio/safety safety check --stdin
The Safety binaries provide some extra security.
After installation, they can be used just like the regular command line version of Safety.
Safety works great in your CI pipeline. It returns a non-zero exit status if it finds a vulnerability.
Run it before or after your tests. If Safety finds something, your tests will fail.
Travis
install:
- pip install safety
script:
- safety check
Gitlab CI
safety:
script:
- pip install safety
- safety check
Tox
[tox]
envlist = py37
[testenv]
deps =
safety
pytest
commands =
safety check
pytest
Deep GitHub Integration
If you are looking for a deep integration with your GitHub repositories: Safety is available as a part of pyup.io, called Safety CI. Safety CI checks your commits and pull requests for dependencies with known security vulnerabilities and displays a status on GitHub.

Safety is free and open source (MIT Licensed). The underlying open vulnerability database is updated once per month.
To get access to all vulnerabilites as soon as they are added, you need a Safety API key that comes with a paid pyup.io account, starting at $99.
--keyAPI Key for pyup.io's vulnerability database. Can be set as SAFETY_API_KEY environment variable.
Example
safety check --key=12345-ABCDEFGH
--dbPath to a directory with a local vulnerability database including insecure.json and insecure_full.json
Example
safety check --db=/home/safety-db/data
--proxy-hostProxy host IP or DNS
--proxy-portProxy port number
--proxy-protocolProxy protocol (https or http)
--jsonOutput vulnerabilities in JSON format.
Example
safety check --json
[
[
"django",
"<1.2.2",
"1.2",
"Cross-site scripting (XSS) vulnerability in Django 1.2.x before 1.2.2 allows remote attackers to inject arbitrary web script or HTML via a csrfmiddlewaretoken (aka csrf_token) cookie.",
"25701"
]
]
--full-reportFull reports includes a security advisory. It also shows CVSS values for CVEs (requires a premium PyUp subscription).
Example
safety check --full-report
+==============================================================================+
| |
| /$$$$$$ /$$ |
| /$$__ $$ | $$ |
| /$$$$$$$ /$$$$$$ | $$ \__//$$$$$$ /$$$$$$ /$$ /$$ |
| /$$_____/ |____ $$| $$$$ /$$__ $$|_ $$_/ | $$ | $$ |
| | $$$$$$ /$$$$$$$| $$_/ | $$$$$$$$ | $$ | $$ | $$ |
| \____ $$ /$$__ $$| $$ | $$_____/ | $$ /$$| $$ | $$ |
| /$$$$$$$/| $$$$$$$| $$ | $$$$$$$ | $$$$/| $$$$$$$ |
| |_______/ \_______/|__/ \_______/ \___/ \____ $$ |
| /$$ | $$ |
| | $$$$$$/ |
| by pyup.io \______/ |
| |
+==============================================================================+
| REPORT |
+============================+===========+==========================+==========+
| package | installed | affected | ID |
+============================+===========+==========================+==========+
| CVSS v2 | BASE SCORE: 6.5 | IMPACT SCORE: 6.4 |
+============================+===========+==========================+==========+
| django | 1.2 | <1.2.2 | 25701 |
+==============================================================================+
| Cross-site scripting (XSS) vulnerability in Django 1.2.x before 1.2.2 allows |
| remote attackers to inject arbitrary web script or HTML via a csrfmiddlewar |
| etoken (aka csrf_token) cookie. |
+==============================================================================+
--bareOutput vulnerable packages only. Useful in combination with other tools.
Example
safety check --bare
cryptography django
--cacheCache requests to the vulnerability database locally for 2 hours.
Example
safety check --cache
--stdinRead input from stdin.
Example
cat requirements.txt | safety check --stdin
pip freeze | safety check --stdin
echo "insecure-package==0.1" | safety check --stdin
--file, -rRead input from one (or multiple) requirement files.
Example
safety check -r requirements.txt
safety check --file=requirements.txt
safety check -r req_dev.txt -r req_prod.txt
--ignore, -iIgnore one (or multiple) vulnerabilities by ID
Example
safety check -i 1234
safety check --ignore=1234
safety check -i 1234 -i 4567 -i 89101
--output, -oSave the report to a file
Example
safety check -o insecure_report.txt
safety check --output --json insecure_report.json
If you save the report in JSON format you can review in the report format again.
--file, -f (REQUIRED)Read an insecure report.
Example
safety review -f insecure.json
safety review --file=insecure.json
--full-reportFull reports include a security advisory (if available).
Example
safety review -r insecure.json --full-report
+==============================================================================+
| |
| /$$$$$$ /$$ |
| /$$__ $$ | $$ |
| /$$$$$$$ /$$$$$$ | $$ \__//$$$$$$ /$$$$$$ /$$ /$$ |
| /$$_____/ |____ $$| $$$$ /$$__ $$|_ $$_/ | $$ | $$ |
| | $$$$$$ /$$$$$$$| $$_/ | $$$$$$$$ | $$ | $$ | $$ |
| \____ $$ /$$__ $$| $$ | $$_____/ | $$ /$$| $$ | $$ |
| /$$$$$$$/| $$$$$$$| $$ | $$$$$$$ | $$$$/| $$$$$$$ |
| |_______/ \_______/|__/ \_______/ \___/ \____ $$ |
| /$$ | $$ |
| | $$$$$$/ |
| by pyup.io \______/ |
| |
+==============================================================================+
| REPORT |
+============================+===========+==========================+==========+
| package | installed | affected | ID |
+============================+===========+==========================+==========+
| django | 1.2 | <1.2.2 | 25701 |
+==============================================================================+
| Cross-site scripting (XSS) vulnerability in Django 1.2.x before 1.2.2 allows |
| remote attackers to inject arbitrary web script or HTML via a csrfmiddlewar |
| etoken (aka csrf_token) cookie. |
+==============================================================================+
--bareOutput vulnerable packages only.
Example
safety review --file report.json --bare
django
Display packages licenses information (requires a premium PyUp subscription).
--key (REQUIRED)API Key for pyup.io's licenses database. Can be set as SAFETY_API_KEY environment variable.
Example
safety license --key=12345-ABCDEFGH
Shows the license of each package in the current environment
+==============================================================================+
| |
| /$$$$$$ /$$ |
| /$$__ $$ | $$ |
| /$$$$$$$ /$$$$$$ | $$ \__//$$$$$$ /$$$$$$ /$$ /$$ |
| /$$_____/ |____ $$| $$$$ /$$__ $$|_ $$_/ | $$ | $$ |
| | $$$$$$ /$$$$$$$| $$_/ | $$$$$$$$ | $$ | $$ | $$ |
| \____ $$ /$$__ $$| $$ | $$_____/ | $$ /$$| $$ | $$ |
| /$$$$$$$/| $$$$$$$| $$ | $$$$$$$ | $$$$/| $$$$$$$ |
| |_______/ \_______/|__/ \_______/ \___/ \____ $$ |
| /$$ | $$ |
| | $$$$$$/ |
| by pyup.io \______/ |
| |
+==============================================================================+
| Packages licenses |
+=============================================+===========+====================+
| package | version | license |
+=============================================+===========+====================+
| requests | 2.25.0 | Apache-2.0 |
|------------------------------------------------------------------------------|
| click | 7.1.2 | BSD-3-Clause |
|------------------------------------------------------------------------------|
| safety | 1.10.0 | MIT |
+==============================================================================+
--json (Optional)This license command can also be used in conjuction with optional arguments --bare and --json for structured, parsable outputs that can be fed into other tools and pipelines.
--dbPath to a directory with a local licenses database licenses.json
Example
safety license --key=12345-ABCDEFGH --db=/home/safety-db/data
--no-cacheSince PyUp.io licenses DB is updated once a week, the licenses database is cached locally for 7 days. You can use --no-cache to download it once again.
Example
safety license --key=12345-ABCDEFGH --no-cache
--file, -rRead input from one (or multiple) requirement files.
Example
safety license --key=12345-ABCDEFGH -r requirements.txt
safety license --key=12345-ABCDEFGH --file=requirements.txt
safety license --key=12345-ABCDEFGH -r req_dev.txt -r req_prod.txt
--proxy-host, -phProxy host IP or DNS
--proxy-port, -ppProxy port number
--proxy-protocol, -prProxy protocol (https or http)
Example
safety license --key=12345-ABCDEFGH -ph 127.0.0.1 -pp 8080 -pr https
This tool requires latest Python patch versions starting with version 3.5. We did support Python 2.7 in the past but, as for other Python 3.x minor versions, it reached its End-Of-Life and as such we are not able to support it anymore.
We understand you might still have Python 2.7 projects running. At the same time, Safety itself has a commitment to encourage developers to keep their software up-to-date, and it would not make sense for us to work with officially unsupported Python versions, or even those that reached their end of life.
If you still need to run Safety from a Python 2.7 environment, please use version 1.8.7 available at PyPi. Alternatively, you can run Safety from a Python 3 environment to check the requirements file for your Python 2.7 project.
Content type
Image
Digest
Size
45.7 MB
Last updated
over 5 years ago
docker pull pyupio/safety