Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessPhish developer with malicious link
-
DeliveryDeveloper visits attacker page with tinacms dev active
-
ExploitAttacker page sends multipart POST to localhost /media/upload/*
-
ExecutionBrowser skips CORS preflight (simple request)
-
PersistCORS middleware returns false but does not terminate request
-
ImpactDev server writes attacker-controlled file to media root
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V3 - Web Frontend Security Anti-CSRF tokens, SameSite cookies
MITRE ATT&CK
1 technique across 1 tactic: Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Two specific conditions must both be met: (1) the target developer must be running tinacms dev locally - this vulnerability is exclusive to the CLI development server and is not present in production TinaCMS deployments; and (2) the developer must visit an attacker-controlled web page in the same browser session while the dev server is active, at which point the attacker page autonomously triggers the upload with no further developer interaction beyond the initial page visit (CVSS UI:R). The attack is bounded to writing files within the configured media root directory - the resolveStrictlyWithinBase path sanitization function prevents traversal to other filesystem locations, which limits the attacker to poisoning or overwriting content within that directory. No authentication layer exists on the dev server (PR:N), so no credential theft is a prerequisite. The vulnerability does not apply to developers who run tinacms dev exclusively in isolated browser profiles or network namespaces, or who have upgraded to 2.5.2. |
| Impact | The CVSS 3.1 vector (AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:N, score 6.5) accurately characterizes the attack: network-reachable, low complexity, no authentication required, but gated on developer user interaction (visiting a malicious page). Real-world risk is meaningful but contextually bounded - this vulnerability exists only in the development server (tinacms dev) and does not affect production deployments, substantially limiting the at-risk population to developers actively editing TinaCMS projects locally. The integrity impact is high within the media root but is hard-bounded by resolveStrictlyWithinBase path sanitization; the researcher explicitly did not demonstrate traversal outside the media directory or code execution, so the 'H' integrity rating reflects the worst-case file-write scenario rather than RCE. No KEV listing exists, meaning active exploitation is not confirmed by CISA. A researcher-validated POC exists in the GHSA advisory, confirming exploitability. EPSS data is not provided in the input. The overall priority is moderate: developers using @tinacms/cli < 2.5.2 should upgrade promptly, but the constrained impact surface and UI:R requirement reduce urgency relative to server-side CSRF vulnerabilities. |
| Exploit ScenarioDerived | An attacker sends a developer a phishing link to a malicious web page containing JavaScript that constructs a multipart/form-data POST to http://localhost:<tinacms-port>/media/upload/injected-asset.jpg with attacker-supplied file contents. When the developer opens the link while tinacms dev is running, the browser submits the simple cross-origin request without a preflight check; the dev server processes the upload and writes the attacker's content to the media root. A researcher-validated POC for this exact scenario is included in GHSA-rgr9-r7mj-mf6x, confirming that the file write completes even though the browser treats the fetch response as blocked. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 19, 2026
Cross-site request forgery in the TinaCMS CLI dev server allows an attacker-controlled web page to write arbitrary files into a developer's local media root without their knowledge. The Vite dev server's CORS middleware only suppressed response headers for disallowed origins but never terminated the underlying request, and because multipart/form-data is a browser 'simple request' exempt from CORS preflight, an attacker page can silently drive a complete media upload to completion. Exploitation requires the targeted developer to visit an attacker-controlled page while tinacms dev is running locally; no public exploit identified at time of analysis, though a researcher-validated proof-of-concept is documented in GHSA-rgr9-r7mj-mf6x. Vendor-released patch: @tinacms/cli@2.5.2.
RemediationAI
Upgrade @tinacms/cli to version 2.5.2 or later via npm install @tinacms/cli@2.5.2 or the equivalent yarn/pnpm command. Version 2.5.2 adds server-side origin enforcement that rejects disallowed cross-origin requests with HTTP 403 before they reach any handler, covering /media/upload, /media DELETE, searchIndex POST/DELETE, and /graphql POST. The fix is confirmed in the GitHub release at https://github.com/tinacms/tinacms/releases/tag/@tinacms/cli@2.5.2 and implemented in commit 211997cdb53cbd43638bdee999faa65375cfc260. If immediate upgrade is not possible, the primary compensating control is behavioral: developers should avoid visiting untrusted URLs in the same browser session while tinacms dev is running, or use a dedicated browser profile for development work that is never used for general browsing. Network-layer controls (firewall rules restricting loopback port access) are insufficient alone because the CSRF attack originates from the developer's own browser, not an external network peer. There is no viable configuration-only workaround in versions prior to 2.5.2.
Affected VersionsENISA
Affected Packages
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 is an open-source headless CMS whose CLI package (@tinacms/cli) ships a Vite-based local dev server for content editing. The root cause is CWE-352 (Cross-Site Request Forgery): the cors npm library's origin callback returning false only affects the Access-Control-Allow-Origin response header - it does not terminate the request server-side. The affected route handler in packages/@tinacms/cli/src/next/vite/plugins.ts unconditionally forwards any POST to /media/upload/* into mediaRouter.handlePost regardless of origin decision. The upload handler in packages/@tinacms/cli/src/next/commands/dev-command/server/media.ts extracts a path from the URL, resolves it via resolveStrictlyWithinBase against the configured media folder, and pipes attacker-controlled multipart contents to disk. Because multipart/form-data is a browser simple content-type, no CORS preflight OPTIONS request is triggered, bypassing the only origin gate that existed. The CPE cpe:2.3:a:tinacms:tinacms:*:*:*:*:*:*:*:* covers all pre-2.5.2 releases. The fix in PR #7111 introduces an isOriginAllowed() function and enforces server-side 403 rejection on all state-changing routes before handlers are reached.
Know when Tinacms 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:N/UI:R/S:U/C:N/I:H/A:N
Network-reachable via browser CSRF with no auth (PR:N), but requires developer to visit malicious page (UI:R); integrity high for media root writes, confidentiality none as CORS blocks response reading.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
Tina is a headless content management system. Prior to 2.5.2, the TinaCMS CLI package's Vite dev server packages/@tinacms/cli/src/next/vite/cors.ts origin callback returns false for a disallowed origin but does not reject the request, and packages/@tinacms/cli/src/next/vite/plugins.ts still routes POST /media/upload/* to mediaRouter.handlePost. The upload code in packages/@tinacms/cli/src/next/commands/dev-command/server/media.ts writes attacker-controlled multipart contents inside the configured media root. A remote attacker can cause a developer's browser to submit this state-changing request by inducing the developer to visit an attacker-controlled page while tinacms dev is running. This issue is fixed in version 2.5.2.
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
Cross-Site Request Forgery exploits the automatic credential inclusion behavior of web browsers.
Cross-tenant authorization bypass in TinaCMS self-hosted deployments allows any holder of a legitimate TinaCloud account
Remote code execution in TinaCMS affects versions prior to 3.1.1, @tinacms/cli before 2.0.4, and @tinacms/graphql before
Broken access control across all four first-party TinaCMS production media adapters (next-tinacms-s3, next-tinacms-dos,
Off-origin preview framing in TinaCMS (tinacms <= 3.13.0 and @tinacms/app <= 2.5.13) lets an unauthenticated attacker wh
Code injection in @tinacms/cli versions up to and including 2.7.0 lets a crafted Git branch name break out of the string
Stored cross-site scripting in TinaCMS's @tinacms/web-components package (all versions up to and including 0.2.0) lets a
EUVD-2026-62971
GHSA-rgr9-r7mj-mf6x
NVD
CVE.org
EPSS
Exploit-DB