// threat brief

GitHub CLI token leak: gh attestation and gh release verify could send your token to TUF and artifact hosts

CVSS
9.1 CRITICAL
CISA KEV
Not listed
Weakness
CWE-863

PlainCVE Team · Published 2026-09-24 · AI-assisted · Press brief ↓

Human review 2026-09-24Command tests: none yetReproduced: not yetVerification record ↓

GitHub CLI before 2.93.0 could attach your GitHub login token to requests to TUF and artifact hosts during three verification commands.

Who is affectedAnyone using GitHub CLI (gh) before 2.93.0 with authentication set up (or an enterprise token environment variable set) who ran gh attestation, gh release verify or gh release verify-asset, including in CI.
What happensThe token went to hosts that should never have received it. Anyone holding the token could use the permissions that token was granted, depending on its type and scopes. GitHub says there is no evidence tokens were logged, retained or accessed by unauthorised parties.
What to do nowUpgrade gh to 2.93.0 or later, revoke the tokens and OAuth authorisation you used with GitHub CLI, then review your security log and audit logs.
View evidence(4)
  • Vendor / maintainerOfficial steps, in order: revoke tokens and the OAuth authorization used with GitHub CLI, upgrade gh to 2.93.0, then review security and audit logsRevoke authentication tokens used with the GitHub CLIgithub.com
  • Vendor / maintainerGitHub Docs: the security log lists activity from the last 90 days, which you can use to look for suspicious token useThe security log lists all actions performed within the last 90 days.docs.github.com
  • Our assessmentUpgrading before logging in again or issuing new tokens is our own reminder, so a new token isn't leaked again by an old version; the official order is revoke, upgrade, review logs
  • Our assessmentSetting the enterprise token only where it is needed is our own suggestion
Affected versionsVersions before 2.93.0 (github.com/cli/cli/v2 ≤ 2.92.0)
View evidence(4)
  • Vendor / maintainerGitHub CLI advisory: for authenticated github.com users who ran the three verify commands, the token went to tuf-repo.github.com, and all authentication types are affectedAll authentication types are affected.github.com
  • Vendor / maintainerSame advisory: with an enterprise token set, running these commands sent it to sigstore.dev and Azure Blob Storage hosts, which GitHub does not operateThese hosts are not operated by GitHub.github.com
  • CVE recordCVE record: versions before 2.93.0 are affected"version":"< 2.93.0"cveawg.mitre.org
  • Vulnerability databaseThe Go vulnerability database lists the old module path github.com/cli/cli (without v2) as all versions with no fix; the entry is auto-generated and unreviewed, and the real fix is in the v2 module at 2.93.0all versions, no known fixedpkg.go.dev
Fixed versions2.93.0 or later
View evidence(3)
  • Vendor / maintainerGitHub CLI 2.93.0 release notes: the issue is fixed; update to v2.93.0 as soon as possibleUsers are advised to update `gh` to version `v2.93.0` as soon as possible.api.github.com
  • CVE recordCVE record: fixed in 2.93.0This vulnerability is fixed in 2.93.0.cveawg.mitre.org
  • Vulnerability databaseNVD's CPE configuration: the affected range ends before 2.93.0"versionEndExcluding":"2.93.0"services.nvd.nist.gov
CVSS vector
Show full vectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N
Timeline
  • First public 2026-05-27
CISA KEVNot listed(Not being in KEV does not mean it has not been exploited)
View evidence(3)
  • Our assessmentOur 2026-09-24 CISA KEV snapshot does not list this CVE; not being listed does not mean it has not been exploited
  • CERT / governmentCISA's SSVC assessment in the CVE record says Exploitation: none"Exploitation":"none"cveawg.mitre.org
  • Vendor / maintainerGitHub says it has no evidence that tokens were logged, retained or accessed by unauthorized partiesWe have no evidence that tokens were logged, retained, or accessed by unauthorized parties.github.com

Blue team playbook

Check, fix / mitigate, respond, harden. Matching the affected versions does not mean you were compromised, and a check that finds nothing does not prove you are safe; each item says what it can and cannot show. Tagged steps point to where the attack flow below can be stopped.

DETECTCheckAm I affected? Any signs of compromise?
  1. 01Check your gh version

    Anything below 2.93.0 is in the affected range. Check CI images as well as developer machines.

    Read-only check
    gh --version
  2. 02Check whether the exposure conditions applied

    If you ran one of the three verification commands while logged in, you may be affected; if an enterprise token variable was also set, that token may have reached hosts outside GitHub. This check is PlainCVE's reading of the advisory's conditions, not an official procedure. The command below prints only variable names, never the token value.

    Read-only check
    env | grep -oE '^(GH|GITHUB)_ENTERPRISE_TOKEN'
  3. 03Review your security log

    In GitHub, go to Settings → Archives → Security log to see the last 90 days, including OAuth and personal access token events; it can be filtered and exported. Organizations and enterprises should also check audit logs.

MITIGATEFix / mitigatePatch; block it if you cannot patch yet
  1. 01Upgrade to 2.93.0 or later

    Update gh the same way you installed it (package manager, official installer or Go module), then confirm the version. No workaround without upgrading has been published.

    Read-only check
    gh --version
RESPONDRespondIf you find signs of compromise
  1. 01Revoke tokens used with GitHub CLI

    The advisory recommends revoking personal access tokens and the GitHub CLI OAuth app authorisation; revoke enterprise tokens too if you had them set. This is a precaution; GitHub says there is no evidence tokens were accessed.

  2. 02Widen the investigation if you find suspicious activity

    If the security or audit logs show token use you don't recognise, treat it as an account compromise and check the repositories and settings that token could reach.

HARDENHardenPrevent the next one
  1. 01Set enterprise tokens only when needed

    The worst case here was the enterprise token being used as the fallback for unknown hosts. Avoid keeping it set in environments that don't need it, such as CI jobs that only verify public artifacts. This is PlainCVE's suggestion.

  2. 02Give tokens the least privilege

    A leaked token grants whatever access it carries, so the narrower its scope, the smaller the damage.

Full remediation steps and notes
VersionStatus
≤ 2.92.0 (github.com/cli/cli/v2)Affected
2.93.0 or laterFixed
  1. Order matters. Upgrade first, then log in again or switch to new tokens. If you replace the token but run these verification commands again on an old version, the new token could be sent out the same way. This is PlainCVE’s note; the advisory lists the steps as revoke, upgrade, review logs.
  2. Revoking the OAuth authorisation logs you out. After you revoke the GitHub CLI OAuth app authorisation, gh loses its login and you’ll need to log in again.
  3. Don’t forget CI. If these token variables were set in CI, update both the gh version CI uses and the stored secrets.
  4. No workaround. No way to avoid the issue without upgrading has been published.

Attack flow

Read left to right: this is the order the attack happens in. A blue shield means the step can be stopped; the earlier, the better. Click an icon for details.

GitHub CLI token leak: gh attestation and gh release verify could send your token to TUF and artifact hosts: 1. A user or CI job runs a verification command → 2. The shared HTTP client picks a token by hostname → 3. The github.com token is sent to tuf-repo.github.com → 4. The enterprise token is sent to hosts outside GitHub → 5. If someone obtained a token, they could act with your accessCVE-2026-48501 · GitHub CLI token leak: gh attestation and gh release verify could send your token to TUF andartifact hostsAttackerYour systemExternalA user or CI job runs a verification command — gh attestation, gh release verify or gh release verify-asset runs while gh is logged in, or while GH_ENTERPRISE_TOKEN / GITHUB_ENTERPRISE_TOKEN is set. 1A user or CI jobruns averificationcommandThe shared HTTP client picks a token by hostname — Older versions treated every *.github.com subdomain as github.com, and for hosts they did not recognise, fell back to the enterprise token if one was set. 2The shared HTTPclient picks atoken by hostnameThe github.com token is sent to tuf-repo.github.com — This is a GitHub Pages site, not a GitHub API server; it never needed the token. 3The github.comtoken is sent totuf-repo.github.comThe enterprise token is sent to hosts outside GitHub — For users with an enterprise token set, it went to tuf-repo-cdn.sigstore.dev and tmaproduction.blob.core.windows.net (Azure Blob Storage).4The enterprisetoken is sent tohosts outsideGitHubIf someone obtained a token, they could act with your access — This is a risk scenario, not something known to have happened: GitHub says there is no evidence tokens were logged, retained or accessed by unauthorised parties. 5If someoneobtained a token,they could actwith your accessAttack pathCan be stopped herePlainCVE · plaincve.date/en/vulns/cve-2026-48501-github-cli-token-leak · CC BY 4.0
Free to use in reporting and teaching under CC BY 4.0. Attribution is already on the image.
  1. Your system

    A user or CI job runs a verification command

    gh attestation, gh release verify or gh release verify-asset runs while gh is logged in, or while GH_ENTERPRISE_TOKEN / GITHUB_ENTERPRISE_TOKEN is set.

    Defense: Upgrade to 2.93.0 or later before running these commands.

  2. Your system

    The shared HTTP client picks a token by hostname

    Older versions treated every *.github.com subdomain as github.com, and for hosts they did not recognise, fell back to the enterprise token if one was set.

    Defense: 2.93.0 fixes how the token is attached.

  3. External

    The github.com token is sent to tuf-repo.github.com

    This is a GitHub Pages site, not a GitHub API server; it never needed the token.

    Defense: Revoke personal access tokens and the OAuth authorisation used with gh.

  4. External

    The enterprise token is sent to hosts outside GitHub

    For users with an enterprise token set, it went to tuf-repo-cdn.sigstore.dev and tmaproduction.blob.core.windows.net (Azure Blob Storage).

    Defense: Revoke the enterprise token; don't keep it set in the environment unless needed.

  5. Attacker

    If someone obtained a token, they could act with your access

    This is a risk scenario, not something known to have happened: GitHub says there is no evidence tokens were logged, retained or accessed by unauthorised parties.

    Defense: Look for suspicious token activity in your security log and audit logs.

Who is affected

GitHub CLI (gh) is GitHub’s official command-line tool. The affected commands are three “verification” commands: gh attestation, gh release verify and gh release verify-asset. They check where a file or release was built and whether it has been changed.

ConditionWhere the token was sentAffected?
gh before 2.93.0 + logged in to github.com + ran one of these commandstuf-repo.github.com (a GitHub Pages site, not an API server)Affected
gh before 2.93.0 + GH_ENTERPRISE_TOKEN or GITHUB_ENTERPRISE_TOKEN set + ran one of these commandstuf-repo-cdn.sigstore.dev and tmaproduction.blob.core.windows.net (Azure Blob Storage), both outside GitHubAffected
gh before 2.93.0, but never ran these three commandsNowhereNot affected under the conditions the advisory describes
gh 2.93.0 or laterNowhereFixed

A “token” is a string that stands in for your identity: a program holding it can access GitHub with your permissions. GH_ENTERPRISE_TOKEN / GITHUB_ENTERPRISE_TOKEN hold the token for GitHub Enterprise Server; GH_TOKEN / GITHUB_TOKEN are for github.com.

In CI (continuous integration, the automated pipelines that build and verify code), tokens are often stored in environment variables, and these verification commands may run there too. That is PlainCVE’s inference; the sources don’t state it directly.

How it works

To verify, these commands download TUF data (The Update Framework, which gh uses to fetch the signing metadata it should trust) and artifact data. They download it through gh’s shared HTTP client, which has an authentication layer that automatically adds a token to outgoing requests.

The problem was in how it chose which token to attach:

  • When normalising hostnames, the code treated every *.github.com subdomain as github.com, so tuf-repo.github.com received the github.com token.
  • For hosts it didn’t recognise, it fell back to the enterprise token if one was set, so that token went to the sigstore.dev and Azure hosts.

This maps to CWE-863 (Incorrect Authorization). That CWE comes from GitHub; NVD lists none of its own.

The flawed approach (conceptual illustration, not the original source code):

Show code example(go)
// Attach the github.com token if the host "looks like" GitHub, otherwise the enterprise token
func tokenFor(host string) string {
    if strings.HasSuffix(host, ".github.com") || host == "github.com" {
        return githubToken
    }
    return enterpriseToken // unknown hosts get a token too
}

The fixed approach:

Show code example(go)
// Attach a token only to an exact list of API hosts; third-party downloads get none
func tokenFor(host string) string {
    if isKnownAPIHost(host) { // exact-match list
        return tokenForHost(host)
    }
    return ""
}

GitHub says there is no evidence tokens were logged, retained or accessed by unauthorised parties. The advisory notes, however, that anyone who did obtain one of these tokens could use the permissions that token was granted, which, depending on the token’s type and permissions, could include private repositories, organization resources or enterprise administration. That is why it still recommends revoking them. For github.com users, the advisory says all authentication types are affected.

Timeline

DateEvent
UnknownWhen the bug was introduced and when it was reported have not been disclosed
2026-05-27v2.93.0 released; GitHub security advisory published
2026-05-29CVE published; NVD listed it the same day
2026-06-25Go Vulnerability Database publishes GO-2026-5271
2026-07-21NVD analysis last modified
2026-07-30GitHub advisory last updated

Further reading

  • Scoring differences: NVD rates it CVSS 3.1 9.1 (Critical) and GitHub (the CNA) rates it 7.4 (High). The only difference is attack complexity: NVD says Low, GitHub says High. This page uses the NVD score; some third-party sites, such as Strix, also show 9.1.
  • Exploitation status: This CVE is not in CISA’s Known Exploited Vulnerabilities (KEV) catalog, and CISA’s SSVC assessment says “Exploitation: none”. EPSS was 0.289% at the time of research.
  • Go Vulnerability Database: The old module path github.com/cli/cli (without v2) is listed as “all versions, no fix available”. That is an automatically generated, unreviewed entry; the actual fix is in github.com/cli/cli/v2 2.93.0.
  • Not yet established: The sources don’t say which version introduced the bug or which commit or PR fixed it.
  • Supply-chain angle: The bug sits in the very tools meant to protect the software supply chain (Sigstore, TUF, attestations).
  • Related weakness type: CWE-863.

Verification Reviewed and checked against sources; not yet reproduced in our lab

Reviewed2026-09-24

Verification records describe the environment and the result only, never reproduction steps or code that could attack other people’s systems. See our policy.

Sources

  1. AdvisoryIncorrect authorization header in API requests to TUF repository mirrors via gh attestation, gh release verify, and gh release verify-asset commands (GHSA-8xvp-7hj6-mcj9) · GitHub (cli/cli), 2026-05-27 · accessed 2026-09-23
  2. AdvisoryGitHub Advisory Database: GHSA-8xvp-7hj6-mcj9 · GitHub, 2026-05-27 · accessed 2026-09-23
  3. AdvisoryCVE-2026-48501 record (CVE Services API) · CVE Program / MITRE, 2026-05-29 · accessed 2026-09-23
  4. CVE / NVD / OSVNVD CVE API: CVE-2026-48501 · NIST NVD, 2026-05-29 · accessed 2026-09-23
  5. AdvisoryOSV: GHSA-8xvp-7hj6-mcj9 · OSV / Google, 2026-05-29 · accessed 2026-09-23
  6. AdvisoryGO-2026-5271 · Go Vulnerability Database, 2026-06-25 · accessed 2026-09-23
  7. Patch / releaseGitHub CLI 2.93.0 release · GitHub (cli/cli), 2026-05-27 · accessed 2026-09-23
  8. Patch / releaseGitHub CLI 2.93.0 (release API metadata) · GitHub, 2026-05-27 · accessed 2026-09-23
  9. OtherCVE-2026-48501: Cli Incorrect Authorization (CVSS 9.1) · Strix · accessed 2026-09-23
  10. Vendorgh attestation verify · GitHub CLI manual · accessed 2026-09-23
  11. Vendorgh help environment · GitHub CLI manual · accessed 2026-09-23
  12. VendorReviewing your security log · GitHub Docs · accessed 2026-09-23
  13. VendorManaging your personal access tokens · GitHub Docs · accessed 2026-09-24

Press brief

In one sentence

GitHub CLI is GitHub's official command-line tool. Versions before 2.93.0 could send a user's GitHub login token to hosts that should never have received it, some outside GitHub, when running three commands used to verify where software came from. GitHub released the fixed version 2.93.0 on May 27, 2026, and says there is no evidence tokens were logged or accessed by unauthorised parties. The flaw is not listed in CISA's Known Exploited Vulnerabilities catalog.

Key facts

Severity (NVD)
CVSS 3.1 9.1 services.nvd.nist.gov
Severity (GitHub, CNA)
CVSS 3.1 7.4 github.com
Fixed version
2.93.0 (released 2026-05-27) api.github.com
CVE published
2026-05-29 cveawg.mitre.org
CISA SSVC assessment
Exploitation: none cveawg.mitre.org

Confirmed

  • Before 2.93.0, three GitHub CLI verification commands could attach the user's token in the authorization header of requests to TUF and artifact hosts.
  • github.com tokens went to tuf-repo.github.com; enterprise tokens went to hosts on sigstore.dev and Azure Blob Storage.
  • GitHub says there is no evidence tokens were logged, retained or accessed by unauthorised parties.

Unconfirmed / disputed

  • Scores differ: NVD rates it 9.1 and GitHub 7.4; the only difference is attack complexity.
  • Which version first introduced the bug has not been stated.
  • The fix commit or PR has not been publicly linked.

Quotable line

The tool meant to prove your software hadn't been tampered with was handing your keys to hosts that never asked for them.

Images

Download the share image (PNG) · Attack flow diagram (downloadable)

Please credit "PlainCVE" and link to this page. Full citation format is under "How to cite" below. Found a factual error? Report it.

How to cite this page

This article is CC BY 4.0. Please keep the attribution and link when republishing.

PlainCVE Team (2026). "GitHub CLI token leak: gh attestation and gh release verify could send your token to TUF and artifact hosts". PlainCVE. https://plaincve.date/en/vulns/cve-2026-48501-github-cli-token-leak (accessed YYYY-MM-DD)
BibTeX
@misc{cve202648501githubclitokenleak2026,
  title  = {GitHub CLI token leak: gh attestation and gh release verify could send your token to TUF and artifact hosts},
  author = {PlainCVE Team},
  year   = {2026},
  howpublished = {PlainCVE},
  url    = {https://plaincve.date/en/vulns/cve-2026-48501-github-cli-token-leak},
  note   = {Updated 2026-09-24}
}