CPATH-2026-0024 · Robotics / humanoid

Unauthenticated DDS remote code execution

At a glance

What this record establishes

Affected product
UnitreeUnitree Go2 unauthenticated DDS RCE via programming_actuator topic (CVE-2026-27509)Quadruped robot
  • Unitree Go2 firmware 1.1.7 through 1.1.11
Root cause
The robot's default DDS deployment lacks authentication and access control, while actuator_manager trusts a programming topic request that selects arbitrary Python execution as root.
Reachable consequence
  • Unauthenticated root execution reaches actuator commands, allowing unsafe robot motion that can endanger nearby people.
  • Root execution exposes live camera, LIDAR, navigation, and spatial-sensor data that describe the robot’s surroundings.
Remediation
Update standard units to firmware 1.1.13 or later. Isolate EDU and unpatched units, restrict the DDS network, and enable DDS authentication and topic-level access control.
Evidence status
  • Reproduced or documented in detailNVD documents the condition.
  • Documented in a public reportNVD reports the condition.
Baseline confidence: High

Vulnerability record

Bug mechanics, affected systems, and remediation

The editorial record appears before the modeled consequence so the Path Score remains traceable to the documented vulnerability.

1. Summary

The Unitree Go2’s onboard programming/actuator control plane exposes an Eclipse CycloneDDS topic, rt/api/programming_actuator/request, on DDS domain 0 with no authentication. Any device that can reach the robot’s internal DDS domain can publish a request whose api_id field selects a code-upload handler in actuator_manager.py, which writes attacker-supplied Python to disk and later runs it as root. The flaw is a missing-authentication-for-a-critical-function defect (CWE-306): the control plane routes messages solely by an untrusted api_id value with no caller identity or authorization check. Successful exploitation yields persistent root code execution on the robot after a physical controller hotkey is pressed.

2. Affected products & versions

product models affected versions fixed version
Unitree Go2 firmware Go2 (standard) V1.1.7, V1.1.8, V1.1.9 V1.1.13 and later
Unitree Go2 firmware Go2 EDU variant V1.1.11 EDU not documented (EDU unlikely to be patched)

Note: on the non-EDU V1.1.11 build the vulnerable DDS topics were reportedly suppressed; only the EDU build of V1.1.11 remained vulnerable [4].

3. The vulnerability in detail

The vulnerability lives in the Unitree Go2’s onboard programming/actuator control-plane service — principally actuator_manager.py, with a helper hotkey_manager.py — which is responsible for accepting user “programs” (Python scripts) and binding them to physical controller hotkeys so an operator can trigger custom robot behaviors [4]. This subsystem does not expose an ordinary authenticated API. Instead, it communicates over Eclipse CycloneDDS, the data-distribution middleware the robot uses for its internal message bus. Concretely, the service subscribes to the DDS topic rt/api/programming_actuator/request on DDS domain 0 [4].

The root cause is a missing-authentication-for-a-critical-function defect (CWE-306) compounded by unrestricted code injection. CycloneDDS in this deployment runs with its default configuration, which provides no built-in authentication or access control [4]. In DDS, any participant that can reach a given domain may join it and publish to its topics; there is no credential exchange by default. So any device with network reachability to domain 0 on the robot’s internal network — the robot sits at 192.168.123.161 on 192.168.123.0/24 — can become a publisher and send messages to the programming/actuator topic without any credentials [4]. On top of this transport-level exposure, actuator_manager.py dispatches an incoming request based solely on its api_id field. It never verifies that the sender is authorized to invoke the requested operation; the api_id alone chooses the handler [4]. This is the crux: an untrusted, unauthenticated value fully determines a privileged code path.

The specific privileged path is api_id=1002, which the service treats as a code-upload request [4]. The message body is JSON carrying chunk_index, total_chunk_num, the program’s Python source (pyCode), a program_uuid, and a bind_hotkey. Critically, actuator_manager.py validates only that these expected parameter fields exist — it performs no validation of the Python payload itself [4]. The handler then persists the supplied Python to disk under /unitree/etc/programming/, with the filename derived from program_uuid (stored via hotkey_manager.py), and records a controller-hotkey binding for the new program in /unitree/etc/programming/hotkey_list.txt [4]. At this point the attacker’s arbitrary code is resident on the device and armed to a hotkey.

The execution mechanism is the second half of the chain. The service monitors physical controller input via physical_remote_control_key_monitoring. When a bound hotkey combination is pressed — R1+Y, L1+Y, or L2+Y — the monitor resolves the binding and calls run_script, which launches the stored file with subprocess.Popen(['python3', script_path]) [4]. Because the actuator manager runs as root, the attacker’s Python executes with root privileges, e.g. a reverse shell yielding a full root shell and complete device control [4]. Persistence is inherent to the design: load_hotkey_list re-reads hotkey_list.txt on service start, so the malicious binding re-arms across reboots and the payload survives power cycles [4].

Preconditions and triggering: the attacker needs adjacent-network reachability to the robot’s DDS domain 0 (directly on 192.168.123.0/24, or via the external WiFi with appropriate routing / an explicit DDS peer configuration), plus CycloneDDS (0.10.2+) and unitree_sdk2_python tooling to construct the message. No authentication is required. The one non-network dependency is that a physical controller hotkey must be pressed to actually launch the stored script — this is why the CVSS vectors mark user interaction (UI:A / UI:R) [3][4]. Only the affected firmware versions expose the vulnerable topic.

The end-to-end exploitation chain is: (1) gain network adjacency and join DDS domain 0 (no credentials); (2) publish a crafted Request_ message to rt/api/programming_actuator/request with api_id=1002 and a JSON body containing chunk_index=1, total_chunk_num=1, the malicious Python, a program_uuid, and a bind_hotkey; (3) actuator_manager.py checks only field presence and writes the payload to /unitree/etc/programming/ plus the binding to hotkey_list.txt; (4) a physical hotkey (R1+Y/L1+Y/L2+Y) is pressed; (5) physical_remote_control_key_monitoringrun_scriptsubprocess.Popen(['python3', script_path]) executes the payload as root; (6) the binding reloads on every service start, providing reboot-surviving persistence [4].

In CWE terms, the assigned classification is CWE-306, Missing Authentication for Critical Function: a security-relevant operation (uploading and later executing code) is reachable with no proof of identity or authority. The researcher writeup additionally frames the full chain as touching CWE-287 (Improper Authentication), CWE-94 (code injection — the service generates/executes code from attacker-controlled input), and CWE-434 (unrestricted upload of a dangerous file type — arbitrary Python written to a directory it will later execute) [4].

Proof-of-concept status: a functional public PoC is published in the Boschko Security writeup — a Python script that builds the Request_ DDS message with a reverse-shell payload and sends it to the topic, requiring CycloneDDS 0.10.2+ and unitree_sdk2_python [4]. (Note: the separately named utility modify_db_v1.1.11_rce.py referenced in the writeup belongs to the sibling CVE-2026-27510, not this DDS vector [4].)

4. Discovery & timeline

The vulnerability was discovered by Olivier Laflamme (@olivier_boschko, Boschko Security) and Ruikai Peng (@ruikai, Pwn0 founder), via coordinated responsible disclosure with Unitree’s security team [4]. It was found on Oct 26 2025 against firmware V1.1.7 [4]. Coordinated disclosure began around Oct 29–30 2025; during this window V1.1.11 testing showed the DDS topics suppressed on the standard build but the EDU build still vulnerable [4]. Unitree’s security team validated and reproduced the issue across V1.1.7–V1.1.11 EDU between Nov 10 and Nov 18 2025 [4]. Public disclosure occurred Feb 27 2026, with NVD/CVE.org publication around Feb 26 2026 [4][2]. The fix shipped in standard firmware V1.1.13 per the researcher writeup and SentinelOne; EDU units are considered unlikely to be patched [4][7].

5. Technical reference

  • CVE: CVE-2026-27509 (sibling: CVE-2026-27510, same root-execution sink reached via Android-app SQLite pyCode tampering) [2][4][8].
  • CWE: CWE-306 (Missing Authentication for Critical Function) — assigned per NVD/VulnCheck. Researcher-characterized additional weaknesses: CWE-287, CWE-94, CWE-434 [3][4].
  • CVSS v4.0: 8.5 HIGH — CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N (VulnCheck) [3]. Key metrics: AV:A (adjacent — attacker must reach the robot’s DDS network, not the open Internet), PR:N (no privileges), UI:A (a physical hotkey press is required to trigger execution), and VC:H/VI:H/VA:H (high confidentiality/integrity/availability impact from root control).
  • CVSS v3.1: 8.0 HIGH — CVSS:3.1/AV:A/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H (VulnCheck) [2]. UI:R again reflects the required controller keypress; scope unchanged (S:U).
  • Code / component refs: actuator_manager.py, hotkey_manager.py; DDS topic rt/api/programming_actuator/request (domain 0); on-disk artifacts under /unitree/etc/programming/ including hotkey_list.txt. No public source commit/patch hash was located [4].

6. Consequence & CFSE path analysis

Real-world consequence: an attacker who can reach the robot’s internal DDS network can plant persistent code that runs as root on a walking, sensor-laden robot. That root foothold does two independently serious things. First, it reaches the actuator/motion control path, so the attacker can drive physical actuator and motion commands — a robot that moves near people can physically endanger them. Second, that same root access grants live access to the robot’s onboard camera, LIDAR, navigation, and spatial-sensor state, enabling surveillance and data exfiltration. Both consequences are enabled by the single defect and both survive reboots.

Why the CFSE Path Score differs from the CVSS baseline: CVSS scores the technical exploit (adjacent-network, unauthenticated, root code execution gated on a physical keypress) and lands at v4.0 8.5 HIGH / v3.1 8.0 HIGH. CFSE decomposes the same CVE into two co-dominant consequence paths and reasons about downstream, real-world impact that CVSS’s impact metrics do not fully capture — cyber-physical safety, perception privacy, fleet-wide reuse, and recovery burden.

CFSE consequence bands and verdict:

  • verdict: CRITICAL.
  • The entry decomposes CVE-2026-27509 into two co-dominant consequence paths, both banded CRITICAL.
  • DEVICE_CONTROL_SAFETY path (safety family): an unauthenticated DDS publish on domain 0 carrying api_id=1002 arbitrary Python runs as root via the actuator_manager path, reaching actuator/motion commands that can physically endanger nearby people (PH=CRITICAL, AT=HIGH, cross-domain bridge CH=4, persistence OR=4).
  • PERCEPTION_PRIVACY path (privacy family): the same root execution grants live access to onboard camera, LIDAR, navigation, and spatial-sensor state for surveillance/exfiltration (DP=CRITICAL), also banded CRITICAL.
  • Both paths treat exposure as reachability-bound (EX=2, RE=2, network/DDS-adjacent) with a reproducible unauthenticated exploit workflow (EC=3), and note a vendor patch is available (LS=PATCH_AVAILABLE).
  • Overall path_verdict: CRITICAL, direction UNDER relative to the published v4.0 8.5 HIGH / v3.1 8.0 HIGH baselines, reflecting the added cyber-physical safety and perception-privacy consequence, fleet-wide reuse, and manual-cleanup recovery burden.

7. Remediation & mitigations

  • Update standard firmware to V1.1.13 or later, which addresses this vector per the researcher writeup and SentinelOne [4][7]. Note the available sources do not definitively state whether V1.1.13 adds DDS authentication or removes/suppresses the programming_actuator topic (as the non-EDU V1.1.11 build reportedly did) [4].
  • For EDU units, which are unlikely to receive a vendor patch, isolate the device: they should not share a network segment with untrusted devices [4].
  • Where the DDS domain must remain reachable, enable DDS authentication/access control — CycloneDDS ships here with a default no-auth configuration — and network-segment/firewall the robot’s internal DDS domain (192.168.123.0/24) so untrusted devices cannot join domain 0 [4].
  • Understand the residual risk: patching this DDS vector does not close the sibling CVE-2026-27510, which reaches the same root-execution sink in actuator_manager via Android-app SQLite pyCode tampering. Remediation should account for both paths to the shared sink [4][8].
  • Detection specific to this bug: unexpected files appearing under /unitree/etc/programming/ and unexpected entries in /unitree/etc/programming/hotkey_list.txt, and unexpected python3 subprocesses spawned by the actuator manager, are direct indicators of this exploit having been staged [4].

8. Sources

Causal model

How the exploit reaches this consequence

2 modeled paths · each transition states what supports it.

Safety · Co-dominant path

Device-control safety

Unauthenticated root execution reaches actuator commands, allowing unsafe robot motion that can endanger nearby people.

CRITICAL
  1. accessSource-backed

    Proximity or local access

    carrying api_id is 1002 arbitrary Python executed as root via subprocess in the actuator_manager path.

    Evidence NVD

  2. boundaryModel inference

    Cross-domain authority chain

    Crosses network and device and physical and safety boundaries and remote code execution and persistence is a reusable bridge.

    Evidence Derived from the cited facts.

  3. capabilityModel inference

    Severe therapy or actuation consequence

    Unauthenticated root execution reaches actuator commands, allowing unsafe robot motion that can endanger nearby people.

    Evidence Derived from the cited facts.

  4. consequenceModel inference

    Device-control safety

    Unauthenticated root execution reaches actuator commands, allowing unsafe robot motion that can endanger nearby people.

    Evidence Derived from the cited facts.

  5. recoveryOperational assumption

    Fleet action or replacement

    Persistence via hotkey-bound scripts surviving reboot, must be manually cleared from and unitree and etc and programming and.

    Evidence Required deployment or recovery condition.

Decision trail

How the final band follows

  1. Base bandCRITICAL
  2. No adjustment

    The CRITICAL base band remains final because no separate cap or systemic uplift applies. Unauthenticated root execution reaches actuator commands, allowing unsafe robot motion that can endanger nearby people.

  3. Final bandCRITICAL
Inspect every metric judgment

Decision rationale

How this band was reached

Reach and effort
ReachabilityRE 2
Proximity or local access

carrying api_id is 1002 arbitrary Python executed as root via subprocess in the actuator_manager path.

Source-backedNVD
Execution complexityEC 3
Reproducible exploit workflow

Researcher published full repro, without authentication bypass needed.

Source-backedNVD
ExposureEX 2
Access position limits exposure

The technique is easier to perform than it is to position against a target, so access is the constraining factor.

Model inference
Consequence
Physical / safetyPH 4
Severe therapy or actuation consequence

Unauthenticated root execution reaches actuator commands, allowing unsafe robot motion that can endanger nearby people.

Model inference
Data / perceptionDP 3
Sensitive device or personal data

Root code execution exposes the robot's motion commands, actuator state, and connected sensor state as part of the control path.

Model inference
AuthorityAT 3
Administrative or command authority

Remote code execution reaches operating-system and robot-service authority, including motion control, but not the firmware-signing root.

Model inference
Scale and recovery
ChainabilityCH 4
Cross-domain authority chain

Crosses network and device and physical and safety boundaries and remote code execution and persistence is a reusable bridge.

Model inference
Reuse scaleSR 3
Portable product-class technique

Identical flaw reuses across all affected firmware (technique and artifact portability) but no shared secret and key.

Operational assumption
Execution scaleSX 3
Deployment-wide with setup

The exploit must be delivered to each reachable robot; it does not provide a separate fleet orchestration mechanism.

Operational assumption
Recovery burdenOR 4
Fleet action or replacement

Persistence via hotkey-bound scripts surviving reboot, must be manually cleared from and unitree and etc and programming and.

Operational assumption
Confidence and status
Evidence strengthEV 3
Reproduced or documented in detail

NVD documents the condition.

Source-backedNVD
LivenessLS Patch available
A patch is available

A vendor fix is available.

Source-backedNVD
Technical vector
Compact machine notationCPATH:1.0/TT:DEVICE_CONTROL_SAFETY/RE:2/EC:3/EX:2/PH:4/DP:3/AT:3/CH:4/SR:3/SX:3/OR:4/EV:3/LS:PATCH_AVAILABLERead the scoring method →

Privacy · Co-dominant path

Perception privacy

Root execution exposes live camera, LIDAR, navigation, and spatial-sensor data that describe the robot’s surroundings.

CRITICAL
  1. accessSource-backed

    Proximity or local access

    The attacker must reach the robot’s exposed DDS service on the local or deployment network.

    Evidence NVD

  2. boundaryModel inference

    Cross-domain authority chain

    Reusable bridge crossing device and cloud and physical boundaries.

    Evidence Derived from the cited facts.

  3. capabilityModel inference

    Safety-driving perception or intimate data

    Root execution exposes live camera, LIDAR, navigation, and spatial-sensor data that describe the robot’s surroundings.

    Evidence Derived from the cited facts.

  4. consequenceModel inference

    Perception privacy

    Root execution exposes live camera, LIDAR, navigation, and spatial-sensor data that describe the robot’s surroundings.

    Evidence Derived from the cited facts.

  5. recoveryOperational assumption

    Fleet action or replacement

    Persistence requires manual cleanup.

    Evidence Required deployment or recovery condition.

Decision trail

How the final band follows

  1. Base bandCRITICAL
  2. No adjustment

    The CRITICAL base band remains final because no separate cap or systemic uplift applies. Root execution exposes live camera, LIDAR, navigation, and spatial-sensor data that describe the robot’s surroundings.

  3. Final bandCRITICAL
Inspect every metric judgment

Decision rationale

How this band was reached

Reach and effort
ReachabilityRE 2
Proximity or local access

The attacker must reach the robot’s exposed DDS service on the local or deployment network.

Source-backedNVD
Execution complexityEC 3
Reproducible exploit workflow

The same unauthenticated DDS programming message yields root execution; accessing camera, LIDAR, and spatial state needs no additional vulnerability.

Source-backedNVD
ExposureEX 2
Access position limits exposure

The technique is easier to perform than it is to position against a target, so access is the constraining factor.

Model inference
Consequence
Physical / safetyPH 2
Operational safety effect

Live sensor access reveals people and surroundings but does not independently command physical motion.

Model inference
Data / perceptionDP 4
Safety-driving perception or intimate data

Root execution exposes live camera, LIDAR, navigation, and spatial-sensor data that describe the robot’s surroundings.

Model inference
AuthorityAT 3
Administrative or command authority

Operating-system root provides sensor access, though this privacy path does not claim a vendor signing key.

Model inference
Scale and recovery
ChainabilityCH 4
Cross-domain authority chain

Reusable bridge crossing device and cloud and physical boundaries.

Model inference
Reuse scaleSR 3
Portable product-class technique

Technique reuses fleet-wide.

Operational assumption
Execution scaleSX 3
Deployment-wide with setup

The root-and-sensor workflow can be repeated across reachable affected robots after the required network setup.

Operational assumption
Recovery burdenOR 4
Fleet action or replacement

Persistence requires manual cleanup.

Operational assumption
Confidence and status
Evidence strengthEV 2
Documented in a public report

NVD reports the condition.

Source-backedNVD
LivenessLS Patch available
A patch is available

A vendor fix is available.

Source-backedNVD
Technical vector
Compact machine notationCPATH:1.0/TT:PERCEPTION_PRIVACY/RE:2/EC:3/EX:2/PH:2/DP:4/AT:3/CH:4/SR:3/SX:3/OR:4/EV:2/LS:PATCH_AVAILABLERead the scoring method →

Triage implication

Prioritize the safety transition.

Set remediation urgency from the deployment-specific transition between digital control or perception and physical action.

Evidence ledger

Public sources used by this record.

Published baseline

Why this band differs from CVSS

RelationshipPaths model is higher
Baseline confidencehigh
Scored2026-06-03
v4.0 · 8.5 HIGHVulnCheck via NVD
CVSS:4.0/AV:A/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
v3.1 · 8 HIGHVulnCheck via NVD
CVSS:3.1/AV:A/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H

Related paths

Compare trust boundaries across products.

Cite this entryCFSE Consequence Paths Registry 1.0, CPATH-2026-0024 (“Unauthenticated DDS remote code execution”), paths.cfse.ai/CPATH-2026-0024 (published 2026-06-03).