Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-53452

CVE-2026-53452: Ground Station Path Traversal Vulnerability

CVE-2026-53452 is a path traversal flaw in Ground Station's unauthenticated configure-sdr command that allows attackers to disclose file contents outside designated directories. This post covers technical details, affected versions, impact, and mitigation.

Updated:

CVE-2026-53452 Overview

Ground Station is a browser-based suite for satellite tracking, software-defined radio (SDR) reception, hardware control, and telemetry decoding. CVE-2026-53452 is a path traversal vulnerability [CWE-22] in versions prior to 0.4.13. The unauthenticated configure-sdr Socket.IO command accepts a recordingPath parameter for the sigmf-playback SDR. The backend stores this value without validation, allowing absolute paths or parent-directory escapes to bypass the intended backend/data/recordings containment. Attackers can read arbitrary .sigmf-meta JSON files on the host without authentication.

Critical Impact

Remote unauthenticated attackers can disclose the contents of any readable JSON file ending in .sigmf-meta located outside backend/data/recordings, provided a sibling .sigmf-data file exists.

Affected Products

  • Ground Station (sgoudelis/ground-station) versions prior to 0.4.13
  • backend/handlers/entities/sdr.py command handler
  • backend/hardware/sigmfprobe.py metadata parser

Discovery Timeline

  • 2026-08-19 - CVE-2026-53452 published to NVD
  • 2026-08-19 - Last updated in NVD database

Technical Details for CVE-2026-53452

Vulnerability Analysis

Ground Station exposes a Socket.IO endpoint that accepts the configure-sdr command from any client without authentication. When a client selects the sigmf-playback SDR type, the handler in backend/handlers/entities/sdr.py reads the recordingPath field from the request and persists it into the SDR configuration. No canonicalization or containment check runs before backend/hardware/sigmfprobe.py opens the referenced file.

The get-sdr-parameters flow subsequently loads the path, parses the file as JSON, and returns the parsed object inside reply["data"]["metadata"]. This turns the metadata probe into a read primitive. An attacker supplies either an absolute path or a ../ sequence that resolves outside the recordings directory, so long as the file ends in .sigmf-meta and is valid JSON.

Exploitation has two preconditions: the target file must be readable by the Ground Station process and a sibling .sigmf-data file must exist next to it. Where an attacker can influence the filesystem or where legitimate SigMF pairs already exist elsewhere, sensitive JSON configuration or telemetry outside the sandboxed recordings directory becomes reachable.

Root Cause

The root cause is missing path containment. The application trusts a client-supplied path as if it were relative to backend/data/recordings but never resolves the path and confirms it stays inside that root. Absolute paths and .. traversal components are passed through to the file open call unchanged.

Attack Vector

The attack is network-reachable, requires no authentication, and no user interaction. The attacker connects to the Ground Station Socket.IO service, sends a configure-sdr message with sdrType=sigmf-playback and a crafted recordingPath, then issues get-sdr-parameters to retrieve the parsed JSON contents.

python
# Security patch in backend/common/pathguard.py
# Source: https://github.com/sgoudelis/ground-station/commit/5649905f1021155933463a54a76030924adffb9d
from __future__ import annotations

import os
from pathlib import Path
from typing import Iterable, List


def get_backend_root() -> Path:
    return Path(__file__).resolve().parent.parent


def get_recordings_root() -> Path:
    return (get_backend_root() / "data" / "recordings").resolve()


def get_snapshots_root() -> Path:
    return (get_backend_root() / "data" / "snapshots").resolve()


def _is_within(path: Path, root: Path) -> bool:
    try:
        path.relative_to(root)
        return True
    except ValueError:
        return False


def get_sigmf_allowed_roots(recordings_root: Path | None = None) -> List[Path]:
    roots: List[Path] = [(recordings_root or get_recordings_root()).resolve()]
    extra_roots = os.environ.get("GS_SIGMF_ALLOWED_DIRS", "")

The patch introduces a pathguard module that resolves candidate paths, restricts them to an allow-list of roots, and rejects anything outside backend/data/recordings (plus any directories explicitly opted in via the GS_SIGMF_ALLOWED_DIRS environment variable). The updated backend/handlers/entities/sdr.py calls resolve_sigmf_meta_path before opening any file.

Detection Methods for CVE-2026-53452

Indicators of Compromise

  • Socket.IO configure-sdr messages where recordingPath contains .., begins with /, or resolves outside backend/data/recordings.
  • get-sdr-parameters responses that return metadata blocks referencing filesystem locations unrelated to legitimate recordings.
  • Ground Station process accessing .sigmf-meta files in directories such as /etc, /home, or user profile paths.

Detection Strategies

  • Inspect application logs for configure-sdr events whose stored recordingPath fails to resolve under the recordings root.
  • Deploy a filesystem audit rule on the Ground Station host that alerts when the service process opens .sigmf-meta files outside backend/data/recordings.
  • Monitor network telemetry for unauthenticated Socket.IO clients issuing configure-sdr followed by get-sdr-parameters in rapid succession.

Monitoring Recommendations

  • Enable verbose logging in backend/handlers/entities/sdr.py to capture the raw recordingPath values submitted by clients.
  • Forward Ground Station logs and host process telemetry to a central analytics platform for correlation across sessions.
  • Alert on any 200-series get-sdr-parameters reply whose returned metadata path does not match a known recording asset.

How to Mitigate CVE-2026-53452

Immediate Actions Required

  • Upgrade Ground Station to version 0.4.13 or later, which introduces the pathguard containment module.
  • Restrict network exposure of the Socket.IO service to trusted operators until the upgrade is complete.
  • Audit backend/data/recordings and adjacent directories for unexpected .sigmf-meta and .sigmf-data pairs planted by an attacker to widen the read primitive.

Patch Information

The fix ships in GitHub Release v0.4.13 with commit 5649905. See the GitHub Security Advisory GHSA-g344-jqcx-cr7q for the full advisory. The patch adds backend/common/pathguard.py, resolves candidate paths, and rejects any target outside the allow-listed roots before opening the file.

Workarounds

  • Bind the Ground Station service to 127.0.0.1 and place it behind an authenticated reverse proxy until the upgrade is applied.
  • Run the Ground Station process under a least-privileged account whose filesystem read scope is limited to the recordings directory.
  • Apply operating-system mandatory access controls (AppArmor or SELinux) to confine the process to backend/data/recordings.
bash
# Example: confine Ground Station to its recordings directory via a dedicated user
sudo useradd --system --home /opt/ground-station --shell /usr/sbin/nologin gsuser
sudo chown -R gsuser:gsuser /opt/ground-station/backend/data/recordings
sudo chmod 750 /opt/ground-station/backend/data/recordings
# Restrict the Socket.IO listener to localhost until v0.4.13 is deployed
sudo iptables -A INPUT -p tcp --dport 5000 ! -s 127.0.0.1 -j DROP

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.