Aug 29, 2026·7 min read·2 visits
An authenticated attacker with low privileges can revoke any user's access tokens via an IDOR vulnerability in Graylog's token removal API endpoint.
An Insecure Direct Object Reference (IDOR) vulnerability exists within the access-token revocation endpoint of Graylog. Authenticated users can exploit this flaw to delete access tokens belonging to other users, including high-privileged administrator accounts, thereby disrupting active integrations and API access.
The graylog2-server component of Graylog contains an Insecure Direct Object Reference (IDOR) vulnerability in its REST API interface. The security flaw is located within the access-token revocation mechanism, which is managed by the UsersResource class. Under normal operations, users should only be authorized to generate, view, and destroy access tokens that are assigned to their own accounts.
The vulnerability allows an authenticated attacker to bypass authorization boundaries and revoke active tokens belonging to arbitrary users. This behavior is possible because the endpoint processes requests based on attacker-controlled inputs without performing relational validation between the token owner and the requesting entity. The primary impact is the unauthorized modification of system state, leading to a localized disruption of services.
This flaw poses a risk to environments where automated services, ingestion pipelines, and administrative workflows rely on static access tokens. Unplanned token revocation can invalidate automated sessions and disrupt logs processing across the enterprise network. Understanding the technical mechanics of this endpoint is necessary to mitigate the risks associated with this vulnerability.
The root cause of CVE-2026-55867 lies in the logical implementation of the revokeToken method inside the UsersResource controller. This endpoint accepts two primary path parameters: userId and idOrToken. During API processing, the application relies on the userId parameter to retrieve the associated user record and perform a permission check.
The controller verifies if the calling session is permitted to perform the USERS_TOKENREMOVE action on the user retrieved via userId. If a low-privileged attacker provides their own user identifier as the userId, the authorization routine evaluates this action as legitimate and permits the request to proceed. This creates a logical flaw where authorization is granted based on one input while the state-changing operation is performed on another.
Following the successful authorization check, the method queries the database using the second parameter, idOrToken, to fetch the actual AccessToken object. The application fails to verify whether the retrieved token actually belongs to the user validated in the first step. The system executes the deletion command accessTokenService.destroy(accessToken) directly, thereby allowing the deletion of any token whose ID is known.
To understand the vulnerability, it is necessary to examine the vulnerable Java code implementation alongside the patched version. The vulnerable implementation retrieves the user based on the path parameter before performing the permission check, and then separately retrieves the access token.
// Vulnerable Code Implementation
public void revokeToken(
@Parameter(name = "userId", required = true) @PathParam("userId") String userId,
@Parameter(name = "idOrToken", required = true) @PathParam("idOrToken") String idOrToken) {
// The application checks authorization using the client-supplied 'userId'
final User user = loadUserById(userId);
final String username = user.getName();
if (!isPermitted(USERS_TOKENREMOVE, username)) {
throw new ForbiddenException("Not allowed to remove tokens for user " + username);
}
// The application retrieves the token directly, without checking ownership
final AccessToken accessToken = Optional.ofNullable(accessTokenService.loadById(idOrToken))
.orElse(accessTokenService.load(idOrToken));
if (accessToken != null) {
// The token is destroyed regardless of who owns it
accessTokenService.destroy(accessToken);
} else {
throw new NotFoundException("Couldn't find access token for user " + username);
}
}The patch resolved this issue by refactoring the verification logic to depend entirely on the retrieved token object instead of the user-supplied parameter. The userId parameter is left in the function signature only to maintain backwards compatibility with existing clients, but it is no longer used during validation.
// Patched Code Implementation
public void revokeToken(
@Parameter(name = "userId", required = true) @PathParam("userId") String userId,
@Parameter(name = "idOrToken", required = true) @PathParam("idOrToken") String idOrToken) {
// The token is loaded first using the 'idOrToken' path parameter
final AccessToken accessToken = Optional.ofNullable(accessTokenService.loadById(idOrToken))
.orElseGet(() -> accessTokenService.load(idOrToken));
if (accessToken == null) {
// The error message is generic to prevent username enumeration or leakage
throw new NotFoundException("Couldn't find access token for user.");
}
// Authorization is evaluated against the actual owner of the retrieved token
if (!isPermitted(USERS_TOKENREMOVE, accessToken.getUserName())) {
throw new ForbiddenException("Not allowed to remove token for user " + accessToken.getUserName());
}
// State destruction is performed only after a successful authorization check
accessTokenService.destroy(accessToken);
}This refactoring represents a complete fix because it couples the authorization context to the target database record. Because the code retrieves the token first and extracts its actual owner's username directly from the persistent storage, an attacker cannot manipulate the validation context. There are no known bypasses or variant attack paths targeting this specific controller logic post-patch.
Exploitation of CVE-2026-55867 requires a low-privilege authenticated account on the Graylog server. The attacker must also possess or acquire the target token's unique identifier or the token value itself. Because token values are often represented as database-assigned UUIDs, the attack is highly feasible if token IDs are leaked through other endpoints, log files, or session states.
An attacker initiates the attack by crafting a malicious HTTP DELETE request. The attacker sets the userId segment of the URI path to their own valid user identifier, which satisfies the server's initial checks. The target token's ID is placed in the idOrToken segment of the path, pointing the application to the resource scheduled for destruction.
DELETE /api/users/attacker_user_id/tokens/victim_token_id HTTP/1.1
Host: graylog.example.com
Authorization: Basic YXR0YWNrZXI6cGFzc3dvcmQ=
Accept: application/jsonUpon receiving this request, the server executes the vulnerable code path, validating the attacker's permissions on their own account and then deleting the victim's token. The server returns an HTTP 204 No Content or 200 OK response, indicating a successful deletion. The target token is immediately invalidated in the database, terminating any active sessions or integrations utilizing that token.
The security impact of CVE-2026-55867 is categorized primarily as an integrity and availability concern. Although the vulnerability does not allow an attacker to view the contents of other users' tokens or read sensitive data, unauthorized deletion of credentials represents a significant operational risk.
If an attacker targets tokens used by administrators or high-privilege service integrations, they can disrupt critical workflows. Automated ingestion pipelines, log collectors, alert forwarders, and SIEM integrations that rely on persistent access tokens will immediately fail upon token revocation. This results in a localized denial of service and potential visibility gaps in security monitoring.
From an access control perspective, the vulnerability breaks the principle of least privilege by allowing lower-privileged users to modify administrative configurations. However, because the flaw cannot be exploited without authenticating first and does not lead to direct code execution or information disclosure, it is assigned a CVSS base score of 5.3 (Medium).
The recommended remediation path is to upgrade affected Graylog instances to the fixed versions. The vendor has released patches in versions 6.3.12, 7.0.7, and 7.1.2 which properly address the authorization flow. These updates should be scheduled and applied according to standard change management procedures.
> [!NOTE]
> If immediate patching is not possible, security administrators can implement temporary defensive measures. Organizations should monitor Graylog REST API access logs for anomalous DELETE requests targeting /api/users/*/tokens/* where the user ID in the path does not align with the authenticated session's user identity.
Additionally, restricting network access to the Graylog web console and REST API limits the potential attack surface. Limiting API access to trusted administrative workstations and internal networks reduces the likelihood of unauthorized exploitation by untrusted actors.
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:L/VA:L/SC:N/SI:N/SA:N| Product | Affected Versions | Fixed Version |
|---|---|---|
graylog2-server Graylog | >= 6.2.0, < 6.3.12 | 6.3.12 |
graylog2-server Graylog | >= 7.0.0-alpha.1, < 7.0.7 | 7.0.7 |
graylog2-server Graylog | >= 7.1.0-alpha.1, < 7.1.2 | 7.1.2 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-639 |
| Attack Vector | Network |
| Privileges Required | Low (Authenticated) |
| CVSS v4.0 Score | 5.3 (Medium) |
| Exploit Status | None |
| KEV Status | Not Listed |
The system uses user-controlled keys or identifiers to access resource objects without sufficiently verifying that the authenticated user has authorization to access or modify those objects.
A high-severity log evasion and tampering vulnerability in Graylog's FortiGate key-value syslog parser allows unauthenticated remote attackers to modify, delete, or overwrite critical security log fields, potentially bypassing security controls and monitoring systems.
An improper authorization vulnerability in SeaweedFS versions 4.08 through 4.33 allows authenticated, low-privileged users to bypass directory isolation and perform unauthorized metadata operations within S3Tables and Iceberg REST interfaces. The vulnerability arises from an automatic collapse of account-less static identities to the default administrative principal, combined with a fail-open default policy configuration and self-referential authorization parameters in the table bucket listing routines. Together, these logical flaws expose administrative configurations and namespace architectures to unprivileged actors. The issue is resolved in version 4.34 by enforcing capability-based access checks, isolating fallback modes, and performing granular access verification on target buckets.
A critical path traversal vulnerability (CVE-2026-55874) in the SeaweedFS S3 API Gateway prior to version 4.34 allows authenticated remote attackers with write access to at least one bucket to bypass isolation. By supplying crafted directory traversal sequences in the X-Amz-Copy-Source header, an attacker can read objects from arbitrary buckets on the same deployment.
A Stored Cross-Site Scripting (XSS) vulnerability exists in the silverstripe/versioned package prior to version 3.2.1. When an administrator restores an archived page containing a crafted Title or URLSegment, the generated restoration message is rendered as CAST_HTML without proper sanitization. This allows malicious JavaScript to execute in the administrator's browser session, compromising the confidentiality and integrity of the CMS dashboard.
A concurrency synchronization flaw (race condition) exists in the Authentication Server Function (AUSF) of the free5GC 5G core network implementation. In versions 1.4.4 and earlier, authentication contexts are stored in a global sync.Map keyed solely by the Subscriber Permanent Identifier (SUPI). If multiple concurrent authentication requests are received for the same SUPI, the active security parameters (such as keys and expected responses) are unconditionally overwritten, resulting in authentication failures for the legitimate user.
free5GC is an open-source implementation of the 5G core network. Prior to version 1.4.5, the Authentication Server Function (AUSF) component of free5GC performs cryptographic comparisons within its Service-Based Interface (SBI) handling logic using non-constant-time helpers. These comparison utilities return immediately upon encountering a mismatching character, creating a covert timing channel. Concurrently, the AUSF writes the expected validation vector to standard output logs at the INFO level, exposing sensitive cryptographic material to unauthorized processes or logging agents.