<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:webfeeds="http://webfeeds.org/rss/1.0"><channel><title>Next-Tinacms-Cloudinary - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/products/next-tinacms-cloudinary/</link><description>Trending threats, MITRE ATT&amp;CK coverage, and detection metadata. Fed continuously.</description><generator>Hugo</generator><language>en</language><managingEditor>hello@craftedsignal.io</managingEditor><webMaster>hello@craftedsignal.io</webMaster><lastBuildDate>Thu, 17 Sep 2026 19:14:33 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/products/next-tinacms-cloudinary/feed.xml" rel="self" type="application/rss+xml"/><image><url>https://feed.craftedsignal.io/favicon-32x32.png</url><title>CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/</link><width>32</width><height>32</height></image><webfeeds:icon>https://feed.craftedsignal.io/favicon.svg</webfeeds:icon><item><title>Broken Access Control in TinaCMS Authorization</title><link>https://feed.craftedsignal.io/briefs/2026-09-tinacms-auth-bypass/</link><pubDate>Thu, 17 Sep 2026 19:14:33 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-09-tinacms-auth-bypass/</guid><description>A broken access control vulnerability in @tinacms/auth allows attackers to perform unauthorized actions by supplying their own valid TinaCloud credentials against a victim's TinaCMS deployment.</description><content:encoded><![CDATA[<p>The <code>@tinacms/auth</code> package contains a critical broken access control vulnerability (confirmed at commit 5a6839f) that permits unauthorized cross-tenant access. The <code>isAuthorized(req)</code> function performs authorization by validating a bearer token against an identity provider endpoint (<code>https://identity.tinajs.io/v2/apps/${req.query.clientID}/currentUser</code>). Crucially, the function retrieves the <code>clientID</code> from the user-provided request parameters rather than comparing it against the site's locally configured TinaCloud application ID.</p>
<p>An attacker with a standard TinaCloud account can exploit this by creating their own application, obtaining a valid token, and submitting requests to a victim site with their own <code>clientID</code> and token. The victim's application incorrectly validates the credentials against the attacker's own app, returning an authorized response. This vulnerability exposes critical functionality, including media bucket management and full GraphQL content read/write/delete capabilities when using the default <code>TinaCloudBackendAuthProvider</code>. The flaw exists across multiple integration libraries, including <code>next-tinacms-cloudinary</code>, <code>next-tinacms-azure</code>, and <code>next-tinacms-dos</code>.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li>Attacker registers a free TinaCloud account and creates a personal application to obtain a valid <code>clientID</code> and bearer token.</li>
<li>Attacker identifies a target self-hosted TinaCMS site that utilizes the vulnerable <code>@tinacms/auth</code> package or its derived media-store integrations.</li>
<li>Attacker crafts a malicious HTTP request (e.g., <code>GET /api/cloudinary/media</code>) targeting the victim's API endpoint.</li>
<li>Attacker includes their own <code>clientID</code> as a query parameter and their own valid TinaCloud bearer token in the <code>Authorization</code> header.</li>
<li>The victim's backend calls <code>isAuthorized(req)</code>, which incorrectly performs a look-up at <code>identity.tinajs.io</code> using the attacker-supplied <code>clientID</code>.</li>
<li>The identity provider returns a successful validation status because the credentials are valid for the attacker's own app.</li>
<li>The victim's backend logic, failing to pin the <code>clientID</code> to the site-specific ID, returns an <code>authorized: true</code> response to the media or GraphQL handler.</li>
<li>The attacker performs unauthorized actions, such as reading private media, uploading arbitrary files to the victim's CDN, or deleting/modifying site content.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>Successful exploitation allows an unauthenticated attacker to gain editor-level control over unrelated TinaCMS tenants. Impacts include the ability to list, read, or delete sensitive files within the victim's media bucket. Furthermore, when <code>TinaCloudBackendAuthProvider</code> is active, the attacker gains full GraphQL access, enabling the exfiltration of site content or the injection of malicious data into the CMS.</p>
<h2 id="recommendation">Recommendation</h2>
<ol>
<li>Immediately audit all instances of <code>@tinacms/auth</code> and associated media/backend providers in self-hosted TinaCMS deployments.</li>
<li>Implement strict server-side validation to ensure the <code>clientID</code> provided in incoming requests matches the hard-coded or environment-configured application ID for that specific site.</li>
<li>Avoid relying solely on the return value of <code>isAuthorized(req)</code> without verifying that the returned <code>user</code> object's associated <code>appId</code> matches the expected deployment identifier.</li>
<li>Block or monitor suspicious inbound requests to <code>/api/cloudinary/media</code> or <code>/api/tina/gql</code> where the <code>clientID</code> parameter does not match your organization's known TinaCloud <code>clientID</code>.</li>
</ol>
]]></content:encoded><category domain="severity">high</category><category domain="type">advisory</category></item></channel></rss>