Aug 28, 2026·4 min read·16 visits
An authorization logic error in Snipe-IT allows low-privilege users who only possess license checkout (assignment) permissions to bypass restrictions and execute license check-ins (reclamations), potentially disrupting asset tracking states.
Snipe-IT prior to version 8.6.2 is vulnerable to an incorrect authorization flaw (CWE-863) within its legacy single-seat license check-in workflow. The application incorrectly validates authorization using the 'checkout' permission instead of the 'checkin' permission. This allows authenticated users who are authorized only to assign licenses, but explicitly restricted from unassigning them, to directly access and execute license seat check-ins, bypassing intended role-based access controls.
Snipe-IT is a widely adopted open-source IT asset and license management system developed by Grokability. Within its license management subsystem, assets and licenses follow a strict lifecycle governed by role-based access control (RBAC). Legitimate administrative workflows separate the capability to assign (checkout) a license seat from the capability to reclaim (checkin) that same license seat. This separation of duty ensures that deployment staff can distribute software seats without having the authority to revoke or reassign active seats from users or assets.
The vulnerability is located within the legacy single-seat license check-in controller. This component manages legacy web interfaces designed to process individual license seat check-ins. Because these legacy routes remain active and accessible in versions prior to 8.6.2, they present a viable attack surface to authenticated users.
By exploiting an incorrect authorization check in this legacy flow, an authenticated attacker with low-level privileges can bypass the administrative division of duties. The flaw maps the authorization checkpoint of a destructive action (revoking a license) to a non-destructive permission check (assigning a license), leading to unauthorized modification of license assignments.
The root cause of CVE-2026-55479 is an incorrect authorization check (CWE-863) within the application's controller logic. In Laravel-based frameworks like Snipe-IT, controller actions typically delegate authorization checks to corresponding Policy classes using the $this->authorize() method. This method expects an action name (the ability to check) and the target model instance to evaluate against the active session's roles.
In app/Http/Controllers/Licenses/LicenseCheckinController.php, the legacy endpoints for rendering the check-in view and handling the check-in submission were incorrectly constructed. Instead of calling $this->authorize('checkin', $license);, both the create and store methods invoked $this->authorize('checkout', $license);.
This implementation flaw creates a logical mapping error. Because the application queries the policy for the 'checkout' capability, any user who has permission to deploy or assign licenses is automatically authorized to access the check-in interface. The system fails to evaluate the user's explicit 'checkin' permissions, thereby collapsing two distinct privilege boundaries into a single, weaker boundary.
The vulnerability was resolved in version 8.6.2 by changing the validated action string in LicenseCheckinController.php. Below is the code diff of the vulnerable versus patched implementation:
// File: app/Http/Controllers/Licenses/LicenseCheckinController.php
public function create(LicenseSeat $licenseSeat, $backTo = null)
{
// Check if the asset exists
$license = License::find($licenseSeat->license_id);
- $this->authorize('checkout', $license);
+ $this->authorize('checkin', $license);
return view('licenses/checkin', compact('licenseSeat'))->with('backto', $backTo);
}
public function store(Request $request, $seatId = null, $backTo = null)
{
// ... [validation and setup logic] ...
- $this->authorize('checkout', $license);
+ $this->authorize('checkin', $license);
// ... [database transaction and update logic] ...
}By replacing 'checkout' with 'checkin', the controller correctly directs Laravel's gates to query the user's checkin capability in the LicensePolicy class. This modification ensures that any attempt to render the check-in page or submit a check-in payload is restricted exclusively to authorized administrators. The fix is robust and completely eliminates the bypass vector on these legacy routes.
To exploit this vulnerability, an attacker must first obtain valid credentials to a Snipe-IT instance with a role that permits license checkout (assignment) but denies license check-in. The attacker then targets an active license seat identifier. Because the legacy check-in views do not rely on complex API structures, exploitation can be carried out using simple web requests.
First, the attacker requests the legacy check-in interface using a standard GET request: GET /licenses/checkin/<seatId>. Because the server incorrectly validates the 'checkout' permission, it returns the check-in form rather than a 403 Forbidden response. This form contains the required CSRF token for state-changing requests.
Next, the attacker constructs a POST request to submit the form: POST /licenses/checkin/<seatId>. The payload contains the CSRF token and the target seat parameters. The controller processes the state change and unassigns the license seat from the assigned user or asset, returning it to the available license pool.
The impact of CVE-2026-55479 is primarily restricted to unauthorized modification of application state and data integrity. While an attacker cannot read sensitive configuration files or execute arbitrary code, they can completely disrupt asset management records. By checking in active license seats, attackers can dissociate corporate software licenses from employees and systems, leading to operational confusion and administrative overhead.
The vulnerability does not allow access to other administrative zones, such as user creation or system settings, unless those areas are independently misconfigured. The CVSS v4.0 base score of 5.3 reflects a network-based attack vector requiring low privileges, with low integrity impact and no confidentiality or availability consequences. This classification reflects a standard privilege escalation scenario within a business application context.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N| Product | Affected Versions | Fixed Version |
|---|---|---|
snipe-it grokability | < 8.6.2 | 8.6.2 |
| Attribute | Detail |
|---|---|
| CWE ID | CWE-863 (Incorrect Authorization) |
| Attack Vector | Network |
| CVSS v3.1 Score | 4.3 (Medium) |
| CVSS v4.0 Score | 5.3 (Medium) |
| Exploit Status | none |
| CISA KEV Status | False |
The application performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly authorize the actor.
CVE-2026-109619 (PHP2Shell) is a critical Use-After-Free vulnerability in the core PHP engine caused by improper global state cleanup during out-of-memory exception handling across persistent worker requests.
In Python virtualenv prior to version 21.14.9, activation script generators and configuration writers use Path.exists() before writing files. Because Path.exists() resolves symbolic links, it returns False for dangling symlinks. Consequently, virtualenv skips unlinking pre-planted symbolic links or hard links, writing data directly to target locations outside the intended virtual environment directory.
A remote code execution vulnerability exists in Microsoft .NET due to untrusted data deserialization within the PresentationCore component. The flaw stems from implicit auto-conversion flags during clipboard data retrieval operations.
An out-of-bounds write vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio allows unauthenticated remote attackers to execute arbitrary code via crafted pixel-shader bytecode or auto-converted clipboard payloads.
ASP.NET Core contains a thread deadlock vulnerability (CWE-833) that allows an unauthenticated remote attacker to cause a denial of service over the network by exhausting server thread pool resources.
CVE-2026-70035 is a high-severity Remote Code Execution (RCE) vulnerability in Microsoft .NET Framework, .NET runtime, and Visual Studio caused by improper handling during the deserialization of untrusted data (CWE-502). An unauthenticated attacker can execute arbitrary code within the context of the affected process by delivering a crafted serialized payload.