CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-63498

CVE-2026-63498: Stored Cross-Site Scripting via Inline XML Rendering in Snipe-IT API

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 24, 2026·6 min read·3 visits

Executive Summary (TL;DR)

Unsafe inline rendering of uploaded XML files in the Snipe-IT REST API allows authenticated users with upload privileges to execute arbitrary client-side JavaScript in the context of other users' sessions, potentially leading to administrative account takeover.

CVE-2026-63498 is a high-severity Stored Cross-Site Scripting (XSS) vulnerability in Snipe-IT prior to version 8.7.0. The flaw resides in the REST API's file retrieval endpoint, which allows files to be rendered inline without sanitizing or restricting malicious content types like XML and XSLT stylesheets, leading to browser-side script execution in the context of the application's origin.

Vulnerability Overview

Snipe-IT is an open-source IT asset and license management platform built on the Laravel framework. The application implements standard upload functionalities for administrative tracking of invoices, licenses, and hardware assets. These file uploads are exposed via both a standard web interface and a comprehensive REST API engine.

The REST API exposes file retrieval capability through the app/Http/Controllers/Api/UploadedFilesController.php controller. This component serves as an intermediary proxy, pulling private objects from system storage and serving them back to authenticated clients. The vulnerability exists because the API endpoint does not validate file types before setting inline rendering instructions.

This design flaw maps directly to CWE-79 (Improper Neutralization of Input During Web Page Generation). By requesting stored files with the inline query parameter, attackers bypass the strict file-type and extension sanitization controls present in the standard web front-end. The security boundary between raw user-supplied data and browser execution is thus broken.

Root Cause Analysis

The root cause lies in the application's logical implementation of the file-retrieval routine in the show() method of the API controller. Unlike the traditional web interface, which employs strict extension allowlists before deciding to send an inline response, the API controller unconditionally set the Content-Disposition header to inline if the parameter inline=true was specified.

When an application serves XML content with Content-Disposition: inline, the web browser parses the file as active content rather than downloading it. This parsing behavior includes processing document prologue instructions, such as XML stylesheet associations. If an attacker links an XML document to an XSLT template, the browser will retrieve and execute the transformation sheets automatically.

This processing framework allows the inclusion of scripting blocks within the XSLT stylesheet. Because the file is served from the same domain as the Snipe-IT application, the browser executes the compiled scripts directly inside the application's origin context. Consequently, the script gains complete programmatic access to the Document Object Model (DOM), local storage, and session cookies.

Code Analysis

Let us examine the vulnerable block in app/Http/Controllers/Api/UploadedFilesController.php before the patch. The controller immediately executed Storage::download and attached an unvalidated Content-Disposition header. There was no inspection of the physical file's extension or its MIME-type properties prior to triggering the inline response pipeline.

The logic in the vulnerable version of the controller was structured as follows:

if (request('inline') == 'true') {
    $headers = [
        'Content-Disposition' => 'inline',
    ];
    return Storage::download(self::$map_storage_path[$object_type].$log->filename, $log->filename, $headers);
}

The patched implementation introduces strict validation using a newly added helper utility, StorageHelper::allowSafeInline. This function verifies that the file extension is registered within an allowed subset in the system configuration file config/filesystems.php. It further ensures that the actual MIME type matches the file extension, protecting against extension-spoofing techniques:

if (request('inline') == 'true') {
    $path = self::$map_storage_path[$object_type];
    // Only allowlisted extensions may be served inline
    if (! StorageHelper::allowSafeInline($path.$log->filename)) {
        return StorageHelper::downloader($path.$log->filename);
    }
    return Storage::download($path.$log->filename, $log->filename, [
        'Content-Disposition' => 'inline',
        'X-Content-Type-Options' => 'nosniff',
    ]);
}

Additionally, the patch updates the default downloader() helper to force secure response headers on files that are not permitted inline. By appending Content-Type: application/octet-stream and X-Content-Type-Options: nosniff, the application prevents the browser from sniffing the payload and executing embedded scripts, ensuring complete protection even if the user manually attempts to trigger execution.

Exploitation Methodology

Exploitation requires an authenticated session with basic privileges to upload file attachments to inventory objects, such as assets or models. The attacker first crafts a malicious XML payload referencing an external or locally hosted XSLT file. The XSLT schema contains embedded JavaScript elements designed to execute administrative actions silently.

The attack proceeds in a multi-step sequence. The attacker uploads both files to the system, receiving unique identifiers for each object. The XML payload is explicitly structured to point its stylesheet reference path to the API retrieval URL of the uploaded XSLT payload, leveraging the inline flag to force processing.

A visual representation of the exploitation process details the exact network and browser interaction paths:

When an authorized manager accesses the inline XML attachment, the browser processes the stylesheet translation. The stylesheet payload then runs arbitrary scripts to read CSRF tokens, access Laravel API endpoints, and initiate unauthorized actions on behalf of the administrator.

Impact Assessment

This vulnerability poses a high risk to administrative confidentiality and integrity. Because Snipe-IT utilizes authorization tokens and session identifiers within the local browser storage, executing code in the victim's origin context completely bypasses standard access control mechanisms.

The attacker can gain full control over the asset management database by executing API queries through the compromised browser context. Actions include creating new high-privilege administrators, deleting hardware tracking databases, or exfiltrating sensitive credential sheets.

The impact is elevated because the vulnerability requires very low privileges to exploit, needing only standard attachment upload permissions. The CVSS score of 8.7 reflects this high potential for lateral escalation and the ease of network-based delivery.

Remediation & Prevention

The primary remediation strategy is upgrading the Snipe-IT deployment to version 8.7.0 or higher. This update restricts inline rendering to verified safe file extensions and enforces MIME-type checking, ensuring that active content like XML and HTML cannot execute via the API.

In environments where patching must be deferred, temporary network and server-level mitigations should be applied. Administrators can use a web application firewall to block requests matching the pattern /api/v1/*/files/*?inline=true if the underlying file is an XML or HTML document.

Additionally, configuring the reverse proxy to send protective headers acts as a robust defense-in-depth measure. Forcing Content-Security-Policy: sandbox for the uploads path restricts all script execution, ensuring that browsers render attachments securely without risk to the primary application session.

Fix Analysis (1)

Technical Appendix

CVSS Score
8.7/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:H/A:N

Affected Systems

Snipe-IT Asset Management System

Affected Versions Detail

Product
Affected Versions
Fixed Version
Snipe-IT
grokability
< 8.7.08.7.0
AttributeDetail
CWE IDCWE-79 (Improper Neutralization of Input During Web Page Generation)
Attack VectorNetwork (AV:N)
CVSS Score8.7 (High)
Exploit StatusProof of Concept (PoC) represented in official test suites
CISA KEV StatusNot Listed
ImpactComplete session compromise and privilege escalation via Stored XSS

MITRE ATT&CK Mapping

T1189Drive-by Compromise
Initial Access
T1185Browser Session Hijacking
Collection
CWE-79
Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting')

The software does not neutralize or incorrectly neutralizes user-controlled input before it is placed in output that is used as a web page that is served to other users.

References & Sources

  • [1]GHSA-396x-xmvh-p563: Stored XSS via Inline XML Rendering in the Uploaded Files API
  • [2]Official Security Patch Commit
  • [3]Snipe-IT Version 8.7.0 Release Notes
  • [4]CVE.org Record for CVE-2026-63498

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-57232
3.1

CVE-2026-57232: Server-Side Request Forgery in Contao CMS Feed Reader Module

A Server-Side Request Forgery (SSRF) vulnerability exists in the Contao Open Source Content Management System (CMS) within the Feed Reader front-end module. When processing RSS feed configurations, the module initiates outbound HTTP connections using a default HTTP client that lacks loopback and private network controls. Authenticated backend users with permissions to configure frontend modules can exploit this flaw to coerce the server into sending requests to internal endpoints, loopback addresses, and cloud instance metadata services.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 3 hours ago•CVE-2026-19730
4.2

CVE-2026-19730: Podman Quadlet Install Non-Truncating Write Retains Removed Host-Access/Security Directives

CVE-2026-19730 is a local security vulnerability in the Podman container engine's Quadlet systemd generator. When updating existing configurations using 'podman quadlet install --replace' on filesystems that do not support reflink operations (such as standard ext4), the file is opened without the O_TRUNC flag. If the new configuration file is shorter than the pre-existing file, the trailing lines of the old file remain intact and are successfully parsed by systemd, leading to a failure to remove security-critical parameters like AddCapability, User, or host storage mounts.

Alon Barad
Alon Barad
4 views•7 min read
•about 4 hours ago•CVE-2026-63493
8.6

CVE-2026-63493: Multi-Factor Authentication Bypass via Stateless API Token Flow in Snipe-IT

Snipe-IT prior to version 8.7.0 is vulnerable to an authentication bypass (CVE-2026-63493 / GHSA-hxcx-9h4f-42xx) within its Laravel Passport API integration. When multi-factor authentication (MFA/2FA) is enabled, an attacker possessing a victim's password can bypass MFA controls completely. This occurs because the Laravel middleware that enforces MFA was registered only in the stateful 'web' middleware group, leaving the stateless 'api' middleware group unguarded. Consequently, an attacker can use a valid password to initiate a session, bypass the MFA prompt on the web UI by communicating directly with the API, and generate a long-lived Personal Access Token (PAT) to perform unauthorized operations.

Alon Barad
Alon Barad
5 views•6 min read
•about 20 hours ago•CVE-2026-57576
6.5

CVE-2026-57576: Application-Level Denial of Service via Uncontrolled Resource Consumption in Plone

CVE-2026-57576 is an application-level Denial of Service (DoS) vulnerability in Plone. It resides in the `plone.app.dexterity` and `plone.app.contenttypes` packages, allowing authenticated users with content creation permissions to submit excessively long metadata attributes. Because these fields are stored without length limits and subsequently processed by indexing and rendering engines, they trigger complete server resource exhaustion and thread starvation.

Alon Barad
Alon Barad
8 views•9 min read
•about 21 hours ago•GHSA-8PCW-H6W9-H46G
6.5

GHSA-8PCW-H6W9-H46G: Denial of Service via Uncontrolled Resource Consumption in plone.app.contenttypes

An uncontrolled resource consumption vulnerability in plone.app.contenttypes allows authenticated users to trigger application-level denial of service via oversized filename metadata in file uploads.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 22 hours ago•CVE-2026-61685
7.5

CVE-2026-61685: SQL Injection via Dynamic Query Parameters in ReactPress

An unauthenticated remote SQL injection vulnerability exists in multiple API list endpoints of ReactPress prior to version 3.7.0. The vulnerability stems from unsafe construction of TypeORM QueryBuilder conditions, where untrusted HTTP query parameter keys are interpolated directly into SQL statements as identifiers without sanitization or validation.

Alon Barad
Alon Barad
9 views•9 min read