Skip to main content

Microsoft CVE-2026-34603

| EUVDEUVD-2026-17964 HIGH
Path Traversal (CWE-22)
2026-04-01 https://github.com/tinacms/tinacms GHSA-g87c-r2jp-293w
7.1
CVSS 3.1 · GitHub Advisory
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Authenticate to Tina CMS
  2. Delivery
    Create symlink in media root
  3. Exploit
    Request path through symlink
  4. Execution
    Traverse outside media directory
  5. Impact
    Read/write arbitrary files

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Path canonicalization, traversal prevention
MITRE ATT&CK

2 techniques across 2 tactics: Discovery, Collection

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires authenticated user access to @tinacms/cli dev media routes. Attacker must have low privilege (PR:L) and a symlink or junction must already exist under the media root directory. No user interaction needed. Affects default configurations where symlink validation is not implemented.

Impact

CVSS 7.1 (High) reflects network-accessible attack vector with high attack complexity, low privileges required, and high confidentiality/integrity impact with low availability impact. The AC:H rating is critical-exploitation requires an attacker to first create or influence a symlink/junction within the media directory, which typically requires filesystem access or social engineering in repository workflows. PR:L indicates authenticated access to TinaCMS dev server is required. Real-world risk is elevated primarily in development and self-hosted scenarios where symlinks may exist legitimately in media directories (e.g., linking to external asset stores) or where attackers have limited filesystem access to plant junctions. The impact is genuine-confirmed arbitrary file read/write outside media root-but the prerequisite conditions limit widespread exploitability. EPSS probability not provided for risk calibration. No CISA KEV listing or public weaponization identified, suggesting limited active targeting. SSVC factors: exploitation status is POC (researcher demonstrated local Windows junction); automatable is NO due to symlink prerequisite; technical impact is TOTAL (arbitrary file operations). Priority is MEDIUM for dev environments with symlinks, LOW for production deployments without user-controlled filesystem state. This is a legitimate high-severity issue in affected configurations but not an emergency patch requiring immediate universal deployment.

Exploit ScenarioDerived

An attacker with low-privilege authenticated access to a TinaCMS development server first creates a Windows junction or symlink named 'pivot' under the media uploads directory, pointing to a sensitive directory like /etc or C:\Windows\System32. They then send a GET request to /media/list/pivot which passes path validation because 'pivot' resolves lexically within the media root, but Node.js readdir follows the junction and returns a directory listing of the external target, leaking sensitive filesystem structure. The attacker escalates by POST uploading a malicious file to /media/upload/pivot/malicious.exe, which TinaCMS writes through the junction to the system directory, achieving arbitrary file write outside the media sandbox. The researcher's Windows proof-of-concept demonstrates this pattern with a junction linking public/uploads/pivot to an outside directory, successfully writing 'MEDIA_ESCAPE' content to outside/written-from-media.txt. No public exploit identified at time of analysis beyond the researcher's local demonstration.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Apr 01, 2026

TinaCMS CLI media handlers can be bypassed via symlink/junction traversal, allowing authenticated low-privilege attackers to list, write, and delete files outside the configured media root directory. The vulnerability exists in @tinacms/cli's dev server media routes despite recent path-traversal hardening, because validation performs only lexical string checks without resolving symlink targets. Attack complexity is high (requires pre-existing symlink under media root), but impact is significant with confirmed read/write primitives. Vendor patch available via GitHub commit f124eaba. EPSS and KEV data not provided; no public exploit identified at time of analysis beyond researcher's local Windows junction proof-of-concept.

RemediationAI

Vendor-released patch: GitHub commit f124eabaca10dac9a4d765c9e4135813c4830955 addresses the symlink traversal vulnerability by implementing canonical path resolution. Users should upgrade @tinacms/cli to the patched version specified in the advisory at https://github.com/tinacms/tinacms/security/advisories/GHSA-g87c-r2jp-293w. The fix replaces lexical string validation with fs.realpath() canonicalization to resolve symlink targets before performing containment checks, ensuring filesystem operations cannot escape the media root via indirection. Until patching is complete, immediate workarounds include auditing the media directory tree to identify and remove any symlinks or junctions, restricting filesystem write access to prevent symlink creation under the media root, and limiting dev server exposure to trusted networks only. For self-hosted production deployments, consider disabling dev server media routes entirely if not required. Review application logs for suspicious media route access patterns targeting paths with multiple directory components that could indicate reconnaissance or exploitation attempts. The delete endpoint uses identical validation logic and is addressed by the same patch.

Affected VersionsENISA

tinacms < 2.2.2

Affected Packages

npm @tinacms/graphql fix: 2.2.2
euvd tinacms fix: 2.2.2

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 2 packages in npm, euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

TinaCMS CLI (npm package @tinacms/cli) provides development server routes for media file management. The affected code in media.ts and path.ts implements path-traversal protection using path.resolve() with lexical string prefix matching (startsWith checks). This approach validates that user-supplied paths resolve to strings beginning with the media base directory but does not account for filesystem indirection via symbolic links or Windows junctions. CWE-22 (Improper Limitation of a Pathname to a Restricted Directory) occurs because the validated path is passed directly to Node.js fs operations (readdir, createWriteStream, remove) which follow symlinks by default. When a symlink exists under the media root pointing outside it, paths like 'pivot/file.txt' pass lexical validation but filesystem operations target the link destination. The vulnerability affects the /media/list, /media/upload, and DELETE /media endpoints in the dev server. Canonical path resolution with fs.realpath() is required to detect and block symlink-based directory escapes before filesystem operations occur.

Know when Canonical 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

GitHub Advisory PRIMARY 7.1 HIGH
AV:N/AC:H/PR:L/UI:N/S:U/C:H/I:H/A:L

Primary rating from GitHub Advisory · only source for this CVE.

CVSS VectorGitHub Advisory

Attack Vector
Network
Attack Complexity
High
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
Low

Lifecycle Timeline

2
Patch released
Apr 01, 2026 - 00:30 nvd
Patch available
CVE Published
Apr 01, 2026 - 00:23 nvd
HIGH 7.1

DescriptionGitHub Advisory

Summary

@tinacms/cli recently added lexical path-traversal checks to the dev media routes, but the implementation still validates only the path string and does not resolve symlink or junction targets.

If a link already exists under the media root, Tina accepts a path like pivot/written-from-media.txt as "inside" the media directory and then performs real filesystem operations through that link target. This allows out-of-root media listing and write access, and the same root cause also affects delete.

Details

The dev media handlers validate user-controlled paths with:

ts
function resolveWithinBase(userPath: string, baseDir: string): string {
  const resolvedBase = path.resolve(baseDir);
  const resolved = path.resolve(path.join(baseDir, userPath));
  if (resolved === resolvedBase) {
    return resolvedBase;
  }
  if (resolved.startsWith(resolvedBase + path.sep)) {
    return resolved;
  }
  throw new PathTraversalError(userPath);
}

function resolveStrictlyWithinBase(userPath: string, baseDir: string): string {
  const resolvedBase = path.resolve(baseDir) + path.sep;
  const resolved = path.resolve(path.join(baseDir, userPath));
  if (!resolved.startsWith(resolvedBase)) {
    throw new PathTraversalError(userPath);
  }
  return resolved;
}

But the validated path is then used directly for real filesystem access:

ts
filesStr = await fs.readdir(validatedPath);
...
await fs.ensureDir(path.dirname(saveTo));
file.pipe(fs.createWriteStream(saveTo));
...
await fs.remove(file);

This does not account for symlinks/junctions already present below the media root. A path such as pivot/secret.txt can be lexically inside the media directory while the filesystem target is outside it.

Local Reproduction

I verified this locally with a real junction on Windows.

Test layout:

  • media root: D:\bugcrowd\tinacms\temp\junction-repro4\public\uploads
  • junction under media root: public\uploads\pivot -> D:\bugcrowd\tinacms\temp\junction-repro4\outside
  • file outside the media root: outside\secret.txt

Tina's current media-path validation logic was applied and used to perform the same list/write operations the route handlers use.

Observed result:

json
{
  "media": {
    "base": "D:\\bugcrowd\\tinacms\\temp\\junction-repro4\\public\\uploads",
    "resolvedListPath": "D:\\bugcrowd\\tinacms\\temp\\junction-repro4\\public\\uploads\\pivot",
    "listedEntries": [
      "secret.txt"
    ],
    "resolvedWritePath": "D:\\bugcrowd\\tinacms\\temp\\junction-repro4\\public\\uploads\\pivot\\written-from-media.txt",
    "outsideWriteExists": true,
    "outsideWriteContents": "MEDIA_ESCAPE"
  }
}

This shows the problem clearly:

  • the path validator accepted pivot
  • listing revealed a file from outside the media root
  • writing to pivot/written-from-media.txt created outside\written-from-media.txt

The delete path uses the same flawed containment model and should be hardened at the same time.

Impact

  • Out-of-root file listing via /media/list/...
  • Out-of-root file write via /media/upload/...
  • Likely out-of-root file delete via /media/... DELETE, using the same path-validation gap
  • Bypass of the recent path traversal hardening for any deployment whose media tree contains a link to another location

This is especially relevant in development and self-hosted workflows where the media directory may contain symlinks or junctions intentionally or via repository content.

Recommended Fix

Harden media path validation with canonical filesystem checks:

  1. resolve the real base path with fs.realpath()
  2. resolve the real target path, or for writes the nearest existing parent
  3. compare canonical paths rather than lexical strings
  4. reject any operation that traverses through a symlink/junction to leave the real media root

path.resolve(...).startsWith(...) is not sufficient for filesystem security on linked paths.

Resources

  • packages/@tinacms/cli/src/next/commands/dev-command/server/media.ts
  • packages/@tinacms/cli/src/server/models/media.ts
  • packages/@tinacms/cli/src/utils/path.ts

Executive ViewAI

Why It Matters

TinaCMS CLI versions prior to the patched release contain a symlink traversal vulnerability affecting authenticated users with low privileges, enabling unauthorized file read, write, and delete operations outside the intended media directory. Organizations using TinaCMS for content management should prioritize patching to prevent credential-holding developers from accessing sensitive project files and configuration data.

Business Impact: High
Compensating Controls

Apply vendor patch. Interim mitigations pending patch deployment: (1) Restrict developer access to TinaCMS dev server to trusted networks only; (2) Disable dev server media routes if not actively in use; (3) Monitor filesystem access to sensitive files within media directory scope; (4) Enforce file system permissions preventing creation of symlinks/junctions under media root directories.

Threat Intelligence Overview

EPSS Score
0.1%
Top 81% exploitable
Threat Intel
1
1 source
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GHSA GitHub

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
Poc
System Exposure· derived
Open
Automatable
No
Human Impact
High
Technical Impact
Total

Priority Score

36
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +36
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Path traversal exploits occur when applications use user-controlled input to construct file system paths without proper validation.

Related Vulnerabilities in TinaCMS Path Traversal Vulnerabilities

View all 2
CVE-2011-3544 CRITICAL POC
9.8 Oct 19

Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug

CVE-2019-11043 CRITICAL POC
9.8 Oct 28

In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it

CVE-2014-6271 CRITICAL POC
9.8 Sep 24

GNU Bash through 4.3 processes trailing strings after function definitions in the values of environment variables, which

CVE-2013-0422 CRITICAL POC
9.8 Jan 10

Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using

CVE-2016-3714 HIGH POC
8.4 May 05

The (1) EPHEMERAL, (2) HTTPS, (3) MVG, (4) MSL, (5) TEXT, (6) SHOW, (7) WIN, and (8) PLT coders in ImageMagick before 6.

CVE-2017-12617 HIGH POC
8.1 Oct 04

When running Apache Tomcat versions 9.0.0.M1 to 9.0.0, 8.5.0 to 8.5.22, 8.0.0.RC1 to 8.0.46 and 7.0.0 to 7.0.81 with HTT

CVE-2016-8735 CRITICAL POC
9.8 Apr 06

Remote code execution is possible with Apache Tomcat before 6.0.48, 7.x before 7.0.73, 8.x before 8.0.39, 8.5.x before 8

CVE-2014-7169 CRITICAL POC
9.8 Sep 25

GNU Bash through 4.3 bash43-025 processes trailing strings after certain malformed function definitions in the values of

CVE-2014-0160 HIGH POC
7.5 Apr 07

The (1) TLS and (2) DTLS implementations in OpenSSL 1.0.1 before 1.0.1g do not properly handle Heartbeat Extension packe

CVE-2016-5195 HIGH POC
7.0 Nov 10

Race condition in mm/gup.c in the Linux kernel 2.x through 4.x before 4.8.3 allows local users to gain privileges by lev

CVE-2013-2423 LOW POC
3.7 Apr 17

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 17 and earlier, and

CVE-2023-4911 HIGH POC
7.8 Oct 03

Local privilege escalation in the GNU C Library (glibc) dynamic loader ld.so allows unprivileged local users on affected

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy