Skip to main content

TinaCMS CVE-2026-108260

| EUVDEUVD-2026-95989 HIGH
Cross-site Scripting (XSS) (CWE-79)
2026-10-09 GitHub_M GHSA-c42q-qvc3-j6vg
7.6
CVSS 3.1 · Vendor: GitHub_M
View

Attack ChainAIDerived

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

  1. Access
    Obtain content-author access to TinaCMS
  2. Delivery
    Store rich-text link with javascript: scheme
  3. Exploit
    Victim loads page rendered by tina-markdown
  4. Execution
    Victim clicks malicious anchor
  5. Persist
    Script executes in site origin
  6. Impact
    Exfiltrate same-origin data / admin credentials

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A05:2025 - Injection
ASVS 5.0
V1 - Encoding and Sanitization Output encoding, context-aware escaping
MITRE ATT&CK

2 techniques across 2 tactics: Initial Access, Execution

The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up.

Exploitation Conditions

Requires (1) an authenticated TinaCMS content-author account able to save a rich-text link, (2) the target site to render that content specifically through the @tinacms/web-components tina-markdown element (versions <= 0.2.0) - the React, static, and Astro rich-text renderers are NOT affected because they call sanitizeUrl - and (3) a victim to actually click the rendered link (UI:R). Maximum impact (credential exposure) additionally requires the clicking victim to be a TinaCMS editor or administrator whose session/credentials live on that origin. Limiting factors: author-level privilege prerequisite, required victim click, and the narrow condition that the deployment uses the web-components renderer rather than the default React/Astro paths.

Impact

This is a stored (persistent) cross-site scripting flaw (CWE-79) rated CVSS 7.6 with vector AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N. The signals are internally consistent and credible: network-reachable, low complexity, but gated by two real friction points - PR:L means the attacker must already hold a TinaCMS content-author account, and UI:R means a victim must click the malicious link. The S:C (scope change) and C:H are justified because script executing in the site origin can read same-origin application data and, if the victim is an editor/admin, harvest TinaCMS admin credentials stored on that origin. No EPSS score, KEV listing, or public POC is present in the supplied data, so this is NOT a confirmed actively-exploited issue; it is a vendor-disclosed (GitHub advisory GHSA-c42q-qvc3-j6vg), patched vulnerability. Realistically this is a moderate-priority issue rather than a drop-everything emergency: the authenticated-author precondition plus required victim click, plus the fact that only the @tinacms/web-components renderer is affected (the six sibling React/Astro renderers already sanitize), substantially narrow the real-world attack surface. Treat as higher priority on multi-author sites where content-author accounts are loosely controlled.

Exploit ScenarioDerived

A user with content-author access to a TinaCMS instance edits a rich-text field and inserts a link whose target uses a script-capable scheme (e.g. javascript:...), which is stored via the content API. When a site built on the @tinacms/web-components tina-markdown element renders that content and a visitor - ideally an editor or administrator - clicks the link, attacker-controlled script runs in the site's origin and can read same-origin data or exfiltrate stored admin credentials. No public exploit code is identified in the supplied data, though the patch's own test uses 'javascript:alert(1)' as the canonical trigger.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
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

Stored cross-site scripting in TinaCMS's @tinacms/web-components package (all versions up to and including 0.2.0) lets an authenticated content author save a rich-text link whose URL uses a script-capable scheme such as javascript:, which the tina-markdown element then writes straight into an anchor href; a visitor who clicks the rendered link executes attacker-controlled script in the site's origin. Because the payload persists in CMS content and runs in the victim's origin, an editor or administrator who clicks it can expose TinaCMS admin credentials held on that site (CVSS 7.6, AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N, CWE-79). Key prerequisites are an author-level account, a deployment that renders content via the web-components renderer rather than the sanitizing React, static, or Astro renderers, and a victim click; no public exploit code and no confirmed active exploitation were identified at time of analysis.

RemediationAI

Vendor-released patch: upgrade @tinacms/web-components to 0.2.1 (or later), which imports sanitizeUrl from @tinacms/mdx and applies the ['http','https','mailto','tel','xref'] allow list to both anchor href and image src, so a disallowed scheme renders as an empty attribute instead of a live javascript: link; the release is tagged at https://github.com/tinacms/tinacms/releases/tag/@tinacms/web-components@0.2.1, with the fix in PR https://github.com/tinacms/tinacms/pull/7523 and commit https://github.com/tinacms/tinacms/commit/5295e077f0d279c35686a0e481a15e33a4877e3b, and the advisory is https://github.com/tinacms/tinacms/security/advisories/GHSA-c42q-qvc3-j6vg. If immediate upgrade is not possible, switch affected deployments to the React, static, or Astro rich-text renderers, which already sanitize URLs, or sanitize node.url server-side before it is written into the content attribute the element consumes (drop any scheme outside the http/https/mailto/tel/xref allow list); both options trade implementation effort for closing the sink and must cover image URLs as well as anchors. A Content-Security-Policy with a strict script-src that does not permit inline/unsafe execution blocks navigation to javascript: URLs in most browsers as a defense-in-depth measure, but it is only a secondary control, may break legitimate inline scripts, and does not fix the underlying unvalidated sink. Also reduce the author-level attack surface by limiting who can save rich-text content and, if the deployment cannot verify renderer usage, treat any TinaCMS install where editors and administrators browse CMS-authored pages in the same origin as exposed. Note that DOMPurify inside tina-markdown only covers html/html_inline node values, so it does not mitigate the anchor href or image src sinks.

Affected VersionsENISA

web-components < 0.2.1
tinacms < 3.14.0

Affected Packages

npm @tinacms/web-components fix: 0.2.1
euvd tinacms fix: 3.14.0
euvd web_components fix: 0.2.1

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

TinaCMS is a headless content management system, and @tinacms/web-components is its framework-agnostic custom-element renderer. The tina-markdown element turns a rich-text AST supplied through the content attribute (sourced from the TinaCMS content API) into DOM nodes inside an open shadow root. At packages/@tinacms/web-components/src/tina-markdown.js:75, the node.url of a link node is assigned directly to el.href with no scheme validation: it is a raw property assignment, so the browser's HTML parser and DOMPurify are never involved. DOMPurify is invoked at line 68, but only for html/html_inline node values and it returns before the anchor branch, so it never inspects node.url. The vulnerability class is CWE-79 (Improper Neutralization of Input During Web Page Generation, specifically stored/persistent XSS): the root cause is a missing allow-list on a URL sink. The repository already contains the correct guard, sanitizeUrl in packages/@tinacms/mdx/src/sanitize-url.ts, whose allow list is ['http','https','mailto','tel','xref'], and six other renderers apply it (tinacms/src/rich-text/index.tsx:322 and :335, static.tsx:242 and :254, @tinacms/astro LinkNode.astro:19 and ImageNode.astro:16); the web-components renderer is the sole sink that omits it. The open shadow root provides no script isolation, so a javascript: URL navigates in the page's origin and its script gains the same-origin context, including any TinaCMS admin credentials or session data stored on that origin. CPE data (cpe:2.3:a:tinacms:tinacms:*:*:*:*:*:*:*:* and cpe:2.3:a:@tinacms:web-components:*:*:*:*:*:*:*:*) is version-wildcarded, so the authoritative version boundary comes from the advisory: npm package @tinacms/web-components vulnerable at <= 0.2.0, fixed in 0.2.1.

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 7.6 HIGH
AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N
vuln.today AI 7.6 HIGH

Attacker needs a content-author account (PR:L) and a victim click (UI:R); stored script runs in the site origin crossing a security boundary (S:C) exposing same-origin/admin data (C:H), minor integrity (I:L), no availability impact.

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

Primary rating from Vendor (GitHub_M).

CVSS VectorVendor: GitHub_M

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

Lifecycle Timeline

2
Patch available
Oct 09, 2026 - 22:17 EUVD
CVE Published
Oct 09, 2026 - 20:40 cve.org
HIGH 7.6

DescriptionCVE.org

Tina is a headless content management system. Prior to 0.2.1, the tina-markdown element in packages/@tinacms/web-components/src/tina-markdown.js assigns a rich-text node.url value directly to an anchor href without validating the URL scheme. A content author can store a link using a script-capable scheme, and a visitor who clicks the rendered link executes attacker-controlled script in the site's origin. The script can access same-origin application data and, when the visitor is an editor or administrator, may expose credentials stored by the TinaCMS admin on that origin. This issue is fixed in version 0.2.1.

Technical POC Analysis

CWE-79 (with CWE-83, script in an attribute URI) in packages/@tinacms/web-components/src/tina-markdown.js:75: js if (node.url && node.type === 'a') el.href = node.url; <tina-markdown walks a rich-tex…

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

A stored cross-site scripting flaw in TinaCMS's @tinacms/web-components package (versions up to and including 0.2.0) allows an authenticated content author to plant persistent malicious links that execute attacker-controlled script in the origin of any site rendering content through the web-components renderer. The primary business risk is credential exposure: editors and administrators who click an affected link can have their TinaCMS admin sessions and stored credentials compromised, potentially handing an attacker control over published content and the CMS itself. Because the malicious payload is stored as ordinary CMS content and requires only an author-level account plus a single victim click, this affects content, marketing, and any team operating TinaCMS-backed sites with the vulnerable renderer.

Business Impact: High
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: migrate rendering away from the vulnerable tina-markdown web component to the sanitizing React, static, or Astro renderers; enforce URL scheme allowlisting (http/https only) at input and output; apply a restrictive Content Security Policy; restrict and audit author-level accounts; scan and remediate stored CMS content for script-capable link schemes; rotate TinaCMS admin credentials and invalidate sessions; monitor logs and WAF alerts for script-scheme URLs.

Threat Intelligence Overview

EPSS Score
0.2%
Top 90% exploitable
Prevalence
Low
niche Git-backed headless CMS; web-components renderer is a minority code path
Threat Intel
1
1 source
Social Media
3
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 HIGH
CISA KEV No
Public POC No
EPSS 0.2%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
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

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

Attack Technique

Cross-Site Scripting occurs when an application accepts untrusted data and sends it to a web browser without proper validation or encoding.

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