ZeroHour

CVE-2026-86749

PoC large

Silent storage write failures in Snipe-IT cause permanent image data loss

CVSS 4.0
7.0 high
EPSS
<1%p14
Published
()
Modified
AI analysis

Snipe-IT versions through 8.6.3 do not check the return values of storage operations in ImageUploadRequest::handleImages() and deleteExistingImage(), so a silently failed Storage::disk('public')->put() call still deletes the previous image and repoints the database record at a file that was never written, while a failed Storage::delete() nulls the image field and orphans the file on disk. The condition is not directly attacker-controlled: it fires whenever any authenticated user submits an image upload while the storage backend transiently fails, such as an S3 network error, a local filesystem permission problem, or quota exhaustion. There is no confidentiality impact and nothing gained by an attacker; the outcome is unrecoverable loss of the prior image plus a durable database-versus-disk inconsistency that requires manual reconciliation. All image-carrying models routed through the handler are affected, including assets, asset models, users, companies, manufacturers, locations, categories, suppliers, and departments, on any Snipe-IT deployment running 8.6.3 or earlier. No public proof-of-concept or in-the-wild exploitation is known, the issue is not in CISA's KEV, and a fix ships in Snipe-IT 8.7.0 (CVSS 4.0 severity 7.0, High).

What to do: Upgrade to Snipe-IT 8.7.0 or later. As an interim measure, back up the public storage disk and database before image changes and, where supported, configure the Laravel storage disk to throw on failed writes instead of silently returning false. Audit image-carrying records for image fields pointing to missing files or orphaned files on disk and reconcile them manually.

Affected
Grokability (Snipe-IT project) Snipe-IT<= 8.6.3 (fixed in 8.7.0)
Estimated exposure
largetens of thousands of self-hosted instances (estimate based on deployment patterns, not a measured count) — No install counts or public scan data were provided; the estimate reflects Snipe-IT's broad adoption as a leading open-source IT asset-management platform, typically deployed as self-hosted per-organization instances, with every release…

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

Snipe-IT versions put(...) call still caused the application to delete the previous image via deleteExistingImage() and to reassign and persist the model's image reference to the new filename, destroying the existing image and leaving the database row pointing at a file that was never written. A mirror problem existed in deleteExistingImage(), where a failed Storage::delete() still nulled the model's image field, orphaning the file on disk. The condition is not directly attacker-controlled: it is triggered when any legitimate authenticated user submits an image upload while the storage backend transiently fails (for example an S3 network error, a local filesystem permission problem, or quota exhaustion). The result is unrecoverable loss of the prior image and a durable inconsistency between the database and disk that requires manual reconciliation. All models whose controllers route through ImageUploadRequest::handleImages (assets, asset models, users, companies, manufacturers, locations, categories, suppliers, departments, and other image-carrying models) are affected.

Vendors
snipeitapp
Products
snipe-it
Weakness
CWE-252
Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:P/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

In the news

No ingested article mentions this CVE yet.