Skip to main content

TinaCMS CVE-2026-108261

| EUVDEUVD-2026-95990 CRITICAL
Origin Validation Error (CWE-346)
2026-10-09 GitHub_M GHSA-x34j-47hf-4xg7
9.3
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Craft malicious hash-router link
  2. Delivery
    Phish signed-in editor to open it
  3. Exploit
    Admin frames attacker origin as trusted preview
  4. Execution
    Frame posts GraphQL ops over postMessage
  5. Persist
    Admin executes with editor credentials
  6. Impact
    Read/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.

Act Now Prioritize within 24-48h. Why: CRITICAL severity.
Patch available 0.2% exploitation probability (EPSS)

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

Alert me

AnalysisAIv1 – 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

App < 2.5.14
tinacms < 3.14.0

Affected Packages

npm @tinacms/app fix: 2.5.14
npm tinacms fix: 3.14.0
euvd app fix: 2.5.14

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

Vendor (GitHub_M) PRIMARY 9.3 CRITICAL
AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
vuln.today AI 9.3 CRITICAL

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.

3.1 AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
4.0 AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

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

Lifecycle Timeline

2
Patch available
Oct 09, 2026 - 22:17 EUVD
CVE Published
Oct 09, 2026 - 20:43 cve.org
CRITICAL 9.3

DescriptionCVE.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
† from your stack dependencies † transitive graph · vuln.today resolves 4-path depth
  • 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

Why It Matters

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.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 95% exploitable
Prevalence
Medium
popular open-source headless CMS with moderate Jamstack adoption
Threat Intel
1
1 source
Social Media
5
Sightings
Data Quality
5 sources
Confidence: Medium

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 CRITICAL
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
CRITICAL severity
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· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
High

Priority Score

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

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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