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
| Ecosystem | Package | Vulnerable | First fixed |
|---|---|---|---|
| npm | tinacms | <= 3.13.0 | 3.14.0 |
| npm | @tinacms/app | <= 2.5.13 | 2.5.14 |
| Vendor | Product | Affected versions (per CVE record) |
|---|---|---|
| tinacms | tinacms | < 3.14.0 |
| @tinacms | app | < 2.5.14 |
Severity scores
| Scored by | CVSS | Score | Vector |
|---|---|---|---|
| GitHub_M | 3.1 | 9.3 Critical | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N |
| GitHub | 3.1 | 9.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
- GitHub Advisory GHSA-x34j-47hf-4xg7 github.com
- CVE.org record CVE-2026-108261 cve.org
- NVD entry CVE-2026-108261 nvd.nist.gov
Other references from the CVE record and advisory
- github.com github.com
- github.com github.com
- github.com github.com
- github.com github.com
- github.com github.com