Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessOpen fork pull request
-
DeliveryInject shared concurrency-group workflow
-
ExploitCancel blocked job via sibling run
-
ExecutionMaintainer approval reactivates cancelled job
-
ImpactFork code executes on runner
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V2 - Validation and Business Logic Workflow enforcement
|
| Exploitation Conditions | Requires all of: Gitea Actions enabled on the repository; a runner configured to accept that repository's jobs; the attacker able to open a fork pull request (so a low-privileged external account on an instance permitting fork contributions); a workflow that defines a shared run-level concurrency group so the fork run lands in an approval-gated, blocked state; and a second (sibling) run in the same concurrency group that cancels the blocked job, driving the run terminal while it is still marked as needing approval. The decisive limiting factor is that a maintainer with Actions write permission must subsequently approve the run - exploitation cannot complete without that human approval action - which, combined with the need to orchestrate the concurrency-group race and have an available accepting runner, substantially narrows realistic exploitation beyond what the raw 8.8 score implies. |
| Impact | Signals point in different directions. CVSS is 8.8 (AV:N/AC:L/PR:L/UI:N/S:U with C:H/I:H/A:H), which on its face suggests an easily exploitable network RCE, but every other source tempers that: EPSS is only 0.16% (4th percentile), CISA SSVC rates Exploitation as 'none' and Automatable as 'no' (while Technical Impact is 'total'), the CVE is not in CISA KEV, and no public exploit was identified at time of analysis. The description also conflicts with the published vector on two points: it states exploitation requires the maintainer's later approval action, yet the vector encodes UI:N (no user interaction); and the attack depends on orchestrating a concurrency-group race (a sibling run cancelling the blocked job) rather than a single low-complexity request, which argues for higher attack complexity than AC:L - verify these with the vendor advisory. Taken together this is a genuine but conditional RCE, not a drive-by: the total-impact code execution on a runner makes it worth patching, but the low EPSS, 'none' exploitation status, absence of KEV/POC, and the dependency on a privileged maintainer approval place it as an important-but-not-emergency fix, most relevant to instances that enable Actions, accept fork pull requests, and use approval gating. |
| Exploit ScenarioDerived | On a Gitea instance with Actions enabled and fork PRs allowed, an attacker opens a fork pull request containing a workflow that shares a run-level concurrency group, producing a run gated behind maintainer approval. The attacker triggers a later run in the same concurrency group so it cancels the still-blocked job, leaving the run terminal yet marked as needing approval; when a maintainer later clicks approve, the already-cancelled fork job is pushed back through concurrency preparation, set to waiting, and picked up by a matching runner, executing attacker-controlled code. No public exploit code was identified at time of analysis, and the chain requires low attacker privileges (the ability to open a fork PR) plus the maintainer's approval action. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 07, 2026
Fork-controlled workflow code execution is possible in Gitea (through 1.27.3) when Actions is enabled and a repository runs a shared run-level concurrency group: an attacker who can open a fork pull request plants workflow content in an approval-gated run, a sibling run in the same concurrency group cancels the blocked job and drives the run terminal while it still carries the approval flag, and a later maintainer approval re-queues the already-cancelled job so a matching runner claims and executes it. The independent assessment rates this CVSS:3.1/AV:N/AC:H/PR:L/UI:R/S:U/C:H/I:H/A:H - lower than the 8.8 base figure because the decisive step is a human maintainer approval plus a race against a sibling run and an available accepting runner - and no public exploit code has been identified at time of analysis. No public exploit identified at time of analysis; EPSS is 0.16% (4th percentile) and CISA SSVC records Exploitation: none, Automatable: no, Technical Impact: total.
RemediationAI
Upgrade to Gitea 28.0.0 (vendor-released patch), which enforces ActionRun.IsAwaitingApproval() (NeedApproval && !Status.IsDone()) at all approval paths, prevents a run from cancelling its own jobs during run-concurrency preparation, and re-evaluates concurrency before releasing approval-blocked jobs - see https://github.com/go-gitea/gitea/security/advisories/GHSA-93pj-3x56-5gc2 and https://github.com/go-gitea/gitea/pull/39399. Where upgrading is not immediately possible, the highest-value compensating control is to disable or restrict fork pull request workflows: set Actions to disabled or to not run fork workflows on sensitive repositories, at the cost of losing CI for external contributors; alternatively require maintainers to review and re-run rather than bulk-approve, since the exploit requires the maintainer's later approval action. Administrators should also avoid shared run-level concurrency groups on repositories that accept fork PRs, because the cancellation-by-sibling race is a prerequisite - this reduces CI parallelism and may lengthen pipelines - and should tighten runner scope so that no runner accepts jobs from repositories exposed to untrusted fork contributions, at the cost of manual job routing for trusted workloads. Because exploitation also needs a live accepting runner, temporarily pausing runner registration/unregistration of broad-scope runners is an effective stopgap. Note that NVD tags this entry with 'Information Disclosure', but the underlying impact is execution of fork-controlled workflow code, so remediate on that basis and treat approval-gated runs as untrusted until patched.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The root cause is CWE-841 (Improper Enforcement of Behavioral Workflow): Gitea's approval gate and its concurrency-preparation logic disagreed about the state of an ActionRun. Approval was previously keyed only off the NeedApproval flag, while concurrency cancellation could mark a blocked job terminal/Cancelled without clearing that flag, so an already-cancelled job could be re-processed by concurrency preparation on a later approval, flipped back to waiting, and handed to a runner. The upstream fix (PR #39399, shipped in v28.0.0) introduces ActionRun.IsAwaitingApproval() defined as NeedApproval && !Status.IsDone() and uses it at every approval entry point (API ApproveWorkflowRun, web view/ApproveAllChecks, merge-box status, and services/actions ApproveRuns). It also changes CancelPreviousJobsByRunConcurrency to drop jobs belonging to the current run via slices.DeleteFunc(job.RunID == attempt.RunID), preventing a run from cancelling its own jobs, and rewrites ApproveRuns to call PrepareToStartRunWithConcurrency, skip runs that return Blocked, and skip any job already cancelled by a sibling's concurrency within the same loop. Gitea Actions is a self-hosted CI/CD engine driven by fork pull request workflow files plus registered runners, which is why fork-supplied workflow YAML is the untrusted input here.
Know when Gitea gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
Opening a fork PR needs an account (PR:L); the concurrency-cancel race raises AC:H and the mandatory maintainer approval makes it UI:R; runner code execution yields C/I/A:H.
Primary rating from Vendor (88ee5874-cf24-4952-aea0-31affedb7ff2).
CVSS VectorVendor: 88ee5874-cf24-4952-aea0-31affedb7ff2
Lifecycle Timeline
3DescriptionCVE.org
A user who can open a fork pull request can place workflow content with a shared run-level concurrency group into a Gitea Actions run that is awaiting approval. When a later run in that group cancels the blocked job, the run becomes terminal while still marked as needing approval. If a maintainer later approves the run, Gitea passed the already-cancelled job back through concurrency preparation, set it to waiting, and made it claimable by a matching runner, executing fork-controlled workflow code. Exploitation requires the maintainer's later approval action, Actions to be enabled, and a runner that accepts the repository's jobs.
Technical POC Analysis
No standalone public exploit code was identified at time of analysis.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Gitea deployments up to version 1.27.3 with Actions enabled are vulnerable to fork-controlled workflow code execution, allowing an attacker who can open a fork pull request to potentially execute arbitrary code on CI runners after a maintainer approval and a race condition with a sibling run. This could compromise repository secrets, build integrity, and supply chain artifacts, directly impacting development and security teams that rely on Gitea Actions for trusted CI/CD pipelines. No vendor patch is currently available, and while no public exploit has been identified, the vulnerability requires authenticated access and user interaction, making exploitation complex but impactful.
No vendor-released patch identified at time of analysis. Interim mitigations: disable Gitea Actions where not essential; avoid shared run-level concurrency groups in repositories that accept fork pull requests; enforce least-privilege, ephemeral runners with no access to sensitive secrets; require manual approval from trusted maintainers for all fork PR workflows and monitor for cancelled-then-approved runs; enable comprehensive audit logging.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Remote code execution in Gitea (self-hosted Git service) via a code-injection flaw (CWE-94) allows attackers to run arbi
Broken access control in Gitea's Composer package registry (versions up to and including 1.26.1) lets remote attackers r
Gitea before 1.16.7 does not escape git fetch remote. Rated high severity (CVSS 7.5), this vulnerability is remotely exp
The git hook feature in Gitea 1.1.0 through 1.12.5 might allow for authenticated remote code execution in customer envir
Improper Neutralization of Input During Web Page Generation (XSS or 'Cross-site Scripting') vulnerability in Gitea Gitea
Reverse-proxy authentication bypass in the official Gitea Docker image (versions up to and including 1.26.2) allows any
Path traversal in Gitea's Org-mode (`.org`) markup renderer allows an attacker who can get Org-mode content rendered by
Container escape in Gitea act_runner (Docker backend, through act 0.262.0) lets an authenticated user with workflow-exec
models/repo_mirror.go in Gitea before 1.7.6 and 1.8.x before 1.8-RC3 mishandles mirror repo URL settings, leading to rem
Server-side request forgery and internal repository exfiltration in Gitea before 1.27.0 lets a low-privileged authentica
Authorization bypass in Gitea versions 1.22.3 through 1.26.1 allows holders of `public-only` access tokens or OAuth gran
An issue was discovered in Gitea through 1.11.5. Rated high severity (CVSS 7.5), this vulnerability is remotely exploita
EUVD-2026-93907
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB