CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-55843

CVE-2026-55843: Privilege Demotion and Access Control Bypass via Parameter Omission in Snipe-IT

Amit Schendel
Amit Schendel
Senior Security Researcher

Aug 29, 2026·7 min read·2 visits

Executive Summary (TL;DR)

In Snipe-IT prior to 8.6.0, submitting a user update request without the 'permission' field causes the application to normalize the missing value to an empty array and overwrite the target user's existing permissions, leading to complete privilege demotion.

A comprehensive technical analysis of CVE-2026-55843, an Improper Privilege Management vulnerability (CWE-269) in Snipe-IT versions prior to 8.6.0. The vulnerability allows an authenticated editor or administrator to overwrite and strip the granular or administrative permissions of other users by omitting the permission parameter from profile update payloads. This issue has been resolved in Snipe-IT version 8.6.0.

Vulnerability Overview

Snipe-IT is an open-source IT asset and license management platform written in PHP on the Laravel framework. It manages sensitive corporate infrastructure details, hardware assignments, and software licensing. Given the nature of the application, fine-grained access control is critical to ensuring that only authorized users can assign assets or modify configuration settings. The attack surface of the application includes administrative management interfaces, specifically the endpoints exposed to manage user profiles and permission states.

This vulnerability, tracked as CVE-2026-55843, involves improper privilege management (CWE-269) within the user update logic. Specifically, the endpoint handling profile modifications fails to distinguish between an explicit request to remove permissions and an implicit request that merely updates standard profile details like names or email addresses. An authorized actor with user-modification permissions can leverage this vulnerability to completely strip the granular or administrative permissions of other accounts, including high-level administrators.

The vulnerability is particularly critical within multi-tenant or multi-administrator deployments of Snipe-IT. While it does not allow direct unauthenticated privilege escalation, it allows authorized users with intermediate privileges to degrade the system’s integrity and availability. This behavior can lead to a denial-of-service condition for administrators who suddenly find themselves locked out of administrative consoles and unable to perform their duties.

Root Cause Analysis

The root cause of CVE-2026-55843 lies in the state handling of partial updates inside the update() method of UsersController, located in app/Http/Controllers/Users/UsersController.php.

When processing an HTTP PUT or PATCH request to update a user's details, the controller accepts input fields from the request payload. In a secure architecture, optional fields that are not present in the payload should be ignored to prevent unintended modification of existing database states.

In the vulnerable implementation, the controller processes the permission input parameter unconditionally, regardless of whether it was actually sent by the client. The application retrieves the parameter via $request->input('permission'). When the client submits an update request that omits this field entirely, the Laravel framework returns null for this input. This null value is then directly forwarded to NormalizePermissionsPayloadAction::run() to prepare the data for database entry.

NormalizePermissionsPayloadAction::run() processes the input and, upon receiving a null value, normalizes it to an empty array ([]). This empty array is then passed to PreserveUnauthorizedPrivilegedPermissionsAction::run(). This action is designed as a safety filter to prevent non-superusers from elevating their own privileges or removing privileges they do not possess. However, if the active editor has identical or higher permissions than the target user (for example, an administrator editing another administrator), the filter allows the update to proceed. Because the input was normalized to an empty array, the action returns this empty or sparse array, which is then serialized using json_encode and stored in the database, erasing all existing permissions of the target user.

Code Analysis & Execution Flow

To understand the mechanical flow, we can analyze the data transformation from the initial HTTP request to the final database transaction. The following diagram illustrates how the missing parameter traverses the system logic to overwrite the database state:

The implementation within app/Http/Controllers/Users/UsersController.php prior to version 8.6.0 demonstrates this unconditional execution. The vulnerable block shows that permissions were updated on every profile save:

// Vulnerable Code Path
$user->permissions = json_encode(PreserveUnauthorizedPrivilegedPermissionsAction::run(
    requestedPermissions: NormalizePermissionsPayloadAction::run($request->input('permission')),
    authenticatedUser: $authenticatedUser,
    originalPermissions: $orig_permissions_array,
    targetUser: $user,
));

In version 8.6.0, the developers introduced a validation guard using $request->has('permission'). This condition ensures that the permission field is only updated if the key is explicitly supplied in the incoming request payload:

// Patched Code Path
if ($request->has('permission')) {
    $user->permissions = json_encode(PreserveUnauthorizedPrivilegedPermissionsAction::run(
        requestedPermissions: NormalizePermissionsPayloadAction::run($request->input('permission')),
        authenticatedUser: $authenticatedUser,
        originalPermissions: $orig_permissions_array,
        targetUser: $user,
    ));
}

This simple presence check successfully remediates the vulnerability. When a request is made to update a user's name or email address without sending the permission dictionary, the application leaves the existing database values intact.

Exploitation Blueprint & PoC Analysis

Exploitation of CVE-2026-55843 is straightforward and can be executed via any API client or proxy tool. An attacker must possess an active session with either administrative privileges or granular users.edit permissions. The objective is to demote or lock out a target user by stripping their privileges.

An attacker sends an HTTP PUT request targeting the user resource at /api/v1/users/{id} or the web-based update endpoint. The payload contains only the non-sensitive fields the attacker wishes to modify (such as updating the first name to its current value), while completely omitting the permission parameter. The server processes the request, matches the user privileges, detects no explicit security violation from PreserveUnauthorizedPrivilegedPermissionsAction because no new privileges are being requested, and commits the empty permission set to the database.

The official integration and feature tests written to verify the fix confirm this behavior. The test asserts that an admin updating another admin without the permission field should preserve the target's permissions, which failed in the vulnerable versions:

public function test_admin_updating_another_admin_without_permission_field_preserves_target_permissions()
{
    $editor = User::factory()->admin()->create();
    $target = User::factory()->admin()->create();
 
    $originalPermissions = $target->decodePermissions();
    $this->assertArrayHasKey('admin', $originalPermissions, 'Target should have admin permission set');
 
    $this->actingAs($editor)
        ->put(route('users.update', $target), [
            'first_name' => $target->first_name,
            'username' => $target->username,
            // 'permission' parameter is omitted
        ])
        ->assertRedirect();
 
    $this->assertEquals(
        $originalPermissions,
        $target->fresh()->decodePermissions(),
        'Target admin permissions should be unchanged when permission field is absent'
    );
}

Security & Architectural Impact

The security implications of CVE-2026-55843 are significant in environments relying on multi-tier access controls. The primary impact is the unauthorized modification of system integrity and the potential for severe operational disruption. By allowing an intermediate administrative account or an editor to strip permissions, a rogue actor can neutralize all other administrative accounts on the system, consolidating control or causing a complete denial of administrative capability.

The CVSS v4.0 score of 7.0 (High) reflects high integrity and availability impact on the target system. Because the vulnerability requires an active account with high privileges (PR:H), the exploitability metrics are lower compared to unauthenticated remote code execution flaws. However, inside large organizations where asset management is delegated to helpdesk staff with limited users.edit permissions, the risk of insider threat or lateral movement is amplified.

From an incident response perspective, the resulting state—where an administrator's permissions are suddenly set to [] or null—can mimic system errors or database corruption. This adds to the operational cost of the incident, as IT personnel must manually restore permissions through direct database manipulation or by restoring backups, resulting in downtime and lost productivity.

Remediation & Defensive Engineering

The definitive remediation for CVE-2026-55843 is to upgrade Snipe-IT to version 8.6.0 or newer. This release implements the necessary request-parameter check to ensure that user privileges are only modified when explicitly instructed by the administrator.

If an immediate upgrade is not feasible, organizations should implement strict operational controls. Administrators must avoid using the web interface or API to modify user profiles if there is any chance that the request payload will omit the permission field. API integrations that automate user synchronization (such as custom Active Directory or LDAP sync scripts) should be reviewed to verify that they do not perform partial updates that could trigger this bug.

Furthermore, security teams should implement detection and audit measures. This includes regularly auditing user modification logs within Snipe-IT and monitoring the database for users whose permissions column is set to an empty array ([]) or null. A SQL query can be run periodically to detect administrative accounts that have had their privileges cleared unexpectedly:

SELECT id, username, permissions FROM users WHERE permissions = '[]' OR permissions IS NULL;

Technical Appendix

CVSS Score
7.0/ 10
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N
EPSS Probability
0.54%
Top 57% most exploited

Affected Systems

Snipe-IT prior to version 8.6.0

Affected Versions Detail

Product
Affected Versions
Fixed Version
Snipe-IT
grokability
< 8.6.08.6.0
AttributeDetail
CWE IDCWE-269
Attack VectorNetwork
CVSS v4.0 Score7.0 (High)
EPSS Score0.00540 (Percentile: 43.02%)
ImpactPrivilege Demotion / Integrity & Availability Loss
Exploit StatusPoC / Integration Tests Public
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-269
Improper Privilege Management

The product does not properly assign, modify, track, or check privileges for an actor, leading to unintended access or denial of service.

Vulnerability Timeline

Official fix is committed to the GitHub repository
2026-05-14
Vulnerability is publicly disclosed under GHSA-j5g3-42wp-gqm3 and assigned CVE-2026-55843
2026-07-10
Snipe-IT v8.6.0 is released containing the fix
2026-07-10
NVD publishes and updates the CVE record
2026-07-13

References & Sources

  • [1]GitHub Fix Commit
  • [2]GitHub Security Advisory
  • [3]Snipe-IT v8.6.0 Release Notes
  • [4]NVD CVE Record
  • [5]CVE.org Record

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•13 minutes ago•CVE-2026-55848
8.6

CVE-2026-55848: GML Layer XML External Entity (XXE) Injection in MapFish Print

An XML External Entity (XXE) vulnerability in MapFish Print allows unauthenticated remote attackers to perform arbitrary local file disclosure and Server-Side Request Forgery (SSRF) by exploiting GML layer URL parameters in requests submitted to the /api/print3/print endpoint.

Amit Schendel
Amit Schendel
0 views•7 min read
•about 2 hours ago•CVE-2026-55856
5.9

CVE-2026-55856: Credential Disclosure via Out-of-Order Handshake in MariaDB Connector/J

A critical credential disclosure vulnerability in MariaDB Connector/J allows remote attackers to capture raw database passwords. The driver transmits plaintext passwords prior to verifying TLS certificate fingerprints when configured in ephemeral trust fallback states.

Amit Schendel
Amit Schendel
4 views•5 min read
•about 3 hours ago•CVE-2026-55857
5.9

CVE-2026-55857: Insecure Credential Transmission via PAM Dialog Plugin in MariaDB Connector/J

A transport-security omission in the MariaDB Connector/J driver allows remote on-path adversaries or rogue database servers to capture database credentials in cleartext. Under default configurations (sslMode=DISABLE), the driver fails to enforce encrypted channels when negotiating the Pluggable Authentication Module (PAM) 'dialog' plugin, resulting in cleartext transmission of sensitive passwords.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 4 hours ago•CVE-2026-55858
5.9

CVE-2026-55858: Client/Server Charset-Confusion SQL Injection in MariaDB Connector/J

CVE-2026-55858 describes a critical encoding desynchronization vulnerability in MariaDB Connector/J (the official JDBC driver). The vulnerability stems from a mismatch between the driver's static UTF-8 client-side escaping logic and dynamic character set changes initiated on the database server. When the server character set is switched mid-session to an encoding that permits ASCII-overlapping multibyte characters (such as GBK or Big5), an attacker can supply crafted inputs to swallow escaping backslashes, resulting in SQL injection and unauthorized statement execution.

Amit Schendel
Amit Schendel
3 views•6 min read
•about 5 hours ago•CVE-2026-55859
5.9

CVE-2026-55859: Client-Server Charset Confusion in MariaDB Connector/R2DBC leading to SQL Injection

An input validation and encoding desynchronization vulnerability exists in MariaDB Connector/R2DBC versions prior to 1.4.1. The driver assumes all communication utilizes the UTF-8 character set, but fails to account for server-driven mid-session changes to the character_set_client variable. When a change to a multi-byte character set such as GBK or Big5 is induced, the server interprets client-escaped single quotes as part of a multi-byte character. This state desynchronization bypasses standard escaping mechanisms and allows remote unauthenticated attackers to execute arbitrary SQL commands.

Alon Barad
Alon Barad
6 views•5 min read
•about 6 hours ago•CVE-2026-55860
5.9

CVE-2026-55860: Cleartext Password Disclosure in MariaDB Connector/R2DBC

A security vulnerability in the MariaDB Connector/R2DBC client driver allows credential theft during the database authentication phase. The client driver does not gate clear-text password authentication plugins on transport encryption, making it possible for on-path attackers or hostile database servers to intercept passwords.

Amit Schendel
Amit Schendel
5 views•5 min read