ghsa-cli
CLI for efficiently coordinating vulnerability reports and remediations with GitHub Security Advisories (GHSA).
Install from PyPI (python -m pip install ghsa-cli) and
authenticate using a GH_TOKEN environment variable within the shell
session with a GitHub personal access token. Repository automatically
resolves to the upstream/origin remote of the current working directory
git repository or can be set manually via GH_REPO or --repo.
Below are some common workflows this tool is designed for:
Assigning yourself as 'Coordinator' for a ticket
Assign yourself as a coordinator. The alias me works for
options specified via the command line to mean the
currently authenticated user.
ghsa-cli credit GHSA-xxxx-xxxx-xxxx --coordinator me
Adding collaborators by name
Adds collaborators by name, either teams or individual users.
ghsa-cli collaborators GHSA-xxxx-xxxx-xxxx --login sethmlarson
ghsa-cli collaborators GHSA-xxxx-xxxx-xxxx --team python/fuzzers
Moving a GHSA to a public GitHub issue
Prompts the user with a new GitHub issue templated with the same title and description as the current ticket. By default, closes the GHSA if the GHSA isn't already closed.
ghsa-cli move-to-issue GHSA-xxxx-xxxx-xxxx
You can skip closing the GHSA after the issue templating page is
opened by passing --no-close.
Listing open GHSAs where you are assigned 'Coordinator'
Useful for prioritizing which ticket you should work on next depending on their state, age, and whether a fix has been developed and reviewed.
ghsa-cli list --coordinator me
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━┳━━━━━━┓
┃ id ┃ title ┃ state ┃ age ┃ cvss ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━╇━━━━━━┩
│ GHSA-xxxx-xxxx-xxxx │ ... │ triage │ 10d │ 6.5 │
│ GHSA-xxxx-xxxx-xxxx │ ... │ draft │ 16d │ 7.0 │
│ GHSA-xxxx-xxxx-xxxx │ ... │ draft │ 21d │ 2.0 │
│ GHSA-xxxx-xxxx-xxxx │ ... │ draft │ 60d │ 2.0 │
└─────────────────────┴───────┴────────┴──────┴──────┘
Prioritizing reports based on CVSS or age
ghsa-cli list --sort cvss age
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━┳━━━━━━┳━━━━━━┓
┃ id ┃ title ┃ state ┃ age ┃ cvss ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━╇━━━━━━╇━━━━━━┩
│ GHSA-xxxx-xxxx-xxxx │ ... │ draft │ 16d │ 7.0 │
│ GHSA-xxxx-xxxx-xxxx │ ... │ triage │ 10d │ 6.5 │
│ GHSA-xxxx-xxxx-xxxx │ ... │ draft │ 60d │ 2.0 │
│ GHSA-xxxx-xxxx-xxxx │ ... │ draft │ 21d │ 2.0 │
└─────────────────────┴───────┴────────┴──────┴──────┘
Searching for reports based on text
Use the search command and supply text to
search through advisory titles and descriptions.
ghsa-cli search crlf
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ id ┃ state ┃ title ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ GHSA-xxxx-xxxx-xxxx │ closed │ IMAP Protocol Command Injection (CRLF) in imaplib │
│ GHSA-xxxx-xxxx-xxxx │ closed │ POP3 Protocol Command Injection (CRLF) in poplib │
└─────────────────────┴────────┴───────────────────────────────────────────────────┘
Creating reports and integrating with CVE APIs
CVE APIs require a CVE Services API key. Set
the CVE_USERNAME, CVE_CNA, and CVE_API_KEY
environment variables to access properties about CVE
IDs and records.
Use the --columns parameter with list to add
additional columns to the report.
ghsa-cli list --state triage draft closed --columns id state cve_id cve_state
┏━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ id ┃ state ┃ cve_id ┃ cve_state ┃
┡━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ GHSA-xxxx-xxxx-xxxx │ triage │ │ │
│ GHSA-xxxx-xxxx-xxxx │ closed │ CVE-YYY-YYYY │ published │
│ GHSA-xxxx-xxxx-xxxx │ draft │ CVE-YYY-YYYY │ reserved │
└─────────────────────┴────────┴────────────────┴───────────┘
Creating a template CVE Record from a GHSA
The command cve-record will create a template
CVE record from the information available in a GHSA
for use with a program like Vulnogram. This makes
creating a CVE record quick and transfers information
like credits and CVSS automatically.
ghsa-cli cve-record GHSA-xxxx-yyyy-zzzz
{
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"cveMetadata": {
"cveId": "CVE-YYYY-XXXX",
"state": "PUBLISHED"
},
"containers": {
"cna": {
"title": "...",
"affected": [
{
"vendor": "Python Software Foundation",
"product": "CPython",
"repo": "https://github.com/python/cpython",
"defaultStatus": "unaffected",
"versions": [
{
"versionType": "python",
"version": "0"
}
],
"modules": []
}
]
...
Metadata
Release files for ghsa-cli 2026.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ghsa_cli-2026.5.1.tar.gz | 11.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ghsa_cli-2026.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.2 kB
Release files / ghsa_cli-2026.5.1.tar.gz
| Download URL | ghsa_cli-2026.5.1.tar.gz |
|---|---|
| Size | 11.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
ec52bf1f766f728ab8b3c7c328e45e0b627bb5509cf33fecca9eaf0cc4f26b9d
|
|
BLAKE2b-256 checksum How to use checksums |
5a2f2e1b5dd349eb7c2550b9db0de4733c9026446e583ee269c3b2721322f45a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 1, 2026.
Transparency logRelease files / ghsa_cli-2026.5.1-py3-none-any.whl
| Download URL | ghsa_cli-2026.5.1-py3-none-any.whl |
|---|---|
| Size | 11.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c1384dd6d4f93f1e84e73b08f6c552adcf752628b3287a3d06ed3107473639c3
|
|
BLAKE2b-256 checksum How to use checksums |
20e5d0d1610f783ee712c7c66433e6cf30f15d2ceadb1a16c8722cf03069f7af
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on May 1, 2026.
Transparency log