{"id":"GHSA-6wvw-vrw4-363w","summary":"node-opcua: Unbounded nonce cache enables unauthenticated heap exhaustion DoS","details":"**Summary**\nA process-global nonce cache with no eviction policy allows an unauthenticated remote attacker to exhaust server heap memory by repeatedly opening sessions, causing the node-opcua server process to crash.\n\n**Affected versions:** \u003c= 2.165.0\n**Tested version:** 2.165.0\n**CVSS Score:** 7.5 (High)\n**CVSS Vector:** CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H\n**CWE:** CWE-770 Allocation of Resources Without Limits or Throttling\n\n---\n\n**Root Cause**\n\nIn `packages/node-opcua-secure-channel/source/server/server_secure_channel_layer.ts` at line 156, `g_alreadyUsedNonce` is a process-global object used to track previously seen nonces for replay detection. Entries are added on every `OpenSecureChannelRequest` and every `CreateSession` request but are never removed or expired.\n\nAn unauthenticated attacker can exploit the `CreateSession` path (which requires no certificate) to accumulate nonce entries indefinitely. Even with `maxSessions=10` limiting concurrent sessions, nonces persist after session expiry, allowing slow but reliable heap exhaustion across repeated connection cycles.\n\n---\n\n**Measured Impact**\n\nDynamically confirmed heap growth:\n- 5,000 unique nonces → +1.23 MB resident heap, no eviction after explicit GC\n- Projected: 10^6 nonces → ~246 MB resident heap\n- Achievable OOM on default Node.js heap limits\n\n---\n\n**Suggested Fix**\n\nAdd a TTL-based eviction policy to `g_alreadyUsedNonce`. Nonces should be expired after the maximum session timeout (or a reasonable fixed window, e.g. 1 hour). A Map with timestamp entries and periodic cleanup is sufficient.\n\n---\n\nI am following a 90-day responsible disclosure policy. I am happy to provide additional technical details under embargo. Please confirm receipt at your earliest convenience.\n\nReporter: Stanley Tobias\nDiscovery date: 2026-03-23","aliases":["CVE-2026-54156"],"modified":"2026-08-27T19:15:07.090081514Z","published":"2026-08-20T18:35:41Z","database_specific":{"severity":"HIGH","github_reviewed":true,"github_reviewed_at":"2026-08-20T18:35:41Z","nvd_published_at":null,"cwe_ids":["CWE-770"]},"references":[{"type":"WEB","url":"https://github.com/node-opcua/node-opcua/security/advisories/GHSA-6wvw-vrw4-363w"},{"type":"WEB","url":"https://github.com/node-opcua/node-opcua/commit/b82c2939fe9c658de58da993f2798ec5481d7313"},{"type":"PACKAGE","url":"https://github.com/node-opcua/node-opcua"},{"type":"WEB","url":"https://github.com/node-opcua/node-opcua/releases/tag/v2.166.0"}],"affected":[{"package":{"name":"node-opcua","ecosystem":"npm","purl":"pkg:npm/node-opcua"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"2.166.0"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-6wvw-vrw4-363w/GHSA-6wvw-vrw4-363w.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H"}]}