Summary
Snipe-IT: Maintenance Record Disclosure via Missing Authorization on GET
MaintenancesController::show() renders a maintenance record without any authorization check. Every other action in the controller authorizes against the asset; show() does not. Any user in the asset's company can read maintenance detail (asset tag, supplier, purchase cost, notes, dates) by visiting /maintenances/{id}, regardless of permissions.
Details
public function show(Maintenance $maintenance): View|RedirectResponse
{
return view('maintenances.view')->with('maintenance', $maintenance);
}
No authorize() call. The sibling actions all gate on the asset: index() calls authorize('view', Asset::class) (line 33), and edit()/update()/destroy() call authorize('update', $maintenance->asset) (lines 139, 166, 286). The route is registered with only the auth guard:
Route::resource('maintenances', MaintenancesController::class, ['middleware' => ['auth']]);
(routes/web/hardware.php:185). Route-model binding still applies the company scope, so the read is bounded to the caller's company; the absent permission gate is the defect. Maintenance IDs are sequential and visible in the record URL.
Proof of concept
- As an administrator, create an asset in a company (here,
CompanyA). Open the asset, choose Maintenances > Create, and add a record: nameMntA2, supplierSupA, a purchase cost, and notes. The saved record opens at/maintenances/{id}. - As the administrator, create a test user assigned to CompanyA, with every permission left unchecked. Activate the account.
- In a separate browser session, log in as the test user. Confirm it is unprivileged: the Assets and Maintenances navigation items are absent, and browsing to
/hardwarereturns 403. - In the address bar, browse to
http://<host>/maintenances/{id}.
Observed: the maintenance view renders in full for the unprivileged account.
GET /maintenances/5 -> HTTP 200 OK
Renders the "Maintenance" detail page for MntA2:
Asset: AssetA Supplier: SupA Cost: <value> Notes: <text> Dates: <...>
GET /hardware -> HTTP 403 (same account, asset list is gated)
GET /maintenances -> HTTP 403 (same account, maintenance list is gated)
GET /maintenances/2 -> HTTP 302 (record in CompanyB; company scope still hides it)
- The
testaccount holds zero permissions and still reads the record. - Only the unguarded
showroute leaks: the list view and the asset pages return 403 for the same account. - A maintenance in a different company (CompanyB) redirects away, confirming the FMCS company scope still holds.
Impact
Any activated account in a company can read every maintenance record for that company (asset tag, supplier, purchase cost, free-text notes, dates) without holding any asset or maintenance permission.
The application does not perform an authorization check before performing a sensitive operation. Typical impact: unauthorized access to restricted functionality or data.
CVE-2026-55703 has a CVSS score of 4.3 (Medium). The vector is network-reachable, low privileges required, and no user interaction. A CVSS score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether this affects your application depends on whether the vulnerable code is present and reachable in your environment. A fixed version is available (8.6.3); upgrading removes the vulnerable code path.
Affected versions
Security releases
Kodem intelligence
Severity tells you how bad this could be in the worst case. It does not tell you whether you are exposed. Exploitability and impact are functions of runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A vulnerable package can sit in your dependency tree and never run.
Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter. Kodem's runtime-powered SCA identifies whether this CVE is reachable in your applications.
Already deployed Kodem?
See it in your environmentNew to Kodem? Get a demo →Remediation advice
Frequently Asked Questions
- What is CVE-2026-55703? CVE-2026-55703 is a medium-severity missing authorization vulnerability in snipe/snipe-it (composer), affecting versions < 8.6.3. It is fixed in 8.6.3. The application does not perform an authorization check before performing a sensitive operation.
- How severe is CVE-2026-55703? CVE-2026-55703 has a CVSS score of 4.3 (Medium). This score reflects the worst-case severity of the vulnerability, not your specific exposure. Whether it represents real risk in your environment depends on whether the vulnerable code is present and reachable.
- Which versions of snipe/snipe-it are affected by CVE-2026-55703? snipe/snipe-it (composer) versions < 8.6.3 is affected.
- Is there a fix for CVE-2026-55703? Yes. CVE-2026-55703 is fixed in 8.6.3. Upgrade to this version or later.
- Is CVE-2026-55703 exploitable, and should I be worried? Whether CVE-2026-55703 is exploitable in your environment depends on whether the vulnerable code is present and reachable. A CVSS score is a worst-case rating; it does not account for your specific deployment, configuration, or usage patterns. Kodem, an Intelligent Application Security platform, uses runtime intelligence to show which vulnerabilities actually execute in production, so you can focus on the ones that represent real risk. Get a demo
- What actually determines whether CVE-2026-55703 is exploitable, and how bad it is? Exploitability and impact are not fixed properties of a CVE. They depend on runtime truth: whether the vulnerable code is present, reachable, and actually executes in your application. A high CVSS score on a dependency that never runs is not the same as real risk. Kodem, an Intelligent Application Security platform, uses runtime intelligence to reveal which vulnerabilities actually execute in production, so teams prioritize the ones that genuinely matter.
- How do I fix CVE-2026-55703? Upgrade
snipe/snipe-itto 8.6.3 or later.