Stored XSS in Snipe-IT Uploaded Files API
Snipe-IT contains a stored XSS vulnerability in the uploaded-files API due to the failure to apply safe-inline allowlists to XML documents, allowing authenticated attackers to execute arbitrary JavaScript in the victim's session context via CVE-2026-63498.
CVE search metadata
CVE search record: CVE-2026-63498. Severity: high. CVSS: 8.7. KEV: no. Product: Snipe-IT (< 8.7.0). Brief: Stored XSS in Snipe-IT Uploaded Files API. Brief link: https://feed.craftedsignal.io/briefs/2026-09-snipe-it-xss/
What's new
Snipe-IT is vulnerable to stored cross-site scripting (XSS) via its uploaded-files API (CVE-2026-63498). The vulnerability exists because the API endpoint GET /api/v1/{object_type}/{id}/files/{file_id} honors an attacker-controlled inline=true query parameter for all uploaded files without verifying the safety of the content. While the non-API web controller correctly utilizes StorageHelper::allowSafeInline() to sanitize inline responses, the API controller fails to perform this check.
An authenticated user with permission to upload files can upload a malicious XSLT stylesheet and an XML document that references it via the xml-stylesheet instruction. When a victim views the XML file through the API with the inline=true parameter, the browser parses the XSLT and executes the embedded JavaScript within the context of the Snipe-IT origin. This allows the attacker to perform unauthorized actions on behalf of the victim, access sensitive information, or escalate privileges if a superuser is targeted. The vulnerability was reproduced in versions prior to 8.7.0.
Attack Chain
- Attacker authenticates to the Snipe-IT instance with a user account permitted to upload files to at least one object.
- Attacker prepares a malicious XSLT file containing an embedded payload (e.g.,
<script>...</script>). - Attacker uses the API
POST /api/v1/{object_type}/{id}/filesto upload the XSLT stylesheet; the system stores the file astext/xml. - Attacker records the assigned ID of the stored XSLT file.
- Attacker creates an XML document containing an
<?xml-stylesheet ...?>processing instruction pointing to the URL of the previously uploaded XSLT file. - Attacker uploads the referencing XML document via the same API endpoint and records its ID.
- Attacker lures an authenticated victim to visit the URL
.../files/{DATA_FILE_ID}?inline=truewithin the Snipe-IT application. - Victim's browser loads the XML, interprets the stylesheet instruction, and executes the embedded JavaScript in the Snipe-IT session context.
Impact
Successful exploitation allows for complete compromise of the victim's session within the Snipe-IT application. Consequences include the ability to read same-origin data (asset, user, and license information), perform authenticated state-changing actions, and potentially achieve full administrative account compromise if a superuser interacts with the malicious file.
Recommendation
- Upgrade Snipe-IT to version 8.7.0 or later to ensure the API controller correctly implements
StorageHelper::allowSafeInline()for file downloads. - Review recent access logs for the
/api/v1/*/files/*endpoints to identify unusual file upload patterns, particularly involving XML content. - Limit file upload permissions to the minimum number of users required for business operations to reduce the attack surface.
Immediate actions
Upgrade Snipe-IT to version 8.7.0 or later.
Mitigations
Upgrade Snipe-IT to 8.7.0
CVE-2026-63498
Detection coverage 1
Detect Suspicious Personal Access Token Creation
highDetects potential exploitation of CVE-2026-63493 by monitoring for API requests to generate personal access tokens, which should be correlated with authentication logs showing incomplete 2FA.
Detection queries are available on the platform. Get full rules →