<?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/"><channel><title>Directus (Less Than 12.0.0) - CraftedSignal Threat Feed</title><link>https://feed.craftedsignal.io/products/directus-less-than-12.0.0/</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>Mon, 20 Jul 2026 21:49:23 +0000</lastBuildDate><atom:link href="https://feed.craftedsignal.io/products/directus-less-than-12.0.0/feed.xml" rel="self" type="application/rss+xml"/><item><title>Directus Authorization Bypass via Cache Key Collision (CVE-2026-61836)</title><link>https://feed.craftedsignal.io/briefs/2026-07-directus-cache-key-auth-bypass/</link><pubDate>Mon, 20 Jul 2026 21:49:23 +0000</pubDate><author>hello@craftedsignal.io</author><guid isPermaLink="true">https://feed.craftedsignal.io/briefs/2026-07-directus-cache-key-auth-bypass/</guid><description>A vulnerability in Directus allows for an authorization bypass when response caching is enabled, leading to cross-share confidentiality breaches where sensitive data scoped for one share can be accessed by another share token holder or anonymous users due to an unsegmented cache key.</description><content:encoded><![CDATA[<p>A critical vulnerability, CVE-2026-61836, has been identified in Directus versions prior to 12.0.0. This flaw, classified under CWE-524 and CWE-639, allows for an authorization bypass affecting instances where response caching (<code>CACHE_ENABLED=true</code>) is active. The issue stems from an incomplete cache-key derivation process in <code>api/src/utils/get-cache-key.ts</code>, which fails to incorporate all necessary authorization contexts beyond the basic <code>user</code> identifier. Specifically, for share tokens and anonymous requests, the <code>user</code> attribute defaults to <code>null</code>, causing different share tokens or anonymous clients requesting the same URL and query to generate identical cache keys. This cache collision leads to unauthorized access; once a share populates the cache with its permission-filtered response, subsequent requests from other shares or anonymous users for the same resource retrieve the cached, potentially sensitive, payload without re-evaluating their specific permissions. The vulnerability is present in Directus deployments utilizing its caching feature, which is commonly enabled in production for performance benefits, and poses a significant risk of data exposure.</p>
<h2 id="attack-chain">Attack Chain</h2>
<ol>
<li><strong>Precondition</strong>: A Directus instance is configured with <code>CACHE_ENABLED=true</code> and has at least one active <code>directus_shares</code> configured, providing scoped read access to sensitive items (e.g., <code>/items/articles</code>).</li>
<li><strong>Share Configuration</strong>: A legitimate administrator creates a share token (e.g., <code>Share A</code>) to grant specific, limited read access to particular data items within Directus.</li>
<li><strong>Initial Request</strong>: A user possessing <code>Share Token A</code> makes an authenticated request to access shared, sensitive data (e.g., <code>GET /items/articles/123</code>).</li>
<li><strong>Cache Population</strong>: Directus processes the request, applies the specific authorization rules associated with <code>Share Token A</code>, retrieves the appropriate permission-filtered data, and stores this response in the configured cache.</li>
<li><strong>Cache Key Derivation Flaw</strong>: The cache key is generated using an incomplete set of authorization contexts (e.g., <code>version</code>, <code>path</code>, <code>query</code>, and <code>accountability.user</code>), with <code>accountability.user</code> being <code>null</code> for share tokens and anonymous requests.</li>
<li><strong>Subsequent Request</strong>: A different user, either holding <code>Share Token B</code> (distinct from <code>Share A</code>) or making an anonymous request, attempts to access the <em>exact same URL</em> (<code>GET /items/articles/123</code>).</li>
<li><strong>Cache Hit &amp; Bypass</strong>: Due to the identical cache key derived from the previous request, Directus retrieves and serves the already cached response without performing a fresh authorization check against <code>Share Token B</code>'s or the anonymous user's specific permissions.</li>
<li><strong>Unauthorized Data Access</strong>: The second user (with <code>Share Token B</code> or anonymous) gains unauthorized access to the sensitive data originally filtered and intended only for <code>Share Token A</code>.</li>
</ol>
<h2 id="impact">Impact</h2>
<p>This vulnerability can lead to severe cross-share confidentiality breaches. Any permission-filtered response populated in the cache by one share token can be served to any other share token holder or an anonymous request that subsequently hits the same URL and query, bypassing intended authorization. For instance, an anonymous client could retrieve sensitive, share-scoped data without any authentication. While password protection on shares exists at the JWT issuance stage, a cached response bypasses this once populated. The data leak persists for the duration of the <code>CACHE_TTL</code> window (typically 5-30 minutes) and can survive server restarts if <code>CACHE_STORE=redis</code> is used. The scope of the leaked data depends on the original share's permissions, ranging from primary keys to full content for shares backed by roles with broader field access. The bypass is read-only, meaning no write operations are affected.</p>
<h2 id="recommendation">Recommendation</h2>
<ul>
<li><strong>Patch CVE-2026-61836</strong>: Upgrade all Directus instances to version 12.0.0 or newer immediately to mitigate the vulnerability.</li>
<li><strong>Review <code>CACHE_ENABLED</code> Configuration</strong>: For instances that cannot be immediately patched, consider disabling <code>CACHE_ENABLED</code> by setting it to <code>false</code> in your Directus configuration, especially if <code>directus_shares</code> are in use and sensitive data is involved.</li>
<li><strong>Audit Share Configurations</strong>: Review all <code>directus_shares</code> to ensure they adhere to the principle of least privilege, minimizing the amount of sensitive data exposed even in the event of a bypass.</li>
</ul>
]]></content:encoded><category domain="severity">high</category><category domain="type">advisory</category><category>authorization-bypass</category><category>cache-poisoning</category><category>cve</category><category>web-application</category></item></channel></rss>