Skip to main content

node-opcua CVE-2026-54155

| EUVDEUVD-2026-77619 HIGH
Improper Verification of Cryptographic Signature (CWE-347)
2026-08-20 https://github.com/node-opcua/node-opcua GHSA-mq36-523m-x7vv
7.7
CVSS 3.1 · Vendor: https://github.com/node-opcua/node-opcua
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Recon
    Unauthenticated GetEndpoints request
  2. Delivery
    Retrieve server RSA public key and token policy
  3. Exploit
    Open SecureChannel with SecurityMode=None
  4. Install
    Create OPC UA session
  5. C2
    Craft 4-byte length payload matching nonce length
  6. Execute
    RSA-OAEP encrypt payload
  7. Impact
    Submit forged UserNameIdentityToken in ActivateSession
  8. Step 8
    Server authenticates with empty password

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A04:2025 - Cryptographic Failures
ASVS 5.0
V11 - Cryptography Signature verification
Exploitation Conditions

Two distinct exploitation paths exist with different preconditions. For the forged-empty-password attack: the target OPC UA server must have at least one account configured to accept an empty password (or no password validation), and the attacker must know or guess a valid username - empty or default accounts in industrial deployments are the primary risk. For the replay attack: the attacker must have previously captured a valid UserNameIdentityToken ciphertext from a prior OPC UA session (e.g., via network interception). The compounding bypass (verifyClientSignature always returning true) applies specifically when the secure channel is negotiated with SecurityMode=None, which is a non-default but common misconfiguration in OPC UA deployments where client certificate management is avoided. Limiting factors: CVSS AC:H reflects that neither attack path is trivially universal - the empty-password variant is limited to servers with weak account policies, and the replay variant requires prior credential capture. Authentication is not required by the attacker (PR:N), and no user interaction is needed (UI:N). The OPC UA port must be reachable from the attacker's network position.

Impact

The CVSS vector AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:L yields a base score reported inconsistently as both 8.1 and 7.7 in the source data - both cite the same vector, suggesting a transcription or rounding discrepancy; the computed value is approximately 8.3. The AC:H rating is justified: the empty-password variant requires that at least one account on the target server accepts an empty password, while the replay variant requires prior capture of a valid session token - neither is a zero-effort precondition. However, the PoC attack sequence has been dynamically confirmed by the reporter, and the step-by-step logic requires only publicly available information (the server's own public key, obtained via unauthenticated GetEndpoints) and standard RSA-OAEP encryption, lowering the practical bar considerably. No KEV listing has been confirmed, and no EPSS score was provided in the source data, so exploitation breadth in the wild is unknown. For OPC UA deployments that expose the server port to untrusted networks or that use SecurityMode=None (a known anti-pattern in industrial environments), this is a real, high-priority issue. Deployments that enforce strong SecurityMode, disallow empty passwords, and restrict OPC UA port access to trusted subnets face substantially lower residual risk. No vendor-released patch exists at time of analysis, which elevates urgency for workarounds.

Exploit ScenarioDerived

An attacker with network access to an OPC UA server running node-opcua <= 2.165.0 first calls GetEndpoints without authentication to retrieve the server's RSA public key. The attacker then opens a secure channel with SecurityMode=None, creates a session, crafts a 4-byte payload where the length field equals the server nonce length (32), RSA-OAEP-encrypts it with the server's public key, and submits it as a UserNameIdentityToken in an ActivateSession call - causing the server to compute a password of empty string and invoke isValidUser with that value. A proof-of-concept attack sequence has been dynamically confirmed by the reporter, and the attack does not require the server private key or any prior credential.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.3% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Aug 20, 2026

Authentication bypass and token replay in node-opcua's UserNameIdentityToken handler enables unauthenticated remote attackers to authenticate as any user whose account accepts an empty password, and to replay captured session tokens unconditionally across unrelated sessions. Versions up to and including 2.165.0 of the npm package are affected. The vulnerability is compounded when SecurityMode=None is configured, which causes the channel-level signature verification to return true unconditionally. A proof-of-concept attack sequence has been dynamically confirmed by the reporter; no vendor-released patch has been identified at time of analysis.

RemediationAI

No vendor-released patch has been identified at time of analysis; the fixed-in field in the advisory is listed as None. Upstream fix guidance calls for verifying that buff.slice(4 + passwordLength) equals session.nonce after decryption and rejecting the token on mismatch - downstream maintainers should track the node-opcua repository for a patched release. Until a patch is available, apply the following compensating controls: (1) Disable SecurityMode=None and enforce at minimum SecurityMode=Sign or SecurityMode=SignAndEncrypt on all secure channels - this prevents the compounding bypass in verifyClientSignature and raises the practical bar for credential forging; note this may require client-side certificate deployment. (2) Audit all OPC UA user accounts and disable or lock any account that accepts an empty password, directly blocking the forged-empty-password attack vector. (3) Restrict network access to OPC UA ports (default TCP 4840/4843) to known-trusted clients using firewall rules or network segmentation - this limits replay attack surface to already-trusted network segments. (4) Rotate session credentials and monitor OPC UA server logs for anomalous ActivateSession calls, particularly those from unexpected source addresses. Reference: https://github.com/node-opcua/node-opcua/security/advisories/GHSA-mq36-523m-x7vv

Affected VersionsENISA

node-opcua < 2.166.0

Affected Packages

npm node-opcua fix: 2.166.0

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in npm

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

OPC UA (Open Platform Communications Unified Architecture) is an industrial automation messaging protocol; node-opcua (pkg:npm/node-opcua) is the dominant Node.js server implementation. When a client authenticates with a UserNameIdentityToken, the OPC UA specification requires the client to RSA-OAEP-encrypt the password concatenated with the server nonce, so that replay across sessions is cryptographically impossible. The vulnerable code in packages/node-opcua-server/source/opcua_server.ts (lines 1886-1887) decrypts the blob and reads a 4-byte little-endian length prefix to slice the password, but never verifies that the remaining bytes match session.nonce. This is a textbook instance of CWE-347 (Improper Verification of Cryptographic Signature): a cryptographic mechanism (nonce binding) is structurally absent rather than implemented incorrectly. A second, compounding defect in security_policy.ts (lines 697-700) makes verifyClientSignature return true unconditionally when SecurityMode=None, eliminating the channel-level guard entirely. Together, these two gaps mean that an attacker who knows a valid username and can reach the OPC UA port can forge or replay credentials without possessing the account password.

Know when Jwt Attack 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

Vendor (https://github.com/node-opcua/node-opcua) PRIMARY 7.7 HIGH
AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:L
vuln.today AI 7.4 HIGH

AV:N and PR:N confirmed by unauthenticated network attack path; AC:H for preconditions (empty-password account or captured token); A:N as no availability impact is described.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N
4.0 AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (https://github.com/node-opcua/node-opcua).

CVSS VectorVendor: https://github.com/node-opcua/node-opcua

Attack Vector
Network
Attack Complexity
High
Privileges Required
None
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
High
Availability
Low

Lifecycle Timeline

2
Patch available
Sep 14, 2026 - 19:03 EUVD
CVE Published
Aug 20, 2026 - 18:35 github-advisory
HIGH 7.7

DescriptionCVE.org

Summary A missing nonce verification in the UserNameIdentityToken authentication handler allows an unauthenticated remote attacker to forge a password token that extracts as an empty string, and to replay captured authentication tokens across sessions.

Affected versions: <= 2.165.0 Tested version: 2.165.0 CVSS Score: 8.1 (High) CVSS Vector: CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:L CWE: CWE-347 Improper Verification of Cryptographic Signature

---

Root Cause

In packages/node-opcua-server/source/opcua_server.ts at line 1886-1887, after RSA-OAEP decrypting the UserNameIdentityToken password blob, the server reads a 4-byte little-endian length field and extracts buff[4 : 4+length] as the password. It never verifies that the trailing bytes equal session.nonce.

This has two consequences:

  1. Forged empty password: An attacker who retrieves the server's public key via an unauthenticated GetEndpoints call can craft a token where the 4-byte length field equals serverNonce.length (32). The server computes length = 32 - 32 = 0 and calls isValidUser(username, ""). Any account that accepts an empty password is compromised.
  2. Unconditional replay attack: Because nonce binding is structurally absent, any captured UserNameIdentityToken ciphertext can be replayed in a different session unconditionally.

The impact is compounded by a second issue: when the channel uses SecurityMode=None, verifyClientSignature returns true unconditionally (security_policy.ts:697-700), bypassing the channel-level signature check entirely.

---

Proof of Concept (logic, no exploit code)

1. GetEndpoints (unauthenticated) → retrieve server public key and RSA token policy
2. OpenSecureChannel (SecurityMode=None)
3. CreateSession
4. Craft plaintext: [0x20, 0x00, 0x00, 0x00]  (readUInt32LE = 32 = serverNonce.length)
5. RSA-OAEP encrypt with server public key → 256-byte ciphertext
6. ActivateSession with crafted UserNameIdentityToken
7. Server decrypts → length = 32 - 32 = 0 → password = ""
8. isValidUser(username, "") is called

Dynamically confirmed: decryption produces password = "" with no error and no nonce verification.

---

Suggested Fix

After decrypting the password blob, verify that buff.slice(4 + passwordLength) equals session.nonce before extracting the password. Reject the token if verification fails.

---

I 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.

Reporter: Stanley Tobias Discovery date: 2026-03-23

Executive ViewAI

Why It Matters

Organizations using node-opcua (≤v2.165.0) for OPC UA communications face critical risk of unauthorized access and account impersonation through an authentication bypass that requires no credentials and allows replay of hijacked session tokens across sessions. This directly exposes operational technology infrastructure-including industrial controls, building systems, and manufacturing environments-to compromise by remote attackers, with technical feasibility confirmed through proof-of-concept testing and no patch currently available.

Business Impact: Severe
Compensating Controls

No vendor-released patch identified at time of analysis. Interim mitigations: (1) Disable SecurityMode=None; mandate SecurityMode=SignAndEncrypt or SecurityMode=Sign for all OPC UA server configurations; (2) Implement strict network access controls via firewall, allowing OPC UA connections only from pre-approved client IP addresses; (3) Enforce strong, unique passwords on all user accounts and eliminate any accounts with empty password acceptance; (4) Deploy continuous monitoring of OPC UA session tokens to detect and alert on token replay or unauthorized reuse patterns; (5) Isolate systems running affected versions on restricted network segments with limited external connectivity until patch deployment is complete.

Threat Intelligence Overview

EPSS Score
0.3%
Top 74% exploitable
Prevalence
Medium
leading npm OPC UA server library for industrial IoT Node.js deployments
Threat Intel
1
1 source
Data Quality
5 sources
Confidence: Medium

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.3%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation· derived
None
System Exposure· derived
Open
Automatable· derived
No
Human Impact
Very High

Priority Score

38
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +38
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

Attack Technique

Authentication bypass attacks exploit flaws in the verification mechanisms that control access to systems and applications.

CVE-2013-3900 MEDIUM
5.5 Dec 11

Why is Microsoft republishing a CVE from 2013? We are republishing CVE-2013-3900 in the Security Update Guide to update

CVE-2026-48558 CRITICAL POC
9.5 Jun 12

Authentication bypass in SimpleHelp 5.5.15 and prior (plus 6.0 pre-release builds) allows remote unauthenticated attacke

CVE-2026-5430 CRITICAL POC
10.0 Aug 06

Authentication bypass in WSO2 API Manager and related components (Universal Gateway, Traffic Manager, API Control Plane,

CVE-2025-59718 CRITICAL
9.8 Dec 09

Authentication bypass in Fortinet FortiOS, FortiProxy, and FortiSwitchManager allows unauthenticated remote attackers to

CVE-2025-25291 CRITICAL POC
9.3 Mar 12

ruby-saml provides security assertion markup language (SAML) single sign-on (SSO) for Ruby. Rated critical severity (CVS

CVE-2026-47304 CRITICAL POC
9.8 Jul 14

Security feature bypass in Microsoft .NET (shipped via Visual Studio 2022 17.12/17.14 and Visual Studio 2026 18.7) lets

CVE-2025-25292 CRITICAL POC
9.3 Mar 12

ruby-saml provides security assertion markup language (SAML) single sign-on (SSO) for Ruby. Rated critical severity (CVS

CVE-2022-25898 CRITICAL POC
9.8 Jul 01

The package jsrsasign before 10.5.25 are vulnerable to Improper Verification of Cryptographic Signature when JWS or JWT

CVE-2026-107722 CRITICAL POC
9.8 Oct 08

Authentication and authorization bypass in fast-jwt 6.2.0 through 6.2.4 (npm, NearForm) lets a remote, unauthenticated a

CVE-2024-42004 CRITICAL POC
9.8 Dec 18

A library injection vulnerability exists in Microsoft Teams (work or school) 24046.2813.2770.1094 for macOS. Rated criti

CVE-2024-41145 CRITICAL POC
9.8 Dec 18

A library injection vulnerability exists in the WebView.app helper app of Microsoft Teams (work or school) 24046.2813.27

CVE-2024-41138 CRITICAL POC
9.8 Dec 18

A library injection vulnerability exists in the com.microsoft.teams2.modulehost.app helper app of Microsoft Teams (work

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy