CVE-2026-18329 (GCVE-0-2026-18329)
Vulnerability from cvelistv5 – Published: 2026-09-02 15:40 – Updated: 2026-09-02 17:56| URL | Tags |
|---|---|
| https://my.f5.com/manage/s/article/K000162599 | vendor-advisory |
| Vendor | Product | Version | CPE status | |
|---|---|---|---|---|
| F5 | NGINX JavaScript |
Affected:
1.0.0 , < 1.0.1
(custom)
Affected: 0.9.9 , < * (custom) |
guessed |
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-18329",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "yes"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-02T17:56:50.319435Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-02T17:56:59.397Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"defaultStatus": "unknown",
"modules": [
"ngx_http_js_module"
],
"product": "NGINX JavaScript",
"vendor": "F5",
"versions": [
{
"lessThan": "1.0.1",
"status": "affected",
"version": "1.0.0",
"versionType": "custom"
},
{
"lessThan": "*",
"status": "affected",
"version": "0.9.9",
"versionType": "custom"
}
]
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "F5 acknowledges Ta Duc Thien (@thientd) of NTCS for bringing this issue to our attention and following the highest standards of coordinated disclosure."
}
],
"datePublic": "2026-08-19T14:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "Description\u003cbr\u003e\u003cbr\u003eNGINX JavaScript (njs)\u0026nbsp;\u003cspan style=\"background-color: rgb(255, 255, 255);\"\u003eand QuickJS (qjs) engines\u003c/span\u003e\u0026nbsp;have a vulnerability when a js_access handler performs asynchronous request body processing and an exception is thrown during asynchronous access-control evaluation before an explicit access denial is returned. An unauthenticated attacker can exploit this vulnerability by sending a crafted HTTP request that triggers an error condition in the access validation logic. This may cause the js_access phase to fail open, allowing the request to proceed instead of being denied, resulting in an authentication or authorization bypass and unauthorized access to protected resources.\u003cbr\u003e\u003cbr\u003eImpact\u003cbr\u003e\u003cbr\u003eThis vulnerability may allow remote attackers to bypass js_access controls. There is no control plane exposure; this is a data plane issue only.\u003cbr\u003e\u003cbr\u003e\n\n\nNote: Software versions which have reached End of Technical Support (EoTS) are not evaluated."
}
],
"value": "Description\n\nNGINX JavaScript (njs)\u00a0and QuickJS (qjs) engines\u00a0have a vulnerability when a js_access handler performs asynchronous request body processing and an exception is thrown during asynchronous access-control evaluation before an explicit access denial is returned. An unauthenticated attacker can exploit this vulnerability by sending a crafted HTTP request that triggers an error condition in the access validation logic. This may cause the js_access phase to fail open, allowing the request to proceed instead of being denied, resulting in an authentication or authorization bypass and unauthorized access to protected resources.\n\nImpact\n\nThis vulnerability may allow remote attackers to bypass js_access controls. There is no control plane exposure; this is a data plane issue only.\n\n\n\n\nNote: Software versions which have reached End of Technical Support (EoTS) are not evaluated."
}
],
"metrics": [
{
"cvssV3_1": {
"attackComplexity": "LOW",
"attackVector": "NETWORK",
"availabilityImpact": "NONE",
"baseScore": 8.2,
"baseSeverity": "HIGH",
"confidentialityImpact": "HIGH",
"integrityImpact": "LOW",
"privilegesRequired": "NONE",
"scope": "UNCHANGED",
"userInteraction": "NONE",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N",
"version": "3.1"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
},
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 8.8,
"baseSeverity": "HIGH",
"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:H/VI:L/VA:N/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "HIGH",
"vulnIntegrityImpact": "LOW",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-636",
"description": "CWE-636",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-02T15:40:54.115Z",
"orgId": "9dacffd4-cb11-413f-8451-fbbfd4ddc0ab",
"shortName": "f5"
},
"references": [
{
"tags": [
"vendor-advisory"
],
"url": "https://my.f5.com/manage/s/article/K000162599"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "NGINX ngx_http_js_module vulnerability",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cul\u003e\u003cli\u003eTo secure your NGINX njs \u003cstrong\u003ejs_access\u003c/strong\u003e\u0026nbsp;handler against unhandled exceptions such as \u003cstrong\u003eJSON.parse\u003c/strong\u003e\u0026nbsp;failures, wrap your logic in a robust try/catch block with a default strict deny policy that returns an HTML 403 Forbidden response code. For example:\u003cp\u003easync function auth(r) {\u003cbr\u003e\u0026nbsp; try {\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 1. Guard input: Safely check for the Authorization header\u003cbr\u003e\u0026nbsp; \u0026nbsp; var authHeader = r.headersIn ? r.headersIn.Authorization : undefined;\u003cbr\u003e\u0026nbsp; \u0026nbsp; if (!authHeader) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; r.warn(\"Access Denied: Missing Authorization header.\");\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; return r.return(401);\u003cbr\u003e\u0026nbsp; \u0026nbsp; }\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 2. Perform the async HTTP request\u003cbr\u003e\u0026nbsp; \u0026nbsp; let reply = await ngx.fetch(\u0027\u003ca target=\"_blank\" rel=\"nofollow\" href=\"http://authsvc/check\"\u003ehttp://authsvc/check\u003c/a\u003e\u0027, {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; headers: { Authorization: authHeader }\u003cbr\u003e\u0026nbsp; \u0026nbsp; });\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 3. Validate response status\u003cbr\u003e\u0026nbsp; \u0026nbsp; if (reply.status !== 200) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; r.warn(`Access Denied: Auth service returned status ${reply.status}`);\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; return r.return(401);\u003cbr\u003e\u0026nbsp; \u0026nbsp; }\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 4. Read response body\u003cbr\u003e\u0026nbsp; \u0026nbsp; // Note: ngx.fetch body is read asynchronously using .text() or .json()\u003cbr\u003e\u0026nbsp; \u0026nbsp; let responseText = await reply.text();\u003cbr\u003e\u0026nbsp; \u0026nbsp; let payload = {};\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 5. Guard JSON.parse explicitly\u003cbr\u003e\u0026nbsp; \u0026nbsp; try {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; payload = JSON.parse(responseText);\u003cbr\u003e\u0026nbsp; \u0026nbsp; } catch (jsonError) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; r.error(`Security Warning: Failed to parse auth service JSON payload: ${jsonError.message}`);\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; // Explicitly deny the request due to malformed auth response payload\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; return r.return(403);\u003cbr\u003e\u0026nbsp; \u0026nbsp; }\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 6. Validate the contents of the parsed JSON\u003cbr\u003e\u0026nbsp; \u0026nbsp; if (payload.authorized !== true) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; r.warn(\"Access Denied: Client token validated but not authorized.\");\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; return r.return(403);\u003cbr\u003e\u0026nbsp; \u0026nbsp; }\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 7. Success: Explicitly allow the request to proceed\u003cbr\u003e\u0026nbsp; \u0026nbsp; return r.return(200);\u003cbr\u003e\u0026nbsp; } catch (globalError) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 8. Global Catch-All: Block the bypass vulnerability on any script exception\u003cbr\u003e\u0026nbsp; \u0026nbsp; r.error(`Security Critical: Unhandled exception in auth handler: ${globalError.toString()}`);\u003cbr\u003e\u0026nbsp; \u0026nbsp; // Always return 403 (Deny) on exception to guarantee a fail-closed state.\u003cbr\u003e\u0026nbsp; \u0026nbsp; return r.return(403);\u003cbr\u003e\u0026nbsp; }\u003cbr\u003e}\u003cbr\u003eexport default { auth };\u003c/p\u003e\u003c/li\u003e\u003cli\u003ePlace a security enforcement layer such as F5 WAF for NGINX or BIG-IP Advanced WAF before NGINX njs to prevent malformed requests. Configure the WAF to do the following:\u003cul\u003e\u003cli\u003eValidate JSON syntax Enforce request body limits Block malformed payloads\u003c/li\u003e\u003cli\u003eReject unexpected content types Apply API schema validation\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\n\n\u003cbr\u003e"
}
],
"value": "* To secure your NGINX njs js_access\u00a0handler against unhandled exceptions such as JSON.parse\u00a0failures, wrap your logic in a robust try/catch block with a default strict deny policy that returns an HTML 403 Forbidden response code. For example:async function auth(r) {\n\u00a0 try {\n\u00a0 \u00a0 // 1. Guard input: Safely check for the Authorization header\n\u00a0 \u00a0 var authHeader = r.headersIn ? r.headersIn.Authorization : undefined;\n\u00a0 \u00a0 if (!authHeader) {\n\u00a0 \u00a0 \u00a0 r.warn(\"Access Denied: Missing Authorization header.\");\n\u00a0 \u00a0 \u00a0 return r.return(401);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 // 2. Perform the async HTTP request\n\u00a0 \u00a0 let reply = await ngx.fetch(\u0027 http://authsvc/check \u0027, {\n\u00a0 \u00a0 \u00a0 headers: { Authorization: authHeader }\n\u00a0 \u00a0 });\n\u00a0 \u00a0 // 3. Validate response status\n\u00a0 \u00a0 if (reply.status !== 200) {\n\u00a0 \u00a0 \u00a0 r.warn(`Access Denied: Auth service returned status ${reply.status}`);\n\u00a0 \u00a0 \u00a0 return r.return(401);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 // 4. Read response body\n\u00a0 \u00a0 // Note: ngx.fetch body is read asynchronously using .text() or .json()\n\u00a0 \u00a0 let responseText = await reply.text();\n\u00a0 \u00a0 let payload = {};\n\u00a0 \u00a0 // 5. Guard JSON.parse explicitly\n\u00a0 \u00a0 try {\n\u00a0 \u00a0 \u00a0 payload = JSON.parse(responseText);\n\u00a0 \u00a0 } catch (jsonError) {\n\u00a0 \u00a0 \u00a0 r.error(`Security Warning: Failed to parse auth service JSON payload: ${jsonError.message}`);\n\u00a0 \u00a0 \u00a0 // Explicitly deny the request due to malformed auth response payload\n\u00a0 \u00a0 \u00a0 return r.return(403);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 // 6. Validate the contents of the parsed JSON\n\u00a0 \u00a0 if (payload.authorized !== true) {\n\u00a0 \u00a0 \u00a0 r.warn(\"Access Denied: Client token validated but not authorized.\");\n\u00a0 \u00a0 \u00a0 return r.return(403);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 // 7. Success: Explicitly allow the request to proceed\n\u00a0 \u00a0 return r.return(200);\n\u00a0 } catch (globalError) {\n\u00a0 \u00a0 // 8. Global Catch-All: Block the bypass vulnerability on any script exception\n\u00a0 \u00a0 r.error(`Security Critical: Unhandled exception in auth handler: ${globalError.toString()}`);\n\u00a0 \u00a0 // Always return 403 (Deny) on exception to guarantee a fail-closed state.\n\u00a0 \u00a0 return r.return(403);\n\u00a0 }\n}\nexport default { auth };\n\n\n * Place a security enforcement layer such as F5 WAF for NGINX or BIG-IP Advanced WAF before NGINX njs to prevent malformed requests. Configure the WAF to do the following: * Validate JSON syntax Enforce request body limits Block malformed payloads\n * Reject unexpected content types Apply API schema validation"
}
],
"x_generator": {
"engine": "F5 SIRTBot v1.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "9dacffd4-cb11-413f-8451-fbbfd4ddc0ab",
"assignerShortName": "f5",
"cveId": "CVE-2026-18329",
"datePublished": "2026-09-02T15:40:54.115Z",
"dateReserved": "2026-07-29T19:42:43.485Z",
"dateUpdated": "2026-09-02T17:56:59.397Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2",
"vulnerability-lookup:meta": {
"epss": {
"cve": "CVE-2026-18329",
"date": "2026-11-11",
"epss": "0.00645",
"percentile": "0.51383"
},
"microsoft_vex": {
"current_release_date": "2026-09-20T01:54:21.000Z",
"cve": "CVE-2026-18329",
"id": "msrc_CVE-2026-18329",
"initial_release_date": "2026-09-07T02:01:17.000Z",
"product_status:fixed": "1",
"product_status:known_affected": "1",
"source": "Microsoft CSAF VEX",
"status": "final",
"title": "NGINX ngx_http_js_module vulnerability",
"url": "https://msrc.microsoft.com/csaf/vex/2026/msrc_cve-2026-18329.json",
"version": "3"
},
"nvd": {
"cve": {
"affected": [
{
"affectedData": [
{
"defaultStatus": "unknown",
"modules": [
"ngx_http_js_module"
],
"product": "NGINX JavaScript",
"vendor": "F5",
"versions": [
{
"lessThan": "1.0.1",
"status": "affected",
"version": "1.0.0",
"versionType": "custom"
},
{
"lessThan": "*",
"status": "affected",
"version": "0.9.9",
"versionType": "custom"
}
]
}
],
"source": "f5sirt@f5.com"
}
],
"cveTags": [],
"descriptions": [
{
"lang": "en",
"value": "Description\n\nNGINX JavaScript (njs)\u00a0and QuickJS (qjs) engines\u00a0have a vulnerability when a js_access handler performs asynchronous request body processing and an exception is thrown during asynchronous access-control evaluation before an explicit access denial is returned. An unauthenticated attacker can exploit this vulnerability by sending a crafted HTTP request that triggers an error condition in the access validation logic. This may cause the js_access phase to fail open, allowing the request to proceed instead of being denied, resulting in an authentication or authorization bypass and unauthorized access to protected resources.\n\nImpact\n\nThis vulnerability may allow remote attackers to bypass js_access controls. There is no control plane exposure; this is a data plane issue only.\n\n\n\n\nNote: Software versions which have reached End of Technical Support (EoTS) are not evaluated."
}
],
"id": "CVE-2026-18329",
"lastModified": "2026-09-03T16:37:52.170",
"metrics": {
"cvssMetricV31": [
{
"cvssData": {
"attackComplexity": "LOW",
"attackVector": "NETWORK",
"availabilityImpact": "NONE",
"baseScore": 8.2,
"baseSeverity": "HIGH",
"confidentialityImpact": "HIGH",
"integrityImpact": "LOW",
"privilegesRequired": "NONE",
"scope": "UNCHANGED",
"userInteraction": "NONE",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N",
"version": "3.1"
},
"exploitabilityScore": 3.9,
"impactScore": 4.2,
"source": "f5sirt@f5.com",
"type": "Secondary"
}
],
"cvssMetricV40": [
{
"cvssData": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"availabilityRequirement": "NOT_DEFINED",
"baseScore": 8.8,
"baseSeverity": "HIGH",
"confidentialityRequirement": "NOT_DEFINED",
"exploitMaturity": "NOT_DEFINED",
"integrityRequirement": "NOT_DEFINED",
"modifiedAttackComplexity": "NOT_DEFINED",
"modifiedAttackRequirements": "NOT_DEFINED",
"modifiedAttackVector": "NOT_DEFINED",
"modifiedPrivilegesRequired": "NOT_DEFINED",
"modifiedSubAvailabilityImpact": "NOT_DEFINED",
"modifiedSubConfidentialityImpact": "NOT_DEFINED",
"modifiedSubIntegrityImpact": "NOT_DEFINED",
"modifiedUserInteraction": "NOT_DEFINED",
"modifiedVulnAvailabilityImpact": "NOT_DEFINED",
"modifiedVulnConfidentialityImpact": "NOT_DEFINED",
"modifiedVulnIntegrityImpact": "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:H/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "HIGH",
"vulnIntegrityImpact": "LOW",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"source": "f5sirt@f5.com",
"type": "Secondary"
}
],
"ssvcV203": [
{
"source": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"ssvcData": {
"id": "CVE-2026-18329",
"options": [
{
"exploitation": "none"
},
{
"automatable": "yes"
},
{
"technicalImpact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-02T17:56:50.319435Z",
"version": "2.0.3"
}
}
]
},
"published": "2026-09-02T16:17:14.917",
"references": [
{
"source": "f5sirt@f5.com",
"url": "https://my.f5.com/manage/s/article/K000162599"
}
],
"sourceIdentifier": "f5sirt@f5.com",
"vulnStatus": "Awaiting Analysis",
"weaknesses": [
{
"description": [
{
"lang": "en",
"value": "CWE-636"
}
],
"source": "f5sirt@f5.com",
"type": "Secondary"
}
]
}
},
"redhat_vex": {
"aggregate_severity": "Important",
"current_release_date": "2026-10-19T17:35:13+00:00",
"cve": "CVE-2026-18329",
"id": "CVE-2026-18329",
"initial_release_date": "2026-09-02T15:40:54.115000+00:00",
"product_status:known_not_affected": "2",
"source": "Red Hat CSAF VEX",
"status": "final",
"title": "nginx: NGINX: Authentication bypass via js_access handler failure",
"url": "https://security.access.redhat.com/data/csaf/v2/vex/2026/cve-2026-18329.json",
"version": "3"
},
"suse_vex": {
"aggregate_severity": "important",
"current_release_date": "2026-09-03T16:30:21Z",
"cve": "CVE-2026-18329",
"id": "CVE-2026-18329",
"initial_release_date": "2026-09-03T16:30:21Z",
"product_status:known_not_affected": "66",
"source": "SUSE CSAF VEX",
"status": "interim",
"title": "SUSE CVE CVE-2026-18329",
"url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2026-18329.json",
"version": "2"
},
"vulnrichment": {
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-18329",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "yes"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-02T17:56:50.319435Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-02T17:56:54.352Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"defaultStatus": "unknown",
"modules": [
"ngx_http_js_module"
],
"product": "NGINX JavaScript",
"vendor": "F5",
"versions": [
{
"lessThan": "1.0.1",
"status": "affected",
"version": "1.0.0",
"versionType": "custom"
},
{
"lessThan": "*",
"status": "affected",
"version": "0.9.9",
"versionType": "custom"
}
]
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "F5 acknowledges Ta Duc Thien (@thientd) of NTCS for bringing this issue to our attention and following the highest standards of coordinated disclosure."
}
],
"datePublic": "2026-08-19T14:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "Description\u003cbr\u003e\u003cbr\u003eNGINX JavaScript (njs)\u0026nbsp;\u003cspan style=\"background-color: rgb(255, 255, 255);\"\u003eand QuickJS (qjs) engines\u003c/span\u003e\u0026nbsp;have a vulnerability when a js_access handler performs asynchronous request body processing and an exception is thrown during asynchronous access-control evaluation before an explicit access denial is returned. An unauthenticated attacker can exploit this vulnerability by sending a crafted HTTP request that triggers an error condition in the access validation logic. This may cause the js_access phase to fail open, allowing the request to proceed instead of being denied, resulting in an authentication or authorization bypass and unauthorized access to protected resources.\u003cbr\u003e\u003cbr\u003eImpact\u003cbr\u003e\u003cbr\u003eThis vulnerability may allow remote attackers to bypass js_access controls. There is no control plane exposure; this is a data plane issue only.\u003cbr\u003e\u003cbr\u003e\n\n\nNote: Software versions which have reached End of Technical Support (EoTS) are not evaluated."
}
],
"value": "Description\n\nNGINX JavaScript (njs)\u00a0and QuickJS (qjs) engines\u00a0have a vulnerability when a js_access handler performs asynchronous request body processing and an exception is thrown during asynchronous access-control evaluation before an explicit access denial is returned. An unauthenticated attacker can exploit this vulnerability by sending a crafted HTTP request that triggers an error condition in the access validation logic. This may cause the js_access phase to fail open, allowing the request to proceed instead of being denied, resulting in an authentication or authorization bypass and unauthorized access to protected resources.\n\nImpact\n\nThis vulnerability may allow remote attackers to bypass js_access controls. There is no control plane exposure; this is a data plane issue only.\n\n\n\n\nNote: Software versions which have reached End of Technical Support (EoTS) are not evaluated."
}
],
"metrics": [
{
"cvssV3_1": {
"attackComplexity": "LOW",
"attackVector": "NETWORK",
"availabilityImpact": "NONE",
"baseScore": 8.2,
"baseSeverity": "HIGH",
"confidentialityImpact": "HIGH",
"integrityImpact": "LOW",
"privilegesRequired": "NONE",
"scope": "UNCHANGED",
"userInteraction": "NONE",
"vectorString": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N",
"version": "3.1"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
},
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 8.8,
"baseSeverity": "HIGH",
"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:H/VI:L/VA:N/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "HIGH",
"vulnIntegrityImpact": "LOW",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-636",
"description": "CWE-636",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-02T15:40:54.115Z",
"orgId": "9dacffd4-cb11-413f-8451-fbbfd4ddc0ab",
"shortName": "f5"
},
"references": [
{
"tags": [
"vendor-advisory"
],
"url": "https://my.f5.com/manage/s/article/K000162599"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "NGINX ngx_http_js_module vulnerability",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cul\u003e\u003cli\u003eTo secure your NGINX njs \u003cstrong\u003ejs_access\u003c/strong\u003e\u0026nbsp;handler against unhandled exceptions such as \u003cstrong\u003eJSON.parse\u003c/strong\u003e\u0026nbsp;failures, wrap your logic in a robust try/catch block with a default strict deny policy that returns an HTML 403 Forbidden response code. For example:\u003cp\u003easync function auth(r) {\u003cbr\u003e\u0026nbsp; try {\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 1. Guard input: Safely check for the Authorization header\u003cbr\u003e\u0026nbsp; \u0026nbsp; var authHeader = r.headersIn ? r.headersIn.Authorization : undefined;\u003cbr\u003e\u0026nbsp; \u0026nbsp; if (!authHeader) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; r.warn(\"Access Denied: Missing Authorization header.\");\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; return r.return(401);\u003cbr\u003e\u0026nbsp; \u0026nbsp; }\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 2. Perform the async HTTP request\u003cbr\u003e\u0026nbsp; \u0026nbsp; let reply = await ngx.fetch(\u0027\u003ca target=\"_blank\" rel=\"nofollow\" href=\"http://authsvc/check\"\u003ehttp://authsvc/check\u003c/a\u003e\u0027, {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; headers: { Authorization: authHeader }\u003cbr\u003e\u0026nbsp; \u0026nbsp; });\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 3. Validate response status\u003cbr\u003e\u0026nbsp; \u0026nbsp; if (reply.status !== 200) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; r.warn(`Access Denied: Auth service returned status ${reply.status}`);\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; return r.return(401);\u003cbr\u003e\u0026nbsp; \u0026nbsp; }\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 4. Read response body\u003cbr\u003e\u0026nbsp; \u0026nbsp; // Note: ngx.fetch body is read asynchronously using .text() or .json()\u003cbr\u003e\u0026nbsp; \u0026nbsp; let responseText = await reply.text();\u003cbr\u003e\u0026nbsp; \u0026nbsp; let payload = {};\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 5. Guard JSON.parse explicitly\u003cbr\u003e\u0026nbsp; \u0026nbsp; try {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; payload = JSON.parse(responseText);\u003cbr\u003e\u0026nbsp; \u0026nbsp; } catch (jsonError) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; r.error(`Security Warning: Failed to parse auth service JSON payload: ${jsonError.message}`);\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; // Explicitly deny the request due to malformed auth response payload\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; return r.return(403);\u003cbr\u003e\u0026nbsp; \u0026nbsp; }\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 6. Validate the contents of the parsed JSON\u003cbr\u003e\u0026nbsp; \u0026nbsp; if (payload.authorized !== true) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; r.warn(\"Access Denied: Client token validated but not authorized.\");\u003cbr\u003e\u0026nbsp; \u0026nbsp; \u0026nbsp; return r.return(403);\u003cbr\u003e\u0026nbsp; \u0026nbsp; }\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 7. Success: Explicitly allow the request to proceed\u003cbr\u003e\u0026nbsp; \u0026nbsp; return r.return(200);\u003cbr\u003e\u0026nbsp; } catch (globalError) {\u003cbr\u003e\u0026nbsp; \u0026nbsp; // 8. Global Catch-All: Block the bypass vulnerability on any script exception\u003cbr\u003e\u0026nbsp; \u0026nbsp; r.error(`Security Critical: Unhandled exception in auth handler: ${globalError.toString()}`);\u003cbr\u003e\u0026nbsp; \u0026nbsp; // Always return 403 (Deny) on exception to guarantee a fail-closed state.\u003cbr\u003e\u0026nbsp; \u0026nbsp; return r.return(403);\u003cbr\u003e\u0026nbsp; }\u003cbr\u003e}\u003cbr\u003eexport default { auth };\u003c/p\u003e\u003c/li\u003e\u003cli\u003ePlace a security enforcement layer such as F5 WAF for NGINX or BIG-IP Advanced WAF before NGINX njs to prevent malformed requests. Configure the WAF to do the following:\u003cul\u003e\u003cli\u003eValidate JSON syntax Enforce request body limits Block malformed payloads\u003c/li\u003e\u003cli\u003eReject unexpected content types Apply API schema validation\u003c/li\u003e\u003c/ul\u003e\u003c/li\u003e\u003c/ul\u003e\n\n\u003cbr\u003e"
}
],
"value": "* To secure your NGINX njs js_access\u00a0handler against unhandled exceptions such as JSON.parse\u00a0failures, wrap your logic in a robust try/catch block with a default strict deny policy that returns an HTML 403 Forbidden response code. For example:async function auth(r) {\n\u00a0 try {\n\u00a0 \u00a0 // 1. Guard input: Safely check for the Authorization header\n\u00a0 \u00a0 var authHeader = r.headersIn ? r.headersIn.Authorization : undefined;\n\u00a0 \u00a0 if (!authHeader) {\n\u00a0 \u00a0 \u00a0 r.warn(\"Access Denied: Missing Authorization header.\");\n\u00a0 \u00a0 \u00a0 return r.return(401);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 // 2. Perform the async HTTP request\n\u00a0 \u00a0 let reply = await ngx.fetch(\u0027 http://authsvc/check \u0027, {\n\u00a0 \u00a0 \u00a0 headers: { Authorization: authHeader }\n\u00a0 \u00a0 });\n\u00a0 \u00a0 // 3. Validate response status\n\u00a0 \u00a0 if (reply.status !== 200) {\n\u00a0 \u00a0 \u00a0 r.warn(`Access Denied: Auth service returned status ${reply.status}`);\n\u00a0 \u00a0 \u00a0 return r.return(401);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 // 4. Read response body\n\u00a0 \u00a0 // Note: ngx.fetch body is read asynchronously using .text() or .json()\n\u00a0 \u00a0 let responseText = await reply.text();\n\u00a0 \u00a0 let payload = {};\n\u00a0 \u00a0 // 5. Guard JSON.parse explicitly\n\u00a0 \u00a0 try {\n\u00a0 \u00a0 \u00a0 payload = JSON.parse(responseText);\n\u00a0 \u00a0 } catch (jsonError) {\n\u00a0 \u00a0 \u00a0 r.error(`Security Warning: Failed to parse auth service JSON payload: ${jsonError.message}`);\n\u00a0 \u00a0 \u00a0 // Explicitly deny the request due to malformed auth response payload\n\u00a0 \u00a0 \u00a0 return r.return(403);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 // 6. Validate the contents of the parsed JSON\n\u00a0 \u00a0 if (payload.authorized !== true) {\n\u00a0 \u00a0 \u00a0 r.warn(\"Access Denied: Client token validated but not authorized.\");\n\u00a0 \u00a0 \u00a0 return r.return(403);\n\u00a0 \u00a0 }\n\u00a0 \u00a0 // 7. Success: Explicitly allow the request to proceed\n\u00a0 \u00a0 return r.return(200);\n\u00a0 } catch (globalError) {\n\u00a0 \u00a0 // 8. Global Catch-All: Block the bypass vulnerability on any script exception\n\u00a0 \u00a0 r.error(`Security Critical: Unhandled exception in auth handler: ${globalError.toString()}`);\n\u00a0 \u00a0 // Always return 403 (Deny) on exception to guarantee a fail-closed state.\n\u00a0 \u00a0 return r.return(403);\n\u00a0 }\n}\nexport default { auth };\n\n\n * Place a security enforcement layer such as F5 WAF for NGINX or BIG-IP Advanced WAF before NGINX njs to prevent malformed requests. Configure the WAF to do the following: * Validate JSON syntax Enforce request body limits Block malformed payloads\n * Reject unexpected content types Apply API schema validation"
}
],
"x_generator": {
"engine": "F5 SIRTBot v1.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "9dacffd4-cb11-413f-8451-fbbfd4ddc0ab",
"assignerShortName": "f5",
"cveId": "CVE-2026-18329",
"datePublished": "2026-09-02T15:40:54.115Z",
"dateReserved": "2026-07-29T19:42:43.485Z",
"dateUpdated": "2026-09-02T17:56:59.397Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
}
}
Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.
Sightings
| Author | Source | Type | Date | Other |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Vulnerability timeline
Sightings and recorded dates, grouped by day · UTC
How durations are calculated
Following the VTEM framework (Black Hat USA 2015), time to patch starts when the vendor or a coordinator was informed, total time to patch at discovery, and disclosure to patch at public disclosure; vendor response time runs from the report to its acknowledgement. Time to exploit and time unpatched start at the earliest discovery or report, falling back to public disclosure. Unpatched time ends at the first recorded patch, or the calculation time when no patch is recorded. Exploitation to patch shows the interval between those two events; a published proof of concept is a public exploit, not exploitation.
Each result shows its source dates. A negative interval means the end event came first; when date-only inputs leave the order open, the result says so. Date-only inputs are approximate. The earliest evidence wins: KEV report dates and sightings are labelled as such. Records describing another vulnerability are listed but never calculated from, and a PoC alone does not establish exploitation. Missing patch evidence does not prove that no patch exists. Filters below change the event list only.
Loading timeline…
The approach is described in our paper Mapping CVEs to MITRE ATT&CK Techniques: A Curated Gold-Set Classifier and the Limits of LLM-Assisted Label Expansion.
Browse all ATT&CK techniques and the vulnerabilities related to each.
Related by attack behaviour
Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.