Security Digest · Vulnerability record

CVE-2026-108261: TinaCMS admin preview iframe loads an attacker-controlled origin from the URL fragment

Tina is a headless content management system.

CVSS 9.3 Critical EPSS 0.2% · p5

Should you act?

Critical and remotely reachable

No known exploitation yet, but it is network-reachable without credentials. This signal is computed from CISA KEV, EPSS and CVSS data; it is not an editorial verdict.

  • Not in CISA KEV, but CISA’s SSVC assessment records a public proof-of-concept, so attack code exists.
  • EPSS 0.2%, percentile 5: FIRST’s model estimates a 0.2% chance of exploitation activity in the next 30 days, higher than 5% of all scored CVEs (low). EPSS is a probability, not a verdict.
  • Needs a user to click or open something. Phishing makes that realistic, but it is not wormable.
  • Only applies if your dependency tree includes tinacms (npm) <= 3.13.0, fixed in 3.14.0; @tinacms/app (npm) <= 2.5.13, fixed in 2.5.14. Check your lockfile, including transitive dependencies.

What it is

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.

From the GitHub advisory

Summary

The TinaCMS admin builds its preview from the /~/ hash-router splat without checking that the value stays same-origin. A fragment with a doubled slash (#/~//attacker.example/p) becomes the protocol-relative URL //attacker.example/p, so the admin frames an external site. That same unvalidated string derives expectedOrigin, the only trust anchor for the admin↔preview postMessage channel, so the attacker's frame is treated as trusted: it can submit any GraphQL operation, which the admin executes with the signed-in editor's token and posts back to the attacker's origin.

One link, opened by a logged-in editor, gives an unauthenticated remote attacker arbitrary read and write access to the site's content API as that editor.

Details

Root cause — the router splat becomes the frame source with no same-origin check:

Weakness type: CWE-346, CWE-441, CWE-601.

Product: tinacms (npm) · Assigned by: GitHub_M · Published: 2026-10-09

Affected and fixed versions

EcosystemPackageVulnerableFirst fixed
npmtinacms<= 3.13.03.14.0
npm@tinacms/app<= 2.5.132.5.14
VendorProductAffected versions (per CVE record)
tinacmstinacms< 3.14.0
@tinacmsapp< 2.5.14

Severity scores

Scored byCVSSScoreVector
GitHub_M3.19.3 CriticalCVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
GitHub3.19.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
  • Attack vector: network (remotely reachable)
  • Attack complexity: low
  • Privileges required: none (no login)
  • User interaction: required (a user must click/open something)
  • Scope: changed (can affect other components)

CVSS measures how bad a flaw is if exploited, not how likely exploitation is. Read it next to the exploitation data below.

Exploitation and urgency

  • CISA KEV: not listed (no confirmed in-the-wild exploitation known to CISA).
  • CISA SSVC assessment: exploitation poc, automatable no, technical impact total.
  • FIRST EPSS (model of 2026-10-21): 0.16% probability of exploitation activity in the next 30 days; percentile 5.

Timeline

  • — CVE record published by GitHub_M
  • — GitHub-reviewed advisory GHSA-x34j-47hf-4xg7 published (critical)
  • — CVE record last updated

Sources and references

Original sources first. Version and fix details should always be confirmed against the vendor or project advisory.

Vulnerability records

  1. GitHub Advisory GHSA-x34j-47hf-4xg7 github.com
  2. CVE.org record CVE-2026-108261 cve.org
  3. NVD entry CVE-2026-108261 nvd.nist.gov

Other references from the CVE record and advisory

  1. github.com github.com
  2. github.com github.com
  3. github.com github.com
  4. github.com github.com
  5. github.com github.com

Critical npm advisories · Today’s Security Digest