Skip to main content

Snipe-IT CVE-2026-54329

| EUVDEUVD-2026-42982 HIGH
Improper Neutralization of Special Elements in Output Used by a Downstream Component ('Injection') (CWE-74)
2026-06-23 https://github.com/grokability/snipe-it GHSA-pwpj-p52h-q484
7.7
CVSS 3.1 · NVD
Share

Severity by source

NVD PRIMARY
7.7 HIGH
AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N
vuln.today AI
7.7 HIGH

Network API reachable with low-privilege auth and no interaction (AV:N/AC:L/PR:L/UI:N); crossing the tenant boundary justifies S:C with high integrity and no confidentiality/availability impact.

3.1 AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N
4.0 AV:N/AC:L/AT:N/PR:L/UI:N/VC:N/VI:H/VA:N/SC:N/SI:L/SA:N

Primary rating from NVD.

CVSS VectorNVD

Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Confidentiality
None
Integrity
High
Availability
None

Lifecycle Timeline

6
Analysis Updated
Jul 10, 2026 - 20:33 vuln.today
v3 (cvss_changed)
Analysis Updated
Jul 10, 2026 - 20:32 vuln.today
v2 (cvss_changed)
Re-analysis Queued
Jul 10, 2026 - 20:22 vuln.today
cvss_changed
CVSS changed
Jul 10, 2026 - 20:22 NVD
8.5 (HIGH) 7.7 (HIGH)
Source Code Evidence Fetched
Jun 23, 2026 - 23:51 vuln.today
Analysis Generated
Jun 23, 2026 - 23:51 vuln.today

DescriptionNVD

Impact

A cross-tenant data injection vulnerability was identified in the Snipe-IT Accessories API when Full Multiple Companies Support (FMCS) is enabled. A low-privileged authenticated user belonging to one company can create an accessory record under another company by supplying a foreign company_id value in the API request body.

The issue occurs because the API create path mass-assigns request parameters directly to the Accessory model, and the Accessory model allows company_id to be mass assigned. Unlike the web controller, which uses Company::getIdForCurrentUser() to enforce the authenticated user’s company context, the API controller does not apply equivalent tenant enforcement during accessory creation.

As a result, a Company A user can inject persistent accessory records into Company B. The injected records are then visible to Company B users as legitimate Company B inventory records. This breaks the integrity of company-scoped inventory data and represents a tenant isolation failure in the accessory creation flow.

Patches

Patched in https://github.com/grokability/snipe-it/commit/dc8cbf4786bb38b260b4ae1723ec9e7f81d82fe5

AnalysisAI

Cross-tenant data injection in the Snipe-IT Accessories API (versions <= 8.6.1) lets a low-privileged authenticated user in one company write persistent accessory records into another company's inventory by supplying a foreign company_id in the API request body. The flaw only manifests when Full Multiple Companies Support (FMCS) is enabled, and it breaks tenant isolation because the API store/update path mass-assigns company_id without the enforcement the web UI applies. There is no public exploit identified at time of analysis and it is not in CISA KEV, but the fix and a regression test are publicly visible in the vendor commit, making the mechanism easy to reproduce.

Technical ContextAI

Snipe-IT is a PHP/Laravel-based open-source IT asset management platform; the affected component is the REST API AccessoriesController (app/Http/Controllers/Api/AccessoriesController.php). Its multi-tenancy feature, FMCS, is meant to scope every record to the authenticated user's company. The root cause is CWE-74 (improper neutralization / injection) expressed as a Laravel mass-assignment problem: the API store() method binds request parameters directly onto the Accessory Eloquent model, and the model whitelists company_id as fillable. The parallel web controller sanitizes this by calling Company::getIdForCurrentUser(), but the API controller omitted that call, so an attacker-supplied company_id survives to persistence. The vendor patch (commit dc8cbf47) adds $accessory->company_id = Company::getIdForCurrentUser($request->input('company_id')) to both store() and update(), and the same fix was applied to Components, Consumables, Departments, and Licenses controllers, indicating the mass-assignment gap spanned multiple API resources.

RemediationAI

Vendor-released patch: upgrade to Snipe-IT 8.6.2 or later (https://github.com/grokability/snipe-it/releases/tag/v8.6.2), which enforces Company::getIdForCurrentUser() on API create and update for accessories, components, consumables, departments, and licenses (fix commit https://github.com/grokability/snipe-it/commit/dc8cbf4786bb38b260b4ae1723ec9e7f81d82fe5); see advisory https://github.com/grokability/snipe-it/security/advisories/GHSA-pwpj-p52h-q484. If you cannot upgrade immediately, the most direct compensating control is to disable Full Multiple Companies Support, which fully removes the attack surface but collapses tenant separation and is disruptive for genuinely multi-company deployments. Otherwise, restrict or revoke API token issuance and accessory-create permissions for untrusted low-privilege users, and monitor accessory/component/consumable/department/license records for entries whose company_id does not match the creating user's company. Because this is server-side authorization logic, a WAF cannot reliably distinguish a malicious company_id from a legitimate one, so upgrading remains the only complete fix.

Share

CVE-2026-54329 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy