CVE-2026-91154 (GCVE-0-2026-91154)
Vulnerability from cvelistv5
Published
2026-09-28 15:29
Modified
2026-09-28 17:52
Severity ?
VLAI Severity ?
EPSS score ?
CWE
- CWE-306 - Missing Authentication for Critical Function
Summary
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.
References
| URL | Tags | |
|---|---|---|
Impacted products
| Vendor | Product | Version | ||
|---|---|---|---|---|
| MarcosCamara01 | Ecommerce Template |
Version: 0 < ec97209 |
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-91154",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "yes"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-28T17:52:26.669048Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-28T17:52:40.759Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"defaultStatus": "unaffected",
"modules": [
"Product cache revalidation Server Action"
],
"product": "Ecommerce Template",
"programFiles": [
"src/app/actions.ts"
],
"repo": "https://github.com/MarcosCamara01/ecommerce-template",
"vendor": "MarcosCamara01",
"versions": [
{
"lessThan": "ec97209",
"status": "affected",
"version": "0",
"versionType": "custom"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:marcoscamara01:ecommerce-template:*:*:*:*:*:*:*:*",
"versionEndExcluding": "ec97209",
"versionStartIncluding": "0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "OR"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Robert Mihaila"
},
{
"lang": "en",
"type": "finder",
"value": "Amirreza Fadaeizadeh Bidari"
},
{
"lang": "en",
"type": "analyst",
"value": "Dario Rivas Quero"
},
{
"lang": "en",
"type": "coordinator",
"value": "Secur0 CNA"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eMissing Authentication for Critical Function (CWE-306) in the product cache revalidation Server Action (\u003ccode\u003esrc/app/actions.ts\u003c/code\u003e, \u003ccode\u003erevalidateProducts\u003c/code\u003e) in MarcosCamara01 Ecommerce Template before commit \u003ccode\u003eec97209\u003c/code\u003e allows a remote, unauthenticated attacker to force expiration of the entire storefront product cache at will. The file declares \u003ccode\u003e\"use server\"\u003c/code\u003e at file scope, so every exported function compiles into a POST-invokable Server Action; \u003ccode\u003erevalidateProducts\u003c/code\u003e calls \u003ccode\u003eupdateTag(\"products\")\u003c/code\u003e with no session or role check, unlike the read-only actions in the same file which are safe by construction. Two client components under \u003ccode\u003esrc/components/admin\u003c/code\u003e import the function, which causes its Server Action id to be compiled into a public \u003ccode\u003e/_next/static\u003c/code\u003e chunk that the application\u0027s admin middleware (\u003ccode\u003eproxy.ts\u003c/code\u003e) does not gate, so any unauthenticated user can extract that id from the public bundle and invoke the action directly. With \u003ccode\u003ecacheComponents\u003c/code\u003e enabled, the entire storefront (home, categories, product pages, search) is served from \u003ccode\u003e\"use cache\"\u003c/code\u003e entries produced by \u003ccode\u003egetAllProducts\u003c/code\u003e, \u003ccode\u003egetCategoryProducts\u003c/code\u003e and \u003ccode\u003egetProduct\u003c/code\u003e, all tagged \u003ccode\u003eproducts\u003c/code\u003e with an hours-long \u003ccode\u003ecacheLife\u003c/code\u003e. Repeated unauthenticated invocation of \u003ccode\u003erevalidateProducts\u003c/code\u003e keeps that cache permanently cold, forcing every visitor\u0027s request to read the full product catalog from Postgres instead of serving from cache, degrading storefront availability at near-zero attacker cost.\u003c/p\u003e"
}
],
"value": "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\u0027s 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\u0027s request to read the full product catalog from Postgres instead of serving from cache, degrading storefront availability at near-zero attacker cost."
}
],
"impacts": [
{
"capecId": "CAPEC-1",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-1 Accessing Functionality Not Properly Constrained by ACLs"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 6.9,
"baseSeverity": "MEDIUM",
"exploitMaturity": "NOT_DEFINED",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "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",
"version": "4.0",
"vulnAvailabilityImpact": "LOW",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "NONE",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-306",
"description": "CWE-306 Missing Authentication for Critical Function",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-28T15:29:03.261Z",
"orgId": "4daa8cea-433a-44bd-9456-53b127fc289a",
"shortName": "Secur0"
},
"references": [
{
"tags": [
"patch"
],
"url": "https://github.com/MarcosCamara01/ecommerce-template/commit/ec97209e6c7663cba7b5164468d6946cbfe2f19a"
},
{
"tags": [
"third-party-advisory",
"technical-description"
],
"url": "https://secur0.com/en/cna/cve-list/cve-2026-91154-missing-authentication-ecommerce-template-cache-revalidation-dos"
}
],
"solutions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eUpdate to a build including commit \u003ccode\u003eec97209\u003c/code\u003e, which moves \u003ccode\u003erevalidateProducts\u003c/code\u003e out of the file-scoped \u003ccode\u003e\"use server\"\u003c/code\u003e module into a server-only module and restricts its only network-reachable caller (\u003ccode\u003eGET /api/cron/catalog-sync\u003c/code\u003e) with an internal credential check. Do not export unauthenticated mutations from a file-scoped \u003ccode\u003e\"use server\"\u003c/code\u003e module; gate any cache-invalidation action behind an admin/session check or remove the client-callable export entirely.\u003c/p\u003e"
}
],
"value": "Update to a build including commit ec97209, which moves revalidateProducts out of the file-scoped \"use server\" module into a server-only module and restricts its only network-reachable caller (GET /api/cron/catalog-sync) with an internal credential check. Do not export unauthenticated mutations from a file-scoped \"use server\" module; gate any cache-invalidation action behind an admin/session check or remove the client-callable export entirely."
}
],
"source": {
"discovery": "EXTERNAL"
},
"tags": [
"x_open-source"
],
"title": "Missing authentication in Ecommerce Template product cache revalidation allows unauthenticated denial of service"
}
},
"cveMetadata": {
"assignerOrgId": "4daa8cea-433a-44bd-9456-53b127fc289a",
"assignerShortName": "Secur0",
"cveId": "CVE-2026-91154",
"datePublished": "2026-09-28T15:29:03.261Z",
"dateReserved": "2026-09-14T21:05:54.953Z",
"dateUpdated": "2026-09-28T17:52:40.759Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"vulnrichment": {
"containers": "{\"adp\": [{\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-91154\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"none\"}, {\"Automatable\": \"yes\"}, {\"Technical Impact\": \"partial\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-09-28T17:52:26.669048Z\"}}}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-09-28T17:52:36.424Z\"}}], \"cna\": {\"tags\": [\"x_open-source\"], \"title\": \"Missing authentication in Ecommerce Template product cache revalidation allows unauthenticated denial of service\", \"source\": {\"discovery\": \"EXTERNAL\"}, \"credits\": [{\"lang\": \"en\", \"type\": \"finder\", \"value\": \"Robert Mihaila\"}, {\"lang\": \"en\", \"type\": \"finder\", \"value\": \"Amirreza Fadaeizadeh Bidari\"}, {\"lang\": \"en\", \"type\": \"analyst\", \"value\": \"Dario Rivas Quero\"}, {\"lang\": \"en\", \"type\": \"coordinator\", \"value\": \"Secur0 CNA\"}], \"impacts\": [{\"capecId\": \"CAPEC-1\", \"descriptions\": [{\"lang\": \"en\", \"value\": \"CAPEC-1 Accessing Functionality Not Properly Constrained by ACLs\"}]}], \"metrics\": [{\"format\": \"CVSS\", \"cvssV4_0\": {\"Safety\": \"NOT_DEFINED\", \"version\": \"4.0\", \"Recovery\": \"NOT_DEFINED\", \"baseScore\": 6.9, \"Automatable\": \"NOT_DEFINED\", \"attackVector\": \"NETWORK\", \"baseSeverity\": \"MEDIUM\", \"valueDensity\": \"NOT_DEFINED\", \"vectorString\": \"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\", \"exploitMaturity\": \"NOT_DEFINED\", \"providerUrgency\": \"NOT_DEFINED\", \"userInteraction\": \"NONE\", \"attackComplexity\": \"LOW\", \"attackRequirements\": \"NONE\", \"privilegesRequired\": \"NONE\", \"subIntegrityImpact\": \"NONE\", \"vulnIntegrityImpact\": \"NONE\", \"subAvailabilityImpact\": \"NONE\", \"vulnAvailabilityImpact\": \"LOW\", \"subConfidentialityImpact\": \"NONE\", \"vulnConfidentialityImpact\": \"NONE\", \"vulnerabilityResponseEffort\": \"NOT_DEFINED\"}, \"scenarios\": [{\"lang\": \"en\", \"value\": \"GENERAL\"}]}], \"affected\": [{\"repo\": \"https://github.com/MarcosCamara01/ecommerce-template\", \"vendor\": \"MarcosCamara01\", \"modules\": [\"Product cache revalidation Server Action\"], \"product\": \"Ecommerce Template\", \"versions\": [{\"status\": \"affected\", \"version\": \"0\", \"lessThan\": \"ec97209\", \"versionType\": \"custom\"}], \"programFiles\": [\"src/app/actions.ts\"], \"defaultStatus\": \"unaffected\"}], \"solutions\": [{\"lang\": \"en\", \"value\": \"Update to a build including commit ec97209, which moves revalidateProducts out of the file-scoped \\\"use server\\\" module into a server-only module and restricts its only network-reachable caller (GET /api/cron/catalog-sync) with an internal credential check. Do not export unauthenticated mutations from a file-scoped \\\"use server\\\" module; gate any cache-invalidation action behind an admin/session check or remove the client-callable export entirely.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"\u003cp\u003eUpdate to a build including commit \u003ccode\u003eec97209\u003c/code\u003e, which moves \u003ccode\u003erevalidateProducts\u003c/code\u003e out of the file-scoped \u003ccode\u003e\\\"use server\\\"\u003c/code\u003e module into a server-only module and restricts its only network-reachable caller (\u003ccode\u003eGET /api/cron/catalog-sync\u003c/code\u003e) with an internal credential check. Do not export unauthenticated mutations from a file-scoped \u003ccode\u003e\\\"use server\\\"\u003c/code\u003e module; gate any cache-invalidation action behind an admin/session check or remove the client-callable export entirely.\u003c/p\u003e\", \"base64\": false}]}], \"references\": [{\"url\": \"https://github.com/MarcosCamara01/ecommerce-template/commit/ec97209e6c7663cba7b5164468d6946cbfe2f19a\", \"tags\": [\"patch\"]}, {\"url\": \"https://secur0.com/en/cna/cve-list/cve-2026-91154-missing-authentication-ecommerce-template-cache-revalidation-dos\", \"tags\": [\"third-party-advisory\", \"technical-description\"]}], \"descriptions\": [{\"lang\": \"en\", \"value\": \"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\u0027s 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\u0027s request to read the full product catalog from Postgres instead of serving from cache, degrading storefront availability at near-zero attacker cost.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"\u003cp\u003eMissing Authentication for Critical Function (CWE-306) in the product cache revalidation Server Action (\u003ccode\u003esrc/app/actions.ts\u003c/code\u003e, \u003ccode\u003erevalidateProducts\u003c/code\u003e) in MarcosCamara01 Ecommerce Template before commit \u003ccode\u003eec97209\u003c/code\u003e allows a remote, unauthenticated attacker to force expiration of the entire storefront product cache at will. The file declares \u003ccode\u003e\\\"use server\\\"\u003c/code\u003e at file scope, so every exported function compiles into a POST-invokable Server Action; \u003ccode\u003erevalidateProducts\u003c/code\u003e calls \u003ccode\u003eupdateTag(\\\"products\\\")\u003c/code\u003e with no session or role check, unlike the read-only actions in the same file which are safe by construction. Two client components under \u003ccode\u003esrc/components/admin\u003c/code\u003e import the function, which causes its Server Action id to be compiled into a public \u003ccode\u003e/_next/static\u003c/code\u003e chunk that the application\u0027s admin middleware (\u003ccode\u003eproxy.ts\u003c/code\u003e) does not gate, so any unauthenticated user can extract that id from the public bundle and invoke the action directly. With \u003ccode\u003ecacheComponents\u003c/code\u003e enabled, the entire storefront (home, categories, product pages, search) is served from \u003ccode\u003e\\\"use cache\\\"\u003c/code\u003e entries produced by \u003ccode\u003egetAllProducts\u003c/code\u003e, \u003ccode\u003egetCategoryProducts\u003c/code\u003e and \u003ccode\u003egetProduct\u003c/code\u003e, all tagged \u003ccode\u003eproducts\u003c/code\u003e with an hours-long \u003ccode\u003ecacheLife\u003c/code\u003e. Repeated unauthenticated invocation of \u003ccode\u003erevalidateProducts\u003c/code\u003e keeps that cache permanently cold, forcing every visitor\u0027s request to read the full product catalog from Postgres instead of serving from cache, degrading storefront availability at near-zero attacker cost.\u003c/p\u003e\", \"base64\": false}]}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-306\", \"description\": \"CWE-306 Missing Authentication for Critical Function\"}]}], \"cpeApplicability\": [{\"nodes\": [{\"negate\": false, \"cpeMatch\": [{\"criteria\": \"cpe:2.3:a:marcoscamara01:ecommerce-template:*:*:*:*:*:*:*:*\", \"vulnerable\": true, \"versionEndExcluding\": \"ec97209\", \"versionStartIncluding\": \"0\"}], \"operator\": \"OR\"}], \"operator\": \"OR\"}], \"providerMetadata\": {\"orgId\": \"4daa8cea-433a-44bd-9456-53b127fc289a\", \"shortName\": \"Secur0\", \"dateUpdated\": \"2026-09-28T15:29:03.261Z\"}}}",
"cveMetadata": "{\"cveId\": \"CVE-2026-91154\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-09-28T17:52:40.759Z\", \"dateReserved\": \"2026-09-14T21:05:54.953Z\", \"assignerOrgId\": \"4daa8cea-433a-44bd-9456-53b127fc289a\", \"datePublished\": \"2026-09-28T15:29:03.261Z\", \"assignerShortName\": \"Secur0\"}",
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
}
}
Loading…
Loading…
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
- Confirmed: The vulnerability is confirmed from an analyst perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
- Patched: This vulnerability was successfully patched by the user reporting the sighting.
- Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
- Not confirmed: The user expresses doubt about the veracity of the vulnerability.
- Not patched: This vulnerability was not successfully patched by the user reporting the sighting.
Loading…
Loading…