Inside CVE-2026-73800: How a Penti Researcher Helped Uncover a Secret-Stealing Flaw in Gitea Actions
Pentesting
...
Cybersecurity
...

Inside CVE-2026-73800: How a Penti Researcher Helped Uncover a Secret-Stealing Flaw in Gitea Actions

[
14 Aug 2026
]
By
Cariel Cohen

Every serious vulnerability starts as a hunch. For our researcher chakradhar1228, this one began with a question offensive security people ask about any CI/CD system: what happens when untrusted code from a stranger's fork gets to run against a repository that holds real secrets? Chasing that thread through Gitea, the popular self-hosted Git service, led to CVE-2026-73800, a high-severity flaw that lets a single pull request walk out the door with a repository's, and even an organization's, CI/CD secrets. It was reported responsibly and fixed in Gitea 1.27.2. Here is how the story unfolds.

At a glance

  • CVE: CVE-2026-73800 (GHSA-r9ch-mqjm-g67v)
  • Title: Secret Exfiltration via Reusable Workflow Resolution in pull_request_target Events
  • Severity: High (CVSS 8.8, vector CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
  • Weakness: CWE-94 (Code Injection) and CWE-829 (Inclusion of Functionality from an Untrusted Control Sphere)
  • Affected: Gitea >= 1.19.0
  • Fixed in: Gitea 1.27.2

The setup: a trigger built for trust

To understand the bug, you have to understand the stage it plays out on. Gitea Actions, Gitea's built-in CI/CD engine, mirrors GitHub Actions, including a special trigger called pull_request_target. Most triggers treat a fork's code as suspect. This one is different: it runs in the context of the base repository, which means it can reach that repository's secrets even when the pull request came from a fork owned by someone you have never met. It is a powerful, deliberately trusting mechanism, and platforms guard it carefully by running it against the base branch rather than whatever a contributor pushed to their fork.

The twist: one place the guard forgot to look

Gitea did most of the guarding correctly. When a pull_request_target run starts, it overrides github.sha and github.ref so everything evaluates against the trusted base branch commit, not the fork. On the surface, everything looked locked down. The twist chakradhar1228 found was a single blind spot: that same override was never applied when Gitea went to resolve a local reusable workflow.

So a workflow that pulled in a helper with a local path like uses: ./.gitea/workflows/build.yaml quietly fetched that helper from the fork's HEAD commit, the attacker's code, instead of the base branch. The main workflow was trusted. The reusable workflow it called in was not. And because it all executed inside the privileged pull_request_target context, an attacker could write whatever steps they liked into that helper and watch them run with full access to repository and organization secrets. Reading those secrets and mailing them to an endpoint of the attacker's choosing is the easy part.

Why the ending matters

CI/CD secrets are the crown jewels of a modern software supply chain. One leaked deployment token, cloud credential, or signing key can turn a throwaway pull request into full control of production. That is what makes CVE-2026-73800 so uncomfortable: with a CVSS score of 8.8 and an attack that needs nothing more than the ability to open a pull request, the barrier to entry is almost zero. And it is precisely the kind of flaw automated scanners walk right past, because it does not live in a suspicious string. It lives in the logic of how trusted and untrusted code are told apart.

Are you in this story?

If you run a self-hosted Gitea instance on 1.19.0 or later with Actions turned on, you may be exposed, especially if you use pull_request_target workflows that call local reusable workflows and you accept pull requests from forks.

How it ends well

The happy ending ships in Gitea 1.27.2, which makes reusable workflow sources for pull_request_target runs resolve from the base branch commit, closing the gap. To get there safely:

  • Upgrade to Gitea 1.27.2 or later. This is the complete fix.
  • As an interim mitigation, avoid pull_request_target workflows that call local (./) reusable workflows.
  • Restrict the secrets available to workflows triggered by fork pull requests, and review who can open PRs against sensitive repositories.
  • Audit your Actions history for unexpected reusable-workflow executions on fork pull requests.

The takeaway

This vulnerability was disclosed responsibly to the Gitea security team and patched before it ever became public, and Penti's chakradhar1228 is among the credited reporters. You can read the official advisory here: GHSA-r9ch-mqjm-g67v.

The moral of the story is the one offensive researchers keep relearning: the vulnerabilities that hurt the most rarely announce themselves. They hide in the seams, in trust boundaries, context overrides, and the quiet assumptions between systems, where pattern-matching tools have nothing to say. That is exactly where Penti's agentic pentesting, backed by human validation, goes looking.

/ book a demo
[  14 /  15  ]

Find the logic flaws scanners miss

Penti runs agentic penetration tests with human validation, in hours instead of months, so trust-boundary bugs like this one surface before an attacker finds them.

/ q&a
[  15 /  15  ]

FAQ

[  01  ]

What is CVE-2026-73800?

CVE-2026-73800 is a high-severity (CVSS 8.8) vulnerability in Gitea Actions. It lets an attacker who can open a pull request from a fork exfiltrate a repository's and even an organization's CI/CD secrets by abusing how local reusable workflows are resolved during pull_request_target events. It affects Gitea 1.19.0 and later and is fixed in 1.27.2.

[  02  ]

Which Gitea versions are affected?

All Gitea releases from 1.19.0 up to (but not including) 1.27.2 that have Actions enabled. Upgrading to Gitea 1.27.2 or later fully remediates the issue.

[  03  ]

How do I fix CVE-2026-73800?

Upgrade to Gitea 1.27.2. Until you can, avoid pull_request_target workflows that call local (./) reusable workflows, and restrict the secrets exposed to workflows triggered by fork pull requests.

[  04  ]

Who discovered CVE-2026-73800?

It was responsibly disclosed to the Gitea security team by several researchers, including Penti's chakradhar1228, and was patched before public disclosure.