Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft malicious hash-router link
-
DeliveryPhish signed-in editor to open it
-
ExploitAdmin frames attacker origin as trusted preview
-
ExecutionFrame posts GraphQL ops over postMessage
-
PersistAdmin executes with editor credentials
-
ImpactRead/modify protected content
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Origin validation
|
| Exploitation Conditions | Exploitation works against default configurations of the TinaCMS admin (packages/tinacms/src/admin/index.tsx) - no special feature flag or non-default setting is required, because the vulnerable /~/* hash-router preview route and the unvalidated expectedOrigin derivation ship enabled. The concrete prerequisites are: (1) a victim must be running tinacms <=3.13.0 and/or @tinacms/app <=2.5.13; (2) a user must be actively signed in to the admin with a valid editor token; and (3) that editor must open the attacker-crafted link containing a protocol-relative hash fragment (e.g. #/~//attacker.example/p) - this required user interaction (UI:R) is the primary limiting factor. The iframe ships with no sandbox attribute and the admin bundle ships no CSP, so no browser-side control blocks the off-origin frame; however, the attack cannot proceed without an authenticated editor being socially engineered into clicking, which bounds it to targeted rather than unattended exploitation. |
| Impact | This is a genuine high-priority issue, and the CVSS 9.3 is well-supported by the technical evidence rather than being score inflation. The CVSS vector (AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N) is internally consistent with the description: an unauthenticated remote attacker (PR:N) exploits an origin-validation flaw (CWE-346) with low complexity (AC:L), and the scope change (S:C) is justified because the attacker-controlled iframe is elevated to act with the signed-in editor's credentials against the content API, crossing a trust boundary. The one meaningful mitigating signal is UI:R - exploitation requires a logged-in editor to open the crafted link, so this is not wormable/automatable mass exploitation but targeted social engineering of CMS editors. No EPSS score and no CISA KEV entry were provided in the input, so there is no evidence of active exploitation; however, the GHSA advisory includes a working proof-of-concept, so publicly available exploit code exists. The absence of an EPSS figure means exploitation probability cannot be quantified from the data given. Net: treat as a priority patch for any TinaCMS deployment with real editors, while recognizing exploitation depends on tricking an authenticated editor rather than unattended remote compromise. |
| Exploit ScenarioDerived | An attacker crafts a link to a victim site's admin with a doubled-slash hash fragment (e.g. #/~//attacker.example/p) and sends it to a signed-in TinaCMS editor via phishing. When the editor opens it, the admin frames the attacker's external origin as the trusted preview; a working PoC exists in the GHSA advisory. The attacker's frame then issues GraphQL reads and mutations that the admin executes with the editor's token, exfiltrating or altering protected content back to the attacker's origin. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 09, 2026
Off-origin preview framing in TinaCMS (tinacms <= 3.13.0 and @tinacms/app <= 2.5.13) lets an unauthenticated attacker who convinces a signed-in editor to open a crafted link such as #/~//attacker.example/p make the admin load and trust an attacker-controlled iframe, which is then accepted as the legitimate preview over the admin↔preview postMessage channel. Because the admin executes any GraphQL operation coming from that frame using the editor's own token, the attacker gains the editor's content API read and write access, exposing or modifying protected content. Exploitation needs only one click by an authenticated editor against a default configuration; no public exploit code was identified at time of analysis, and vendor-released patches are available in tinacms 3.14.0 and @tinacms/app 2.5.14.
RemediationAI
Vendor-released patch: upgrade tinacms to 3.14.0 and @tinacms/app to 2.5.14 - both packages must be updated together, since the fix reworks the admin route and the origin trust anchor. The fix, delivered via PR https://github.com/tinacms/tinacms/pull/7522 and commit b57dbf4b56201aef15cd92caa49fd12ab96bbecf, resolves the preview path against the admin's own origin (rejecting off-origin splats, warning the editor, and replacing the rejected address in history), replaces getExpectedPreviewOrigin with an argument-free getPreviewOrigin() that returns window.location.origin so a URL can no longer nominate the origin it is trusted from, and guards the active-field lookup against unreadable cross-origin or sandboxed frames. If a patched release cannot be deployed immediately, apply compensating controls with their trade-offs in mind: (1) add a reverse-proxy or edge Content-Security-Policy for the admin document restricting frame-src 'self' and child-src 'self' so the admin cannot frame an external origin - this is the closest structural equivalent to the fix, but a strict policy can break legitimate previews that rely on other origins, so test against real content before enforcing; (2) front the admin with a proxy rule that strips or rejects /~// (and any /~ path resolving to a protocol-relative or absolute URL) in the URL fragment - note fragments are never sent in HTTP requests, so this must be enforced in client code or via a small injected script, not at the server alone; (3) temporarily disable or restrict the admin preview route /~/ to a small set of trusted hosts, accepting loss of the preview feature; (4) add a sandbox attribute without allow-same-origin to the preview iframe in the admin bundle - an effective block for the cross-origin frame, but it disables legitimate same-origin preview scripting and must be validated. Because the attack lands only when a signed-in editor clicks a crafted link, treat this as a targeted-phishing vector in the interim: warn editors not to open unexpected admin preview links, and monitor admin GraphQL traffic for mutations originating shortly after a preview navigation. Applying the vendor patch removes the need for all of the above.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 3 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
The issue is rooted in a CWE-346 origin validation error inside the TinaCMS admin SPA. The admin's /~/* HashRouter route takes the router splat and prefixes it with a single / to force a relative path (packages/tinacms/src/admin/index.tsx), but react-router-dom 6.30.3 returns the splat with its own leading slash for a doubled-slash fragment, so #/~//attacker.example/p yields //attacker.example/p - a protocol-relative URL that resolves to an external origin and is passed straight into the preview iframe src in packages/@tinacms/app/src/preview.tsx. The same unvalidated string is fed to getExpectedPreviewOrigin in packages/@tinacms/app/src/lib/preview-origin.ts, which simply returns new URL(url, baseOrigin).origin; that derived value becomes the sole trust anchor for the admin↔preview channel in packages/@tinacms/app/src/lib/graphql-reducer.ts, where messages from any other origin are rejected. The attacker's frame therefore satisfies both guards - its event.origin equals the computed expectedOrigin, and its window is the frame the admin itself created - so its GraphQL payloads reach the authenticated client and results are posted back to the attacker. The iframe carries no sandbox attribute and the admin bundle ships no Content-Security-Policy, and the URL-correction poll in PreviewInner cannot recover because reading contentWindow.location.href across origins throws an uncaught SecurityError, so no corrective navigation occurs. The assessed vector (CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N, 9.3) reflects that the attacker is unauthenticated (PR:N) but the editor must be socially engineered into opening the link (UI:R), and that the security scope changes because the injected frame executes with the victim editor's privileges.
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:C/C:H/I:H/A:N
Unauthenticated remote attacker (PR:N) exploits an origin-validation flaw at low complexity but needs an editor to click the link (UI:R); the iframe gains the editor's credentials across a trust boundary (S:C) enabling content read and write (C:H/I:H), with no availability impact.
Primary rating from Vendor (GitHub_M).
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
2DescriptionCVE.org
Tina is a headless content management system. Prior to tinacms 3.14.0 and @tinacms/app 2.5.14, the /~/* admin preview route in packages/tinacms/src/admin/index.tsx can turn an attacker-controlled hash-router splat into an off-origin iframe URL through packages/@tinacms/app/src/preview.tsx, while packages/@tinacms/app/src/lib/preview-origin.ts derives expectedOrigin from that same URL for the GraphQL message channel in packages/@tinacms/app/src/lib/graphql-reducer.ts. An unauthenticated attacker can send a crafted link to a signed-in editor, cause the admin to frame an attacker origin, and have that frame treated as the trusted preview. The attacker-controlled frame can submit GraphQL reads or mutations that the admin executes with the editor credentials, exposing or modifying protected content. This issue is fixed in tinacms 3.14.0 and @tinacms/app 2.5.14.
Blast Radius
ecosystem impact- 1 npm packages depend on @tinacms/app (1 direct, 0 indirect)
- 1 npm packages depend on tinacms (1 direct, 0 indirect)
Ecosystem-wide dependent count for version 2.5.14 and other introduced versions.
Technical POC Analysis
CWE-346 Origin Validation Error.
Full technical POC analysis - root cause, step-by-step exploitation and patch breakdown - is part of the Pro and Business plans.
Executive ViewAI
TinaCMS, the content management platform used to author and publish our web content, is affected by a critical flaw in which a single click on a crafted link by a signed-in editor can hand an outside attacker that editor's content read and write privileges. Because the attacker operates through the editor's own session, protected or unpublished content could be quietly exposed or altered without triggering normal access controls. Leadership should care because this directly threatens the integrity and confidentiality of published content and the trust customers and regulators place in it, and remediation requires coordinated upgrades of both the CMS core and its companion app package.
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
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
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
Cross-site request forgery in the TinaCMS CLI dev server allows an attacker-controlled web page to write arbitrary files
Broken access control across all four first-party TinaCMS production media adapters (next-tinacms-s3, next-tinacms-dos,
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-95990
GHSA-x34j-47hf-4xg7
NVD
CVE.org
EPSS
Exploit-DB