CVE-2026-55703: Snipe-IT Maintenance Record Disclosure Vulnerability

MODERATE
Advisory Identifier: GHSA-r9r3-g9fp-3q4q
CVSS 4.3
CWE-862
Published
Advisory Summary

CVE-2026-55703 is a MODERATE (CVSS 4.3) maintenance record disclosure vulnerability (CWE-862: Missing Authorization) affecting Snipe-IT libraries in the Packagist ecosystem. The issue involves maintenance record disclosure via missing authorization on get. Remediation is available by upgrading affected packages to version 8.6.3.

CVE-2026-55703 at a Glance

CVE Identifier CVE-2026-55703
GHSA Identifier GHSA-r9r3-g9fp-3q4q
Severity MODERATE
CVSS v3.1 Base Score 4.3
CWE Classification CWE-862: Missing Authorization
Affected Product Snipe-IT
Package Ecosystem Packagist
Published Date
Last Updated

Security Impact

CVSS: 4.3

The security impact metrics below are parsed directly from the CVSS v3.1 vector string (CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N).

Attack Vector Network (AV:N)
Attack Complexity Low (AC:L)
Privileges Required Low (PR:L)
User Interaction None (UI:N)
Scope Unchanged (S:U)
Confidentiality Low (C:L)
Integrity None (I:N)
Availability None (A:N)

How to Fix CVE-2026-55703

To remediate this vulnerability, upgrade all affected Snipe-IT dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

snipe/snipe-it fixed: 8.6.3
Upgrade snipe/snipe-it to 8.6.3
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

inspect dependencies for snipe/snipe-it

How to Check if You Are Affected

To determine whether your application is affected by CVE-2026-55703, inspect your project dependencies for Snipe-IT:

inspect dependencies for snipe/snipe-it

Analyze the terminal output to locate any version of Snipe-IT in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 8.6.3), your application is affected.

Note: Verify declared build manifests and deployed runtime container environments.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-862: Missing Authorization, where the product does not perform an authorization check when an actor attempts to access a resource or perform an action. In Snipe-IT, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### 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. ## Summary `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 ```php 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: ```php 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 1. As an administrator, create an asset in a company (here, `CompanyA`). Open the asset, choose Maintenances > Create, and add a record: name `MntA2`, supplier `SupA`, a purchase cost, and notes. The saved record opens at `/maintenances/{id}`. 2. As the administrator, create a test user assigned to CompanyA, with **every permission left unchecked**. Activate the account. 3. 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 `/hardware` returns 403. 4. 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 `test` account holds zero permissions and still reads the record. - Only the unguarded `show` route 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. ### Patches Patched in https://github.com/grokability/snipe-it/commit/69c50aa2aee25f837626556b4f4f3d05ec7ace96

CVE-2026-55703 Affected Snipe-IT Versions

1 component(s)
Fixed Versions:
8.6.3
Product / Package Ecosystem Affected Versions Fixed Version
snipe/snipe-it
Packagist
< 8.6.3
8.6.3

References

Frequently Asked Questions

What is CVE-2026-55703?
CVE-2026-55703 is a security vulnerability in Snipe-IT involving Maintenance Record Disclosure via Missing Authorization on GET under CWE-862: Missing Authorization.
Which Snipe-IT versions are affected?
Affected versions include releases prior to 8.6.3 across affected packages: snipe/snipe-it.
What version fixes CVE-2026-55703?
Upgrading to 8.6.3 (or the latest patched release for your respective branch) resolves the vulnerability.
Is snipe/snipe-it affected?
Yes, snipe/snipe-it is affected in releases prior to 8.6.3. Upgrade your dependency to 8.6.3 or later.
What is the CVSS score of CVE-2026-55703?
CVE-2026-55703 has a CVSS v3.1 base score of 4.3 (MODERATE) with vector string CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N.
What CWE is associated with CVE-2026-55703?
CVE-2026-55703 is classified under CWE-862: Missing Authorization (The product does not perform an authorization check when an actor attempts to access a resource or perform an action.).
How can I check Packagist dependencies for CVE-2026-55703?
Run the dependency tree command: 'inspect dependencies for snipe/snipe-it'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-r9r3-g9fp-3q4q",
  "modified" : "2026-08-19T19:32:25Z",
  "published" : "2026-08-19T19:32:25Z",
  "aliases" : [ "CVE-2026-55703" ],
  "summary" : "Snipe-IT: Maintenance Record Disclosure via Missing Authorization on GET",
  "details" : "### Impact\nAny 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.\n\n## Summary\n\n`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.\n\n## Details\n\n```php\npublic function show(Maintenance $maintenance): View|RedirectResponse\n{\n    return view('maintenances.view')->with('maintenance', $maintenance);\n}\n```\n\nNo `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:\n\n```php\nRoute::resource('maintenances', MaintenancesController::class, ['middleware' => ['auth']]);\n```\n\n(`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.\n\n## Proof of concept\n\n1. As an administrator, create an asset in a company (here, `CompanyA`). Open the asset, choose Maintenances > Create, and add a record: name `MntA2`, supplier `SupA`, a purchase cost, and notes. The saved record opens at `/maintenances/{id}`.\n2. As the administrator, create a test user assigned to CompanyA, with **every permission left unchecked**. Activate the account.\n3. 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 `/hardware` returns 403.\n4. In the address bar, browse to `http://<host>/maintenances/{id}`.\n\nObserved: the maintenance view renders in full for the unprivileged account.\n\n```\nGET /maintenances/5      ->  HTTP 200 OK\nRenders the \"Maintenance\" detail page for MntA2:\n  Asset: AssetA   Supplier: SupA   Cost: <value>   Notes: <text>   Dates: <...>\n\nGET /hardware            ->  HTTP 403  (same account, asset list is gated)\nGET /maintenances        ->  HTTP 403  (same account, maintenance list is gated)\nGET /maintenances/2      ->  HTTP 302  (record in CompanyB; company scope still hides it)\n```\n\n- The `test` account holds zero permissions and still reads the record.\n- Only the unguarded `show` route leaks: the list view and the asset pages return 403 for the same account.\n- A maintenance in a different company (CompanyB) redirects away, confirming the FMCS company scope still holds.\n\n### Patches\nPatched in https://github.com/grokability/snipe-it/commit/69c50aa2aee25f837626556b4f4f3d05ec7ace96",
  "severity" : [ {
    "type" : "CVSS_V3",
    "score" : "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Packagist",
      "name" : "snipe/snipe-it"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "0"
      }, {
        "fixed" : "8.6.3"
      } ]
    } ]
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/grokability/snipe-it/security/advisories/GHSA-r9r3-g9fp-3q4q"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/grokability/snipe-it/commit/69c50aa2aee25f837626556b4f4f3d05ec7ace96"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/grokability/snipe-it"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/grokability/snipe-it/releases/tag/v8.6.3"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-862" ],
    "severity" : "MODERATE",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-08-19T19:32:25Z",
    "nvd_published_at" : null
  }
}