CVE-2026-86749
PoC largeSilent storage write failures in Snipe-IT cause permanent image data loss
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.
| Grokability (Snipe-IT project) Snipe-IT | <= 8.6.3 (fixed in 8.7.0) |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
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 news0 stories
No ingested article mentions this CVE yet.