Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain repo workflow-submission access
-
DeliverySubmit YAML with host-namespace container.options
-
ExploitRunner merges options into Docker HostConfig
-
Executionnsenter into host PID/IPC/mount namespaces
-
ImpactExecute arbitrary commands as root on runner host
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A06:2025 - Insecure Design
ASVS 5.0
V8 - Authorization Least privilege enforcement
MITRE ATT&CK
1 technique across 1 tactic: Privilege Escalation The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Requires a Docker-backed Gitea act_runner (versions before the fix; the go module affected range is < 1.0.9-0.20260731160927-34bfa1915022, fixed in release v3.0.0) and an attacker able to submit or trigger a workflow against a repository served by that runner (authenticated per PR:L - a repo collaborator, or an untrusted fork/PR contributor on a shared runner). The exploit is honored against default configurations: crucially, the condition is NOT that privileged mode is enabled - the flaw specifically defeats the 'runner privileged mode disabled' control, because sanitizeConfig() filters only Binds and Mounts while leaving PidMode=host, IpcMode=host, CapAdd=ALL, and SecurityOpt seccomp/apparmor=unconfined intact in the HostConfig. Limiting factors: only the Docker/container backend is affected; the attacker must have workflow-execution rights; and impact severity scales with tenancy - Critical for shared/multi-tenant runners with untrusted submitters, lower for single-tenant trusted-maintainer runners. |
| Impact | All severity signals point to a genuine high-priority issue for the right deployment profile. The CVSS 3.1 vector (AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H = 9.9) describes a low-complexity, low-privilege, no-interaction attack that escapes the container boundary (S:C) to full root compromise of the runner host. The GHSA advisory publishes a complete, working attacker workflow YAML, so publicly available exploit code exists and the barrier to reproduction is effectively zero. However, this is NOT in CISA KEV, so there is no confirmed active exploitation, and no EPSS probability was provided in the input, so widespread opportunistic exploitation cannot be quantified from this data. No SSVC decision was supplied either. The PR:L requirement is important context: the attacker must be able to submit or trigger a workflow against a repository served by a shared Docker-backed act_runner, so real-world risk is concentrated in multi-tenant/shared-runner and public fork-PR setups where untrusted users can run workflows - exactly the scenario the advisory rates Critical. For single-tenant runners used only by trusted maintainers, real risk is materially lower (the advisory rates it High) because the privileged-mode-disabled control that operators rely on is silently bypassed. Net: a real priority wherever untrusted workflow submission is possible; a defense-in-depth bypass rather than a demonstrated internet-wide mass-exploitation event, given EPSS and KEV evidence are absent. |
| Exploit ScenarioDerived | An attacker with workflow-submission access to a repository served by a shared Docker-backed Gitea act_runner pushes (or opens a fork PR containing) a workflow whose jobs.<job>.container.options includes --pid=host --ipc=host --cap-add=ALL and seccomp/apparmor=unconfined. Because privileged mode being disabled only forces Privileged=false, these flags survive into the job container's Docker HostConfig, letting a step run nsenter -t 1 to enter host namespaces and execute arbitrary commands as root on the runner host. A working proof-of-concept workflow is published directly in the GHSA advisory, so no exploit development is required. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 02, 2026
Workflow-controlled container options in Gitea act_runner let an authenticated user who can trigger a job escape the job container into the runner host, because HostConfig fields such as PidMode=host, IpcMode=host, CapAdd=[ALL] and unconfined seccomp/AppArmor profiles survive the runner's sanitization pass and a job step can then use nsenter to execute commands as root on the host. The flaw specifically defeats the 'runner privileged mode disabled' hardening control, which only forces Privileged=false while sanitizeConfig() filters nothing but Binds and Mounts, so default Docker-backed configurations are affected below v3.0.0 (Go module gitea.com/gitea/runner < 1.0.9-0.20260731160927-34bfa1915022). Publicly available exploit code exists in the form of the advisory's minimal proof-of-concept workflow YAML, but no CISA KEV listing or confirmed active exploitation has been reported; impact scales with tenancy, being critical for shared runners accepting untrusted workflow submissions and lower for single-tenant runners restricted to trusted maintainers.
RemediationAI
Vendor-released patch: upgrade act_runner to v3.0.0, which includes the fix landed via https://gitea.com/gitea/runner/pulls/1058 and corresponds to Go module gitea.com/gitea/runner version 1.0.9-0.20260731160927-34bfa1915022 or later; pin that module revision or newer and restart all runner workers so no stale binary continues scheduling jobs. Where upgrading immediately is not possible, note that no configuration toggle fully closes the gap, so apply operational controls instead: set runners to run only single-job, ephemeral containers and treat each worker host as untrusted (removes secret persistence and cross-job pivot potential, at the cost of throughput and the need to manage host secrets out-of-band); block workflow execution from forks and untrusted contributors by requiring maintainer approval before any job runs on a privileged Docker runner (this eliminates the untrusted-author attack path but adds manual latency to contributions); move the Docker socket and shared runners onto dedicated, disposable VMs or hosts that hold no production credentials and cannot reach internal build infrastructure on the network (contains blast radius but does not prevent the container escape itself); and consider temporarily disabling the Docker backend or the container.options feature for untrusted repositories until the patched runner is deployed. Full technical details and the vendor's fix direction are in the advisory at https://github.com/go-gitea/gitea/security/advisories/GHSA-x4q3-gcj3-m6cf.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 2 packages in go, 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-269 (Improper Privilege Management) in the Go-based act_runner that executes Gitea Actions workflows on a Docker backend (CPE pkg:go/gitea.com_gitea_runner). Workflow YAML accepted through ContainerSpec.Options is collected by RunContext.options(), concatenated with runner-level options, parsed by mergeContainerConfigs() from Docker CLI-style flags into a Docker HostConfig, and applied to the job container. When runner privileged mode is disabled, only the Privileged boolean is forced false; sanitizeConfig() filters only Binds and Mounts, so workflow-supplied namespace sharing (--pid=host, --ipc=host, --uts=host, --network=host), capability expansion (--cap-add ALL / SYS_ADMIN), and security profile overrides (--security-opt seccomp=unconfined, apparmor=unconfined) persist in the final HostConfig. Sharing the host PID namespace plus unconfined seccomp/AppArmor and full capabilities removes every container boundary that would otherwise block nsenter -t 1 -m -u -i -n -p from entering the host mount, UTS, IPC, network and PID namespaces, yielding root-equivalent command execution on the runner host. The essence of the bug is a trust-boundary failure: workflow YAML authored by a repository contributor is treated as trusted runner configuration.
Know when Docker 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:C/C:H/I:H/A:H
Submitting a workflow over the network needs only repo workflow access (AV:N, AC:L, PR:L, UI:N); the container-to-host escape crosses a trust boundary (S:C) yielding full root impact (C/I/A:H).
Primary rating from GitHub Advisory.
CVSS VectorGitHub Advisory
DescriptionGitHub Advisory
Summary
act_runner appends workflow-controlled jobs.<job>.container.options directly to the Docker HostConfig for the job container. When runner privileged mode is disabled, only Privileged is forced false. Host namespace flags, capability expansion, and security profile overrides from workflow YAML are preserved in the final HostConfig. A workflow author can enter host PID/IPC namespaces and execute commands on the runner host as root.
Details
Source-to-sink path in act_runner:
ContainerSpec.Optionsaccepts workflow YAMLcontainer.optionsRunContext.options()appends workflow options to runner-level container options- Job container is created with
Privileged: rc.Config.Privilegedbut also
with Options: rc.options(ctx)
mergeContainerConfigs()parses Docker CLI-style options into HostConfig- When privileged mode is disabled, only
copts.privilegedis forced false sanitizeConfig()only filtersBindsandMounts- Preserved dangerous HostConfig fields:
Privileged=false
PidMode=host
IpcMode=host
CapAdd=["ALL"]
SecurityOpt=["seccomp=unconfined","apparmor=unconfined"]Attacker workflow YAML:
jobs:
breakout:
runs-on: ubuntu-latest
container:
image: ubuntu:22.04
options: >-
--pid=host --ipc=host --cap-add=ALL
--security-opt seccomp=unconfined
--security-opt apparmor=unconfined
steps:
- name: host namespace marker
run: |
nsenter -t 1 -m -u -i -n -p -- sh -c "id > /tmp/marker"Impact
An attacker who can submit a workflow to a repository using a shared Docker-backed act_runner can:
- Enter host PID, IPC, and mount namespaces
- Execute arbitrary commands as root on the runner host
- Access runner host secrets, deployment credentials, and environment variables
- Pivot to adjacent jobs running on the same runner
- Access internal build infrastructure reachable from the runner host
Critical severity for shared runners where untrusted users can trigger workflows. High severity for single-tenant runners with privileged mode explicitly disabled as a security control.
Fix Direction
Treat container.options as untrusted input. Reject or strip when privileged mode is disabled:
- Host namespaces:
--pid=host,--ipc=host,--uts=host,--network=host - Capability expansion:
--cap-add ALL,--cap-add SYS_ADMIN - Security overrides:
--security-opt seccomp=unconfined,--security-opt apparmor=unconfined - Device access:
--device,--device-cgroup-rule - Volume inheritance:
--volumes-from - Runtime controls:
--runtime,--cgroup-parent
Articles & Coverage 1
Technical POC Analysis
CWE-269: Improper Privilege Management.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
Gitea act_runner versions below v3.0.0 contain a critical container isolation failure that can let a job-triggering user gain root on the runner host, compromising CI/CD pipelines and any credentials or code accessible there. The risk is highest for shared runners that accept workflows from untrusted contributors, where one malicious job could affect other tenants and connected systems; publicly available exploit code exists, though no confirmed active exploitation has been reported. A vendor patch is available, so leadership should prioritize immediate inventory and remediation of affected runners.
Apply vendor patch.
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
Privilege escalation occurs when an attacker leverages flaws in access control mechanisms to gain permissions beyond what they were originally granted.
An issue was discovered in Appsmith before 1.52. Rated critical severity (CVSS 9.8), this vulnerability is remotely expl
runc through version 1.0-rc6 (used in Docker before 18.09.2) contains a container escape vulnerability that allows attac
Netmaker makes networks with WireGuard. Rated high severity (CVSS 7.5), this vulnerability is remotely exploitable, no a
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
The News & Blog Designer Pack - WordPress Blog Plugin - (Blog Post Grid, Blog Post Slider, Blog Post Carousel, Blog Post
Path traversal in JFrog Artifactory (CWE-22) enables an authenticated low-privilege user to write data outside the inten
Docker 1.3.2 allows remote attackers to execute arbitrary code with root privileges via a crafted (1) image or (2) build
Remote code execution in Gogs through 0.14.2 allows authenticated users (and unauthenticated attackers on default-config
Unauthenticated remote command injection in SGWBOX N3 firmware 2.0.25 lets attackers execute arbitrary operating-system
Remote code execution in Flowise before 3.1.2 allows any authenticated user (or API caller with chatflow view/update per
Remote code execution in NocoBase Workflow Script Node (npm @nocobase/plugin-workflow-javascript) allows authenticated l
Docker Desktop Community Edition before 2.1.0.1 allows local users to gain privileges by placing a Trojan horse docker-c
EUVD-2026-101107
GHSA-x4q3-gcj3-m6cf
NVD
CVE.org
EPSS
Exploit-DB