This is graffiti on the inside wall of the control shed, not a hole in the fence
CVE-2025-0220 is an XSS issue in the Trimble SPS851 web interface, specifically the Ethernet Configuration menu's Hostname field, affecting SPS851 version 488.01. The public write-up shows script injection through that field while already authenticated to the device's WebUI, which is reached over Ethernet and used for receiver configuration.
The vendor's LOW rating is directionally right, and if anything the real-world risk is *lower than the scary word 'remote' suggests*. The decisive friction is the chain: attacker must first reach the management interface, then hold high privileges in that interface, then trigger browser-side execution. That is classic post-initial-access, narrow-population, low-blast-radius behavior.
4 steps from start to impact.
Reach the receiver WebUI
- Network path to the receiver management IP
- WebUI enabled and reachable
- Receiver deployed with Ethernet/WebUI access
- These receivers are commonly on jobsite, field, or OT-adjacent networks rather than broad Internet exposure
- No reliable public fingerprint or exposure census for SPS851 was found in common Internet search sources
- Physical/jobsite topology often limits who can even route to the device
Obtain privileged WebUI access
- Valid privileged credentials or session for the WebUI
- Access to the Ethernet Configuration menu
- High privileges are required per the supplied CVSS vector (
PR:H) - MFA is unlikely on this class of device, but the attacker still needs credential theft, default creds left in place, or prior compromise
- Requiring admin access means the attacker is already well inside the trust boundary
Inject script into Hostname
Hostname field and then submitted with the configuration change action. That makes this a browser-executed web UI flaw, not code execution on the receiver OS.- Ability to submit configuration changes in the WebUI
- Unsanitized reflection or storage of the
Hostnamevalue
- Impact is limited to browser context, not device takeover
- The disclosed payload is a simple alert-style proof, not a demonstrated lateral-movement chain
- If the page is effectively single-admin and self-triggered, operational impact is even smaller
Hostname field. Off-the-shelf network scanners will rarely model this exact workflow.Abuse browser context of the logged-in admin
- A privileged user loads the affected page state or triggers the vulnerable workflow
- Browser allows the injected script to execute in the receiver UI origin
- No evidence of in-the-wild chaining, KEV listing, or mass exploitation
- Blast radius is the single device/admin session, not the enterprise fleet
- EDR, browser hardening, and session expiry reduce follow-on value even if script runs
The supporting signals.
| In-the-wild status | No evidence found that CVE-2025-0220 is in CISA KEV, and no public campaign reporting was found in the sources reviewed. This is not behaving like an operationally active bug. |
|---|---|
| Proof-of-concept availability | A public GitHub write-up by renanmalafatti shows a browser payload injected into Hostname and triggered after clicking Change Configuration: GitHub PoC. |
| EPSS | EPSS from the user-supplied intel block is 0.00109, which is very low and consistent with low attacker interest. |
| KEV status | Not listed in the CISA Known Exploited Vulnerabilities Catalog. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:H/UI:R/S:U/C:N/I:L/A:N — the story here is *high privileges plus user interaction*. That is a major real-world downgrade versus unauthenticated remote bugs. |
| Affected versions | Published records name Trimble SPS851 version 488.01 in the Ethernet Configuration menu: NVD, OpenCVE. |
| Fixed versions | No vendor fixed version or advisory was located in the sources reviewed. Treat patched_version as unknown / not publicly documented. |
| Exposure reality | Trimble documentation shows the WebUI is reached from a directly connected PC or local network over Ethernet, with default/admin login patterns documented in manuals and support docs: User Guide PDF, SITECH WebUI access note. That points to local management-plane exposure, not broad public Internet reach. |
| Disclosure date | Published on 2025-01-05 per NVD and OpenCVE. |
| Researcher / source | The public exploit note credits a VulDB user (Havook in secondary aggregators) and references the GitHub disclosure. The CVE assigning CNA is VulDB. |
noisgate verdict.
The single biggest severity suppressor is attacker position: this requires privileged access to a niche management UI before any script runs. That makes it a post-compromise admin-surface flaw with low blast radius, not a fleet-risking initial-access vulnerability.
Why this verdict
- Starts post-auth:
PR:Hmeans the attacker already has high-value WebUI access. That is prior compromise or insider position, so I push the score down hard from any generic 'remote XSS' baseline. - Population is narrow: SPS851 is a specialized GNSS receiver with a management WebUI usually reached over Ethernet from a nearby admin workstation, not a mass-exposed enterprise app.
- Blast radius is small: the demonstrated outcome is browser-side script execution in the admin session with only low integrity impact claimed, not device RCE or domain-wide compromise.
Why not higher?
There is no KEV listing, no public campaign data, no evidence of mass scanning, and no demonstrated device-side code execution. More importantly, the attacker must already be in a privileged management position, which collapses enterprise-wide urgency.
Why not lower?
I am not calling it IGNORE because it is still a real input-handling flaw in an administrative surface, and field devices are notorious for weak credential hygiene and flat local networks. If an attacker already has jobsite or OT-adjacent access, this can still be used for session abuse or configuration tampering.
What to do — in priority order.
- Restrict WebUI reachability — Put the receiver management interface on a tightly limited admin subnet or direct-connect workflow so only designated engineering workstations can reach it. For a LOW verdict there is no SLA; treat this as backlog hygiene, but it is still the best control because it removes the biggest amplifier: reachable admin surface.
- Rotate WebUI credentials — Audit for default or shared
admincredentials and replace them with unique per-device secrets. Do this during normal backlog hygiene, because the exploit path depends on already having privileged access. - Use jump-hosted admin browsing — Force configuration sessions through a hardened admin workstation or jump box rather than arbitrary field laptops. That reduces the chance that a compromised browser session can be reused or chained.
- Inventory SPS851 firmware — Build an asset list of SPS851 units and record which ones report firmware
488.01. There is no mitigation SLA for LOW, so this fits routine asset-hygiene work and gives you the data you need if Trimble later ships a fix.
- A perimeter WAF does not meaningfully help if the WebUI is on a local Ethernet management segment and the attacker is already authenticated.
- EDR on user laptops does not fix the device-side input handling bug; it only helps catch follow-on abuse from a hijacked browser session.
- Generic unauthenticated network scanning will miss the real risk because the vulnerable workflow sits behind privileged configuration pages.
Crowdsourced verification payload.
Run this on an auditor workstation or from CI against your inventory data; it does not need admin rights. Invoke it with explicit product/version from CMDB or a scraped status export, for example: python3 verify_cve_2025_0220.py --product SPS851 --version 488.01 or python3 verify_cve_2025_0220.py --html receiver_status.html.
#!/usr/bin/env python3
# verify_cve_2025_0220.py
# Determine likely exposure to CVE-2025-0220 for Trimble SPS851.
# Outputs one of: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
import argparse
import re
import sys
from pathlib import Path
AFFECTED_PRODUCT = 'SPS851'
AFFECTED_VERSION = '488.01'
def norm(s):
return (s or '').strip().upper()
def extract_from_html(text):
product = None
version = None
# Try common patterns from exported status pages, screenshots, or copied HTML/text.
product_patterns = [
r'\bSPS851\b',
r'Model\s*name[^A-Za-z0-9]{0,10}(SPS851)',
r'Receiver[^A-Za-z0-9]{0,10}(SPS851)'
]
version_patterns = [
r'Firmware\s*version[^0-9]{0,10}([0-9]+(?:\.[0-9]+)+)',
r'Version[^0-9]{0,10}([0-9]+(?:\.[0-9]+)+)',
r'\b(488\.01)\b'
]
for pat in product_patterns:
m = re.search(pat, text, flags=re.IGNORECASE)
if m:
product = m.group(1) if m.groups() else 'SPS851'
break
for pat in version_patterns:
m = re.search(pat, text, flags=re.IGNORECASE)
if m:
version = m.group(1)
break
return product, version
def main():
parser = argparse.ArgumentParser(description='Check likely exposure to CVE-2025-0220')
parser.add_argument('--product', help='Product/model name, e.g. SPS851')
parser.add_argument('--version', help='Firmware/software version, e.g. 488.01')
parser.add_argument('--html', help='Path to exported/copied HTML or text from receiver status page')
args = parser.parse_args()
product = args.product
version = args.version
if args.html:
p = Path(args.html)
if not p.exists():
print('UNKNOWN')
sys.exit(2)
text = p.read_text(errors='ignore')
hp, hv = extract_from_html(text)
product = product or hp
version = version or hv
if not product and not version:
print('UNKNOWN')
sys.exit(2)
nproduct = norm(product)
nversion = (version or '').strip()
if nproduct and nproduct != AFFECTED_PRODUCT:
print('PATCHED')
sys.exit(0)
if nproduct == AFFECTED_PRODUCT and nversion == AFFECTED_VERSION:
print('VULNERABLE')
sys.exit(1)
if nproduct == AFFECTED_PRODUCT and nversion and nversion != AFFECTED_VERSION:
print('PATCHED')
sys.exit(0)
print('UNKNOWN')
sys.exit(2)
if __name__ == '__main__':
main()
If you remember one thing.
488.01, restrict their WebUI to admin-only network paths, and clean up any weak/default credentials as backlog hygiene. Because this lands LOW, there is no noisgate mitigation SLA and noisgate remediation SLA beyond treating it as backlog hygiene; if Trimble publishes a fix later, roll it in during normal maintenance rather than burning emergency change windows.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.