Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessLoad public storefront bundle
-
DeliveryExtract revalidateProducts Server Action id from /_next/static chunk
-
ExploitPOST action id directly (no auth)
-
ExecutionupdateTag('products') expires entire cache
-
PersistLoop to keep cache cold
-
ImpactStorefront reads catalog from Postgres, availability degrades
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A07:2025 - Authentication Failures
ASVS 5.0
V6 - Authentication Authentication required for critical functions
MITRE ATT&CK
1 technique across 1 tactic: Initial Access The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | Exploitable only when the deployed instance runs the vulnerable code (before commit ec97209) with Next.js cacheComponents enabled so storefront pages are served from 'use cache' entries tagged 'products' with an hours-long cacheLife - this is the condition that turns cache invalidation into meaningful availability impact. Additionally, the revalidateProducts action must be reachable: it becomes so because src/components/admin client components import it, forcing its Server Action id into a public /_next/static chunk, while the admin middleware in proxy.ts fails to gate the action endpoint. No authentication, user interaction, or special privileges are required (PR:N/UI:N); the practical limiter is that this is a self-hosted open-source template, so exposure depends on how each operator configured caching and middleware. |
| Impact | This is a genuine but strictly availability-scoped issue, not a high-severity emergency. The CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N with VC:N/VI:N/VA:L) is internally consistent with the description: fully remote and unauthenticated with no complexity barriers, but the only impact is low availability degradation - no confidentiality or integrity loss. There is no EPSS score, no CISA KEV listing, and no public exploit code identified; the only references are the vendor patch commit and the reporter's advisory. SSVC-wise, exploitation is technically automatable (a trivial repeatable POST loop) but technical impact is 'partial' at best (cache denial forcing DB reads, not full service takedown), so this rates as track/act-later rather than a priority. The dominant risk-limiting factor is prevalence, not the vulnerability class: this is an open-source Next.js ecommerce starter template, so real-world blast radius depends entirely on how many derived deployments enabled cacheComponents and left the action ungated. Net: real but low-priority; the 6.9 base score overstates urgency because it does not weight the near-zero deployment footprint of the affected product. |
| Exploit ScenarioDerived | An unauthenticated attacker loads the storefront, extracts the compiled Server Action id for revalidateProducts from a public /_next/static JavaScript chunk, then repeatedly POSTs that action id directly to the site. Each call invalidates the 'products' cache tag, keeping the cacheComponents cache permanently cold so every visitor request falls through to Postgres, degrading storefront performance and availability at near-zero attacker cost. No public exploit code was identified at time of analysis, though the technique is fully described in the advisory. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Sep 28, 2026
Unauthenticated remote attackers can repeatedly invoke the revalidateProducts Server Action in the MarcosCamara01 Ecommerce Template (all revisions before commit ec97209) to forcibly expire the entire storefront product cache, driving near-zero-cost cache thrash and availability degradation. The action lives in src/app/actions.ts under a file-scope "use server" directive and calls updateTag("products") with no session or role check, unlike the read-only actions in the same file; because two client components under src/components/admin import it, its Server Action id is compiled into a public /_next/static chunk that the proxy.ts admin middleware does not gate, so any remote user can harvest the id and POST it directly. Impact is strictly availability-scoped (CVSS 4.0 base 6.9; assessed CVSS 3.1 AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L) and the reachable condition is deployment-dependent: it matters when cacheComponents is enabled and storefront pages are served from 'use cache' entries tagged 'products' with an hours-long cacheLife, an open-source self-hosted template configuration chosen by each operator. No public exploit code was identified at time of analysis and there is no KEV confirmation of active exploitation.
RemediationAI
The fix is upstream in commit ec97209e6c7663cba7b5164468d6946cbfe2f19a (upstream fix available as a PR/commit; a released tagged patched version was not independently confirmed), so operators should update to that revision or later via https://github.com/MarcosCamara01/ecommerce-template/commit/ec97209e6c7663cba7b5164468d6946cbfe2f19a and re-verify the revalidateProducts action now enforces a session/role check. Until they can upgrade, the highest-value compensating control is to add an explicit authorization gate - a session and role assertion inside revalidateProducts (and any other mutating Server Action in src/app/actions.ts) plus a matching check in proxy.ts that covers Server Action POSTs rather than only admin page routes - noting the trade-off that any missed entry point reintroduces the issue and that middleware changes require careful testing against legitimate admin traffic. A second control is to stop the action id from being publicly discoverable by moving the admin import boundary so mutating actions are not pulled into client chunks, at the cost of refactoring admin components. Operators who cannot patch immediately can also reduce blast radius by disabling cacheComponents or shortening the "products" tag cacheLife from hours to minutes so that forced invalidation produces far less origin load, accepting slower page renders and higher baseline database traffic. Edge rate limiting or a WAF rule that throttles or blocks repeated POSTs carrying the Next-Action header from unauthenticated clients will blunt the loop but is fragile because the header is legitimate for normal Server Action traffic and tuning risks breaking storefront functionality, and any such rule should be scoped to the specific action id rather than all Server Action requests. Finally, ensure PostgreSQL connection limits and pool sizing can absorb a cold-cache surge, since that is where the degradation manifests. The reporter's advisory is at https://secur0.com/en/cna/cve-list/cve-2026-91154-missing-authentication-ecommerce-template-cache-revalidation-dos.
Affected VersionsENISA
Affects your stack
Find out whether the stacks and servers you run are on an affected version.
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The root cause class is CWE-306 (Missing Authentication for Critical Function). Next.js App Router Server Actions are declared with a "use server" directive; when that directive sits at file scope, every exported function in the file is compiled into a POST-invokable Server Action with a generated, deterministic action id, and importing any of those functions from a client component causes the id to be emitted into the public /_next/static JavaScript bundle. In this template, src/app/actions.ts contains the mutating revalidateProducts function, which calls updateTag("products") without any session, role, or authorization check, while the read-only data actions in the same module are safe by construction because they only read. The privacy-relevant complication is Next.js caching: with cacheComponents enabled, getAllProducts, getCategoryProducts and getProduct produce "use cache" entries tagged "products" with an hours-long cacheLife, and those entries back the home, category, product and search pages. Because the invalidation tag is global to the storefront, one unauthenticated POST is enough to drop the whole catalogue cache, and repeated invocations keep it permanently cold so every visitor request falls through to PostgreSQL. The admin middleware in proxy.ts gates the admin routes but does not gate the Server Action endpoint, and combined with CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N this yields an unauthenticated, low-complexity, network-reachable availability weakness with no confidentiality or integrity impact and no scope change.
Know when Ecommerce Template 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
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N
Remote, unauthenticated, no interaction against the exposed Server Action (AV:N/AC:L/PR:N/UI:N); impact is limited to cache-denial performance degradation, so A:L and C:N/I:N.
Primary rating from Vendor (Secur0).
CVSS VectorVendor: Secur0
DescriptionCVE.org
Missing Authentication for Critical Function (CWE-306) in the product cache revalidation Server Action (src/app/actions.ts, revalidateProducts) in MarcosCamara01 Ecommerce Template before commit ec97209 allows a remote, unauthenticated attacker to force expiration of the entire storefront product cache at will. The file declares "use server" at file scope, so every exported function compiles into a POST-invokable Server Action; revalidateProducts calls updateTag("products") with no session or role check, unlike the read-only actions in the same file which are safe by construction. Two client components under src/components/admin import the function, which causes its Server Action id to be compiled into a public /_next/static chunk that the application's admin middleware (proxy.ts) does not gate, so any unauthenticated user can extract that id from the public bundle and invoke the action directly. With cacheComponents enabled, the entire storefront (home, categories, product pages, search) is served from "use cache" entries produced by getAllProducts, getCategoryProducts and getProduct, all tagged products with an hours-long cacheLife. Repeated unauthenticated invocation of revalidateProducts keeps that cache permanently cold, forcing every visitor's request to read the full product catalog from Postgres instead of serving from cache, degrading storefront availability at near-zero attacker cost.
Threat Intelligence Overview
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.
EUVD-2026-88333
GHSA-v9ch-cf39-43vr
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB