{"id":"CVE-2026-95860","kind":"vulnerability","aliases":["CVE-2026-95860"],"related":[],"title":"node-opcua: namespace access defaults ignored, anonymous clients can write variables","description":"node-opcua is an OPC UA implementation for TypeScript and Node.js. From 2.42.0 until 2.180.0, namespace-level access control configured through setDefaultRolePermissions is not honored by the runtime enforcement path for nodes without explicit per-node RolePermissions. SessionContext.getApplicableRolePermissions reads a missing or null DefaultRolePermissions metadata value instead of the configured namespace field, and the null result is treated permissively. An anonymous network client can consequently write variables with CurrentWrite access or call bound methods when an operator configured a restrictive namespace default and relied on inheritance. Servers with no declared policy, nodes with explicit per-node permissions, and correctly bound programmatic namespace metadata are outside the authorization-bypass case. This issue is fixed in version 2.180.0.","summary":"node-opcua, an OPC UA server library for Node.js and TypeScript, fails to apply namespace-level default role permissions to nodes without explicit per-node permissions. An anonymous network client can write variables marked CurrentWrite or call bound methods that the operator meant to restrict.","severity":"critical","cvss":9.1,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["industrial","node-opcua","nodejs","opc-ua","package","typescript"],"not_affected_if":["explicit-per-node-permissions","no-namespace-default-permissions","version-2.180.0-or-later"],"how_to_check":"- Check the installed node-opcua version in the project lockfile or with `npm ls node-opcua`, looking for versions from `2.42.0` up to before `2.180.0`.\n- Search the server code for calls to `setDefaultRolePermissions` to see whether a restrictive namespace default is relied on for inheritance.","fix":"- node-opcua: move to `2.180.0` or later.","status":"open","published_at":"2026-11-03T21:17:45+00:00","first_seen_at":"2026-11-03T21:19:31+00:00","triaged_at":"2026-11-03T21:20:32+00:00","updated_at":"2026-11-03T21:20:32+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-03T21:20:32Z","model":"claude-haiku-5-5","output":{"fix":"- node-opcua: move to `2.180.0` or later.","reach":"network","title":"node-opcua: namespace access defaults ignored, anonymous clients can write variables","impact":"high","summary":"node-opcua, an OPC UA server library for Node.js and TypeScript, fails to apply namespace-level default role permissions to nodes without explicit per-node permissions. An anonymous network client can write variables marked CurrentWrite or call bound methods that the operator meant to restrict.","audience":"developers","category":"package","nicknames":[],"who_cares":["node-opcua","opc-ua","industrial","nodejs","typescript"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"anonymous network clients write variables and invoke restricted methods","analyst_note":"Sources list only generic patch, release notes and vendor advisory links; confirm the exact fixed behavior and any exploit details at the vendor advisory.","how_to_check":"- Check the installed node-opcua version in the project lockfile or with `npm ls node-opcua`, looking for versions from `2.42.0` up to before `2.180.0`.\n- Search the server code for calls to `setDefaultRolePermissions` to see whether a restrictive namespace default is relied on for inheritance.","plain_action":"","needs_analyst":true,"not_affected_if":["version-2.180.0-or-later","no-namespace-default-permissions","explicit-per-node-permissions"],"who_is_affected":"Servers built on node-opcua from 2.42.0 to before 2.180.0 that configure a restrictive namespace default with setDefaultRolePermissions and rely on nodes inheriting it. Servers with no declared permission policy, nodes with explicit per-node RolePermissions, and correctly bound programmatic namespace metadata are not in the bypass case.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"critical"},"cost_usd":0.000767,"input_tokens":4334,"output_tokens":668,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-2026':14A,17A '-95860':15A,18A '2.180.0':92C,197C '2.42.0':90C 'access':5A,96C,149C 'anonym':8A,59B,140C 'appli':43B 'author':188C 'authorization-bypass':187C 'bound':69B,152C,180C 'bypass':189C 'call':68B,151C 'case':190C 'client':9A,61B,142C 'configur':98C,129C,157C 'consequ':144C 'control':97C 'correct':179C 'currentwrit':66B,148C 'cve':13A,16A 'declar':169C 'default':6A,47B,161C 'defaultrolepermiss':123C 'enforc':107C 'explicit':53B,112C,173C 'fail':41B 'field':131C 'fix':194C 'honor':103C 'ignor':7A 'implement':84C 'industri':19B 'inherit':165C 'instead':126C 'issu':192C 'level':46B,95C 'librari':36B 'mark':65B 'meant':74B 'metadata':124C,183C 'method':70B,153C 'miss':120C 'namespac':4A,45B,94C,130C,160C,182C 'namespace-level':44B,93C 'network':60B,141C 'node':2A,21B,30B,51B,56B,78C,110C,115C,171C,176C 'node-opcua':1A,20B,29B,77C 'node.js':38B,88C 'nodej':23B 'null':122C,134C 'opc':25B,33B,82C 'opc-ua':24B 'opcua':3A,22B,31B,79C 'oper':73B,156C 'outsid':185C 'packag':27B 'path':108C 'per':55B,114C,175C 'per-nod':54B,113C,174C 'permiss':49B,57B,138C,177C 'polici':170C 'programmat':181C 'read':118C 'reli':163C 'restrict':76B,159C 'result':135C 'role':48B 'rolepermiss':116C 'runtim':106C 'server':35B,166C 'sessioncontext.getapplicablerolepermissions':117C 'setdefaultrolepermiss':100C 'treat':137C 'typescript':28B,40B,86C 'ua':26B,34B,83C 'valu':125C 'variabl':12A,64B,146C 'version':196C 'without':52B,111C 'write':11A,63B,145C","nicknames":[],"mitigations":[],"who_affected":"Servers built on node-opcua from 2.42.0 to before 2.180.0 that configure a restrictive namespace default with setDefaultRolePermissions and rely on nodes inheriting it. Servers with no declared permission policy, nodes with explicit per-node RolePermissions, and correctly bound programmatic namespace metadata are not in the bypass case.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["critical","industrial","nodejs","nodeopcua","opcua","package","typescript"],"campaign_type":null,"first_public_at":"2026-10-23T05:49:13+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-95860","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-95860","severity":null,"published_at":"2026-11-03T21:17:45+00:00","modified_at":"2026-11-03T21:17:46+00:00","first_seen_at":"2026-11-03T21:19:31+00:00","fetched_at":"2026-11-03T21:19:31+00:00","note":null}],"documents":[{"id":60906,"url":"https://github.com/node-opcua/node-opcua/commit/0261e873900800983c622e01120f484dc6063698","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":60907,"url":"https://github.com/node-opcua/node-opcua/releases/tag/v2.180.0","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":60908,"url":"https://github.com/node-opcua/node-opcua/security/advisories/GHSA-xggf-m53x-jc3f","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-10-23T05:49:13+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}