---
title: "CVE-2026-31886: Dagu: Path Traversal via `dagRunId` in Inline DAG Execution"
url: https://erroneo.us/security/cve/CVE-2026-31886/
description: "CVE-2026-31886 (github.com/dagu-org/dagu (Go)): Dagu is a workflow engine with a built-in Web user interface. Prior to 2.2.4, the dagRunId request field…"
type: vulnerability-record
section: "Security Digest"
date_published: 2026-03-13
date_modified: 2026-03-16
publisher: erroneo.us
author: erroneo.us Security Desk
cve: "CVE-2026-31886"
kev: false
cvss: 9.1
epss: 0.00498
license: All rights reserved. Quote with attribution and a link.
---

# CVE-2026-31886: Dagu: Path Traversal via `dagRunId` in Inline DAG Execution

**Signal:** Critical, preconditions apply. Severe if exploited, but exploitation needs conditions that may not apply to you. (Computed from CISA KEV, EPSS and CVSS; not an editorial verdict.)

## Should you act?

- Not in CISA KEV , but CISA’s SSVC assessment records a public proof-of-concept, so attack code exists.
- EPSS 0.5% , percentile 42: FIRST’s model estimates a 0.5% chance of exploitation activity in the next 30 days, higher than 42% of all scored CVEs (low). EPSS is a probability, not a verdict.
- Needs an account (low (any account)). Exposure depends on who can log in.
- Only applies if your dependency tree includes github.com/dagu-org/dagu (Go) <= 2.2.4, no fixed version listed . Check your lockfile, including transitive dependencies.

## What it is

Dagu is a workflow engine with a built-in Web user interface. Prior to 2.2.4, the dagRunId request field accepted by the inline DAG execution endpoints is passed directly into filepath.Join to construct a temporary directory path without any format validation. Go's filepath.Join resolves .. segments lexically, so a caller can supply a value such as ".." to redirect the computed directory outside the intended /tmp/ / path. A deferred cleanup function that calls os.RemoveAll on that directory then runs unconditionally when the HTTP handler returns, deleting whatever directory the traversal resolved to. With dagRunId set to "..", the resolved directory is the system temporary directory (/tmp on Linux). On non-root deployments, os.RemoveAll("/tmp") removes all files in /tmp owned by the dagu process user, disrupting every concurrent dagu run that has live temp files. On root or Docker deployments, the call removes the entire contents of /tmp, causing a system-wide denial of service. This vulnerability is fixed in 2.2.4.

## Affected packages

- Go `github.com/dagu-org/dagu` <= 2.2.4 → fixed: none listed

## Affected products (CVE record)

- dagu-org dagu: < 2.2.4

## Severity

- GitHub_M CVSS 3.1: 9.1 `CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:H`
- GitHub CVSS 3.1: 9.1 `CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:L/I:L/A:H`

## Exploitation

- CISA KEV: not listed (no confirmed in-the-wild exploitation known to CISA).
- CISA SSVC assessment: exploitation poc , automatable no , technical impact partial .
- FIRST EPSS (model of 2026-10-21): 0.50% probability of exploitation activity in the next 30 days; percentile 42.

## Sources

- [GitHub Advisory GHSA-m4q3-457p-hh2x](https://github.com/advisories/GHSA-m4q3-457p-hh2x)
- [CVE.org record CVE-2026-31886](https://www.cve.org/CVERecord?id=CVE-2026-31886)
- [NVD entry CVE-2026-31886](https://nvd.nist.gov/vuln/detail/CVE-2026-31886)
- [github.com](https://github.com/dagu-org/dagu/security/advisories/GHSA-m4q3-457p-hh2x)
- [github.com](https://github.com/dagu-org/dagu/commit/12c2e5395bd9331d49ca103593edfd0db39c4f38)
- [pkg.go.dev](https://pkg.go.dev/vuln/GO-2026-4693)

---
Source page: https://erroneo.us/security/cve/CVE-2026-31886/ · Security Digest: https://erroneo.us/security/ · More: https://erroneo.us/llms.txt
