GitHub Security Advisory: GHSA-c89f-8g7g-59wj
Package: librenms/librenms (COMPOSER)
Severity: MODERATE (CVSS 4.3)
CWE: CWE-79: Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
Vulnerable versions: < 25.12.0
Patched in: 25.12.0

Summary: LibreNMS Alert Rule API Cross-Site Scripting Vulnerability

Details:
Please find POC file here https://trendmicro-my.sharepoint.com/:u:/p/kholoud_altookhy/IQCfcnOE5ykQSb6Fm-HFI872AZ_zeIJxU-3aDk0jh_eX_NE?e=zkN76d

ZDI-CAN-28575: LibreNMS Alert Rule API Cross-Site Scripting Vulnerability

-- CVSS -----------------------------------------

4.3: AV:N/AC:L/PR:H/UI:R/S:U/C:L/I:L/A:L

-- ABSTRACT -------------------------------------

Trend Micro's Zero Day Initiative has identified a vulnerability affecting the following products:
LibreNMS - LibreNMS

-- VULNERABILITY DETAILS ------------------------
* Version tested:  25.10.0
* Installer file:  NA
* Platform tested: NA

---

### Analysis

LibreNMS Alert Rule API Stored Cross-Site Scripting

# Overview
Alert rules can be created or updated via LibreNMS API. The alert rule name is not properly sanitized, and can be used to inject HTML code.

# Affected versions
The latest version at the time of writing (25.10.0) is vulnerable.

# Root cause
When an alert rule is created or updated via the API, function `add_edit_rule()` in `includes/html/api_functions.inc.php` is called to add/update the entry in the database. When an alert rule is created via the web interface, HTML tags are stripped from the rule name, however this is not the case when using the API.

As such, it is possible to create an alert rule where the name is:
```
<script>alert(1)</script>
```

Later, when a victim browses to the Alerts > Alert Rule page, PHP script\xc2\xa0`includes/html/print-alert/rules.php`\xc2\xa0is called. It notably includes the file\xc2\xa0`includes/html/modal/alert_rule_list.inc.php`, which returns HTML code for a modal window that searches alert rules.

The modal window includes an HTML table with all rules, including their name, and an inline JavaScript that calls the\xc2\xa0`bootgrid()`\xc2\xa0function ([http://www.jquery-bootgrid.com/](http://www.jquery-bootgrid.com/)) for styling and enhancing the table.

`alert_rule.list.inc.php` sanitizes the rule name with the function `e()` before including it in the table, which XML encodes all special characters. However the\xc2\xa0`bootgrid()`\xc2\xa0function rewrites the table cells content when enhancing the table, and as a side effect, XML character references are decoded. After the script updated the table, the browser now interprets the payload as HTML tags and includes the code to the DOM.

# Detection guidance
- inspect HTTP POST and PUT requests to a Request-URI that includes the string\xc2\xa0`/api/v0/rules`
- check if the\xc2\xa0`name`\xc2\xa0JSON value includes a `<` character

# PoC
The proof-of-concept can be run as such:
```
python3 poc.py ip_addr -T <token>
```


-- CREDIT ---------------------------------------
This vulnerability was discovered by:
Simon Humbert of Trend Research of Trend Micro

-- FURTHER DETAILS ------------------------------

Supporting files:


If supporting files were contained with this report they are provided within a password protected ZIP file. The password is the ZDI candidate number in the form: ZD