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-48507

CVE-2026-48507: Incorrect Authorization in Snipe-IT Bulk User Edit and Merge Features

Amit Schendel
Amit Schendel
Senior Security Researcher

Jun 24, 2026·8 min read·2 visits

Executive Summary (TL;DR)

Low-privileged users with 'users.edit' permissions in Snipe-IT < 8.6.0 can deactivate administrative accounts or hijack them via bulk edit and user merge features, leading to complete Denial of Service or horizontal privilege escalation.

An incorrect authorization vulnerability (CWE-863) in Snipe-IT versions prior to 8.6.0 allows authenticated, low-privileged users with granular 'users.edit' permissions to modify restricted user flags ('activated' and 'ldap_import') and merge high-privileged administrator accounts into standard user accounts. This allows an attacker to lock administrators out of the system or completely hijack administrator accounts.

Vulnerability Overview

Snipe-IT is a widely deployed, open-source IT asset and license management system used by enterprises to track hardware, software licenses, accessories, and consumables. To maintain security, Snipe-IT utilizes a role-based access control (RBAC) model allowing administrators to assign granular permissions to operators. Among these is the users.edit permission, which authorizes a standard user to modify general details of specific asset operators or employees within their scope of responsibility.

The vulnerability designated as CVE-2026-48507 represents an incorrect authorization vulnerability (CWE-863) within Snipe-IT's bulk actions sub-system, specifically affecting versions prior to 8.6.0. While the platform successfully enforces logical boundaries and security checks on a per-user edit basis (e.g., preventing standard operators from modifying administrator fields), these safety mechanisms were absent in the bulk user processing pathways. Specifically, the bulk user update endpoint (/users/bulkeditsave) and the user merge endpoint (/users/merge/save) failed to perform individual record validation against the actor's security boundaries.

This systemic oversight introduces two distinct attack vectors. First, an authenticated operator with basic editing privileges can bulk-disable the activated status of all system administrators, triggering an instant Denial of Service (DoS) and locking out the administrative tier. Second, an attacker can exploit the account-merging mechanism to absorb high-privileged administrative accounts into a low-privileged identity, achieving horizontal privilege escalation and full application takeover.

Root Cause Analysis

The fundamental flaw stems from the design of bulk operations in Laravel-based controllers where authorization checks are executed globally rather than iteratively. In Snipe-IT, individual user updates route through logic that validates authorization boundaries, such as confirming whether the authenticated session possesses the specialized canEditAuthFields permission relative to the target user. This boundary is critical because it ensures that standard administrators cannot edit superusers, and non-administrative staff cannot modify administrative accounts.

However, when processing bulk actions, the application relied on the BulkUsersController.php controller to manage multiple entities in a single HTTP request transaction. For bulk user editing, the controller accepted inputs and mapped them directly into a global mass-assignment update array using the helper method conditionallyAddItem(). Because parameters like activated (which controls login capabilities) and ldap_import (which handles password reset routing) were added directly to this array, the database layer updated all matching record IDs without evaluating the canEditAuthFields policy for each user in the array.

For the user merge feature, the root cause lies in a weak global authorization check. The controller verified access using Laravel's policy framework on the generic User model namespace with $this->authorize('update', User::class). This statement only verifies if the actor is generally allowed to update users, failing to iterate through the collection of users specified in the ids_to_merge payload. Consequently, the application permitted a standard user to merge any administrator account into another, causing the administrative record to be soft-deleted and its assets/permissions to be reassigned to the target merged ID.

Code Analysis and Vulnerable Code Paths

To understand the mechanics, we can analyze the vulnerable implementation of the mass update processing array inside BulkUsersController.php before the patch. The conditionallyAddItem helper was utilized to dynamically construct the SQL query array, completely bypassing the Eloquent model's model-level validation loop for sensitive authentication structures.

// VULNERABLE: BulkUsersController.php (prior to version 8.6.0)
$this->update_array =  $this->conditionallyAddItem('company_id')
    ->conditionallyAddItem('locale')
    ->conditionallyAddItem('remote')
    ->conditionallyAddItem('ldap_import') // Vulnerable: Allowed administrative fields in global update array
    ->conditionallyAddItem('activated')   // Vulnerable: Allowed administrative fields in global update array

The patch on May 21, 2026, resolved this by stripping the activated and ldap_import parameters out of the mass-assignment initialization sequence and implementing an explicit per-user authorization loop. In this updated control path, the system enforces the canEditAuthFields permission for every single target user record within the bulk request collection.

// PATCHED: BulkUsersController.php (version 8.6.0)
// 1. Remove sensitive auth fields from the initial array structure
$this->update_array = $this->conditionallyAddItem('company_id')
    ->conditionallyAddItem('locale')
    ->conditionallyAddItem('remote'); // Note: 'activated' and 'ldap_import' are omitted
 
// 2. Iterate over the collection of user records and enforce strict logical checks
foreach ($users as $user) {
    if (auth()->user()->can('canEditAuthFields', $user) && auth()->user()->can('editableOnDemo')) {
        $authFieldUpdate = [];
        if ($request->filled('activated')) {
            $authFieldUpdate['activated'] = $request->input('activated');
        }
        if ($request->filled('ldap_import')) {
            $authFieldUpdate['ldap_import'] = $request->input('ldap_import');
        }
        if (! empty($authFieldUpdate)) {
            $user->update($authFieldUpdate); // Perform update only after authorization passes
        }
    }
}

Furthermore, the patch hardened the user merging process. Instead of validating a general, non-specific class model update permission (User::class), the controller was upgraded to verify the delete capability on the specific class model, followed by a strict evaluation of authorization levels on every user being merged. If the actor lacks the authority to edit the authentication fields of even one target user in the merge set, the process is terminated.

// PATCHED: User Merge Security Checks
public function merge(Request $request)
{
    $this->authorize('delete', User::class); // Elevate general authorization constraint
    
    // ... Retrieval of users_to_merge collection ...
 
    foreach ($users_to_merge as $user_to_merge) {
        // Iterate and block if the actor lacks permissions to touch this specific record
        if (! auth()->user()->can('canEditAuthFields', $user_to_merge) || ! auth()->user()->can('editableOnDemo')) {
            return redirect()->route('users.index')->with('error', trans('general.insufficient_permissions'));
        }
    }
}

Exploitation Methodology and Attack Scenarios

An attack leveraging CVE-2026-48507 relies entirely on authenticated, low-privileged network access with the granular permission users.edit active on the actor's profile. The complexity is extremely low because the exploit does not require heap manipulation, shellcode, or memory disclosure. It is executed purely via standard application layer parameters over HTTP.

In a Denial of Service scenario, the attacker begins by identifying the unique identifiers (IDs) corresponding to administrative users. In default or standard deployments, IDs such as 1, 2, or 3 typically correspond to root or primary administrator profiles. The attacker then constructs a raw HTTP POST request to the /users/bulkeditsave endpoint. The POST payload sets the ids[] array to contain the target administrator IDs, and passes the parameter activated with a value of 0 (indicating deactivation).

POST /users/bulkeditsave HTTP/1.1
Host: vulnerable-snipeit.local
Authorization: Bearer <low_privilege_token>
Content-Type: application/x-www-form-urlencoded
 
ids[]=1&ids[]=2&activated=0

In a Privilege Escalation/Account Hijacking scenario, the attacker exploits the merge route. By selecting an administrative target ID and sending it as the ids_to_merge[] array parameter to /users/merge/save with the merge_into_id parameter assigned to the attacker's own user ID, the administrative account is merged. This triggers a soft delete on the administrator's original record, reassigning all corresponding permissions, configurations, and tracked assets directly to the attacker's low-privileged profile.

POST /users/merge/save HTTP/1.1
Host: vulnerable-snipeit.local
Authorization: Bearer <low_privilege_token>
Content-Type: application/x-www-form-urlencoded
 
ids_to_merge[]=1&merge_into_id=15

Impact Assessment

The severity of CVE-2026-48507 is classified as High, carrying a CVSS v3.1 base score of 7.1. While the vulnerability requires low-privileged user credentials to exploit, the resulting impact presents a critical operational risk. The primary impact vectors manifest as high availability degradation and compromise of system integrity.

From an availability standpoint, the bulk-deactivation attack vector allows an operator to instantly disconnect and block all administrative and superuser accounts. Since the primary administrative tier is locked out of the instance, resolving this requires direct, manual backend intervention within the application's SQL database. This creates a persistent denial of administration, disrupting asset distribution, audit controls, and platform governance.

From an integrity perspective, the user merge functionality allows an insider threat to completely hijack higher-privileged identities. When an administrative account is merged into a lower-privileged identity, the administrative record is soft-deleted, and all their checked-out licenses, intellectual property metadata, security logs, and organizational ownership flow straight into the attacker's account context. This facilitates silent horizontal privilege escalation and allows attackers to bypass security segregation policies.

Remediation and Mitigation

The definitive resolution for CVE-2026-48507 is updating the Snipe-IT installation to version 8.6.0 or higher. The official security patch enforces granular authorization gates inside the loop processing of bulk edits and elevates the baseline permission required for user merges to delete. Furthermore, any attempt to run a merge will fail if any user record within the source group contains a higher privilege tier than the operating user is authorized to edit.

If upgrading immediately is not operationally viable due to change-management or staging constraints, organizations must implement emergency mitigating controls. Administrators should perform an audit of all user roles and immediately revoke the granular users.edit and users.delete privileges from all standard, operator, or untrusted personnel. Access to these bulk features should be strictly restricted to the highest class of security personnel.

Additionally, organizations can deploy temporary Web Application Firewall (WAF) or web server rules to reject bulk requests targeting user endpoints from unauthorized sessions. For example, restricting access to /users/bulkeditsave and /users/merge/save at the reverse-proxy layer (such as Nginx or Apache HTTP Server) to only allow requests originating from verified administrator IP address pools or administrators' session cookies can significantly reduce the internal and remote attack surface.

Official Patches

GrokabilityOfficial patch fixing bulk update and merge authorization checks

Fix Analysis (1)

Technical Appendix

CVSS Score
7.1/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:H
EPSS Probability
0.19%
Top 91% most exploited

Affected Systems

Snipe-IT Asset Management System (versions prior to 8.6.0)

Affected Versions Detail

Product
Affected Versions
Fixed Version
Snipe-IT
Grokability
< 8.6.08.6.0
AttributeDetail
CWE IDCWE-863 (Incorrect Authorization)
Attack VectorNetwork / Remote
CVSS Score7.1 (High)
EPSS Score0.00194 (Percentile: 9.18%)
ImpactPrivilege Escalation / Denial of Service (Administrator Lockout)
Exploit StatusProof-of-Concept via Integration Tests
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1068Exploitation for Privilege Escalation
Privilege Escalation
CWE-863
Incorrect Authorization

The software performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly execute the check.

Known Exploits & Detection

GitHub Security Advisory Integration TestsIntegration test cases demonstrating deactivation of admins and merging of accounts by non-admins.

Vulnerability Timeline

Official fix patch committed to the Snipe-IT repository on GitHub
2026-05-21
CVE-2026-48507 published to the NVD registry
2026-06-08
Full GitHub Advisory released (GHSA-6f75-x745-xcpr)
2026-06-08
Vulnerability analysis and intelligence details consolidated
2026-06-23

References & Sources

  • [1]GitHub Security Advisory (GHSA-6f75-x745-xcpr)
  • [2]Official Patch Commit
  • [3]CVE.org Record
  • [4]Wiz Vulnerability Database Details

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

•3 minutes ago•GHSA-WCMJ-X466-56MM
6.1

GHSA-WCMJ-X466-56MM: Arbitrary File Write via UNIX Symbolic Link Following in OpenTofu

A UNIX symbolic link following vulnerability exists in the provider cache installation mechanism of OpenTofu. This flaw allows an attacker with control over the repository files to write files outside of the intended workspace boundary during initialization.

Amit Schendel
Amit Schendel
0 views•6 min read
•about 2 hours ago•GHSA-W2J7-F3C6-G8CW
4.7

GHSA-w2j7-f3c6-g8cw: Open Redirect Bypass via Parser Differential in Flask-Security

An open redirect vulnerability exists in Flask-Security versions up to and including 5.8.0. This flaw allows remote, unauthenticated attackers to perform open redirects by exploiting a parser differential between Python's standard library urlsplit() function and modern web browsers when subdomain redirection is allowed.

Amit Schendel
Amit Schendel
2 views•8 min read
•about 5 hours ago•CVE-2026-49205
6.5

CVE-2026-49205: Missing Authorization in phpMyFAQ Public REST API Write Endpoints

An incomplete security patch for CVE-2026-24421 in phpMyFAQ allows authenticated low-privileged users to bypass role-based access controls. While the initial patch addressed missing authorization in the BackupController, it left four critical write-enabled endpoints vulnerable. This allows remote attackers with a valid low-privilege API token to perform unauthorized data modifications, creating categories, creating FAQs, updating FAQs, and injecting questions directly into the database.

Amit Schendel
Amit Schendel
6 views•5 min read
•about 14 hours ago•GHSA-74P7-6H78-GW8P
8.6

GHSA-74P7-6H78-GW8P: Multiple Critical Security Flaws in skillctl Agent-Skill Manager

An in-depth security audit of the skillctl command-line package manager revealed five critical and high-severity security vulnerabilities. The identified flaws span parameter-level command argument injection via the source_sha parameter, uncontrolled resource consumption (Denial of Service) through unnamed UNIX FIFOs and character devices, directory path traversal in the destination argument, commit-message trailer forgery via newline injection in skill names, and local credential exfiltration leveraging UNIX hardlinks. These vulnerabilities represent significant vectors for workstation compromise when executing agentic tasks in repositories containing untrusted files or pull requests. Remediation was introduced in version v0.1.3.

Alon Barad
Alon Barad
6 views•6 min read
•about 18 hours ago•CVE-2026-48153
8.5

CVE-2026-48153: Server-Side Request Forgery in Budibase OAuth2 SDK

CVE-2026-48153 is a Server-Side Request Forgery (SSRF) vulnerability in the Budibase OAuth2 SDK prior to version 3.39.0. It allows authenticated low-privileged users to bypass outbound network security blacklists and send arbitrary requests to internal subnets or cloud metadata services.

Alon Barad
Alon Barad
10 views•7 min read
•about 19 hours ago•GHSA-GHMH-JHMJ-WCMF
5.1

GHSA-GHMH-JHMJ-WCMF: Plaintext Storage of Enrollment Tokens at Rest in SQLite in nebula-mesh

The self-hosted Slack Nebula VPN control plane, nebula-mesh, stored high-privilege enrollment tokens in plaintext inside its SQLite database. This flaw allowed any adversary with read access to the database to retrieve pending tokens and enroll unauthorized hosts into the secure VPN mesh.

Alon Barad
Alon Barad
6 views•8 min read