npm package report

Is node-opcua-client safe?

1 known vulnerability, worst severity HIGH.

// reach

0 direct dependencies

none carry a known advisory

    0 packages depend on it

    an advisory here reaches each of them

      Create a free accountfor every dependency path, dependent and what to upgrade
      // ai model usage

      Tracked for PyPI packages. HuggingFace models declare Python dependencies, so npm packages are not covered.


      cvss
      0.0
      high

      severity out of 10

      epss
      0.00%
      medium

      chance of exploitation in 30 days, 36th percentile of all CVEs

      xyz score
      not scored

      CyberXYZ composite out of 10

      fig. 01 — GHSA-r2pf-9cw4-5j65, the advisory selected below

      // 1 advisories

      GHSA-r2pf-9cw4-5j65

      HIGHCVE-2026-68904

      SUMMARY ------- A combination of bugs in node-opcua causes unlimited TCP socket accumulation (FIN-WAIT-2 state) during automatic reconnection, leading to memory exhaustion and eventual container/process crash (OOM kill). The issue is triggered by the default configuration (keepSessionAlive: true) when the OPC UA server has clock skew relative to the client.

      Affected version: Tested on 2.169.0 (latest as of April 2026).

      ENVIRONMENT -----------

      • Node.js: v24.11.0
      • node-opcua: 2.169.0
      • OS: Linux (containerized via Podman, slirp4netns networking)
      • OPC UA Server: Industrial PLC (opc.tcp endpoint), clock skew of ~50 minutes ahead of client
      • Client config: keepSessionAlive: true (default), keepAliveInterval: 3000, securityMode: None, securityPolicy: None

      ROOT CAUSE ANALYSIS -------------------

      Bug #1 - ClientTCPtransport.onACKresponse() uses socket.end() instead of socket.destroy()

      File: node-opcua-transport/src/clienttcptransport.ts, onACKresponse() method

      When the HEL/ACK handshake fails during a reconnection attempt, the error handler calls socket.end():

      if (err || !data) { externalCallback(err || new Error("no data")); if (this.socket) { this.socket.end(); // <- sends TCP FIN, leaves socket in FIN-WAIT-2 } }

      socket.end() sends a TCP FIN and waits for the peer to close its side. If the peer doesn't respond (common with PLCs), the socket remains in FIN-WAIT-2 state indefinitely, leaking file descriptors and memory. During rapid reconnection cycles (triggered by Bug #2 below), every failed HEL/ACK creates a new leaked socket.

      ---

      Bug #2 - ClientSessionKeepAliveManager.pingserver() treats BadInvalidTimestamp as network outage

      File: node-opcua-client/src/clientsessionkeepalivemanager.ts, pingserver() method

      The keepalive manager reads Server.ServerStatus.CurrentTime on each ping cycle. If the server responds with BadInvalidTimestamp (because the client's RequestHeader.timestamp falls outside the server's tolerance window due to clock skew), the manager treats this as a fatal network error:

      // Any error -> emit("failure") -> terminateConnection() -> forceConnectionBreak()

      This triggers a full transport-level reconnection on every keepalive cycle (every keepAliveInterval ms). Combined with Bug #1, each reconnection attempt leaks one TCP socket in FIN-WAIT-2. Impact amplification: With keepAliveInterval: 3000 (3 seconds), the client leaks ~20 sockets/minute, ~1200/hour, exhausting resources in hours.

      REPRODUCTION STEPS ------------------

      • Set up an OPC UA server with a clock skewed more than the server's timestamp tolerance ahead of the client.
      • Connect using node-opcua with default settings (keepSessionAlive: true).
      • Monitor TCP sockets: ss -antp | grep FIN-WAIT-2 | wc -l
      • Observe FIN-WAIT-2 count growing continuously (approximately one per keepalive interval).
      • Eventually the process runs out of file descriptors or memory and crashes.

      SUGGESTED FIXES ---------------

      For Bug #1 (onACKresponse):

      // Replace socket.end() with socket.destroy() if (this.socket) { this.socket.destroy(); }

      For Bug #2 (pingserver): Distinguish between transport-level errors (actual network outage) and application-level OPC UA status codes like BadInvalidTimestamp. The latter indicates the server is reachable and the session is alive - only the timestamp validation failed. The keepalive should not trigger reconnection.

      REPORTER -------- Marco Velluso @Velluso [velluso.marco64@gmail.com](mailto:velluso.marco64@gmail.com) Requesting CVE assignment and credit as reporter upon fix publication.

      // cvss v3.1 vector

      CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:H

      Attack vector
      Network
      Attack complexity
      High
      Privileges required
      None
      User interaction
      None
      Scope
      Unchanged
      Confidentiality
      Low
      Integrity
      Low
      Availability
      High

      Checked 2026-09-26 at 01:00 UTC. The most recent advisory here was published 2026-09-16. Updated continuously from NVD, GHSA, OSV and CNA feeds.

      Think a verdict here is wrong? Tell us — we respond within 2 business days.