Back to skill

Security audit

Radar Collision Warning

Security checks for vulnerabilities and agentic risk

Overview

This radar-monitoring skill mostly matches its stated purpose, but unsafe network and data-handling choices could make collision warnings unreliable.

Install only in a controlled ROS/Raspberry Pi environment. Use network isolation or authenticated transport for rosbridge, avoid treating a non-warning result as proof of safety, validate threshold and interval values, and review the startup script before running it because it can stop matching ROS-related processes.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (4)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/call_radar_service.js:22
Finding

Unauthenticated Plaintext Transport for Safety-Critical Radar Telemetry

Content
View full analysis
$ROS_WS/rosbridge.log 2>&1 & # ... echo " rosbridge: ws://$(hostname -I | awk '{print $1}'):8080" ``` ### Technical Analysis The client connects through `ws://` rather than authenticated TLS-protected `wss://`. The implementation contains no server certificate verification, message authentication, client authentication, or application-level response signature. Consequently, the client cannot establish that a received service response originated from the intended Raspberry Pi. An attacker capable of intercepting local network traffic, controlling routing or DNS-like configuration, compromising the configured host, or operating a spoofed endpoint can observe or alter radar telemetry. The startup script also launches rosbridge without any visible access-control or authentication configuration and advertises it using a network-interface address. Depending on the rosbridge deployment defaults and network firewall, the endpoint may make ROS operations available to other network participants, potentially beyond the single service used by this client. ### Attack Path 1. The operator starts rosbridge on TCP port 8080. 2. The radar client connects to the configured host using plaintext `ws://`. 3. An attacker obtains a suitable network position or causes the ...[truncated 1199 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/call_radar_service.js:90
Finding

Malformed or Missing Radar Data Is Converted into a Successful Safe Result

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/call_radar_service.js:31
Finding

Unvalidated Threshold and Polling Interval Permit Warning Suppression and Resource Exhaustion

Content
View full analysis
setTimeout(r, interval * 1000)); ``` ### Technical Analysis `parseFloat` accepts partial numeric strings and can return `NaN`, negative values, zero, infinity-like out-of-range values, or values that are operationally unsafe. The code does not check `Number.isFinite`, positivity, or acceptable minimum and maximum bounds. For threshold handling, invalid values can make all comparisons false or otherwise produce unreliable classifications. For example, a `NaN` threshold causes `distM < threshold` to evaluate to false, suppressing warnings. For monitor mode, zero, negative, `NaN`, or extremely small delay values can be interpreted by timer handling as an immediate or near-immediate timeout. The infinite monitoring loop can then repeatedly establish WebSocket connections and invoke the ROS service with almost no delay. Exploitation requires the ability to control the script invocation or its arguments. This may include an operator error, an untrusted automation layer, or an agent-generated command that incorporates unvalidated user input. ### Attack Path 1. An attacker or malformed automation request causes the Skill to be invoked with an unsafe argument, such as `--monitor --interval 0` or `--thre ...[truncated 879 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Note
Location
references/start_radar_rosbridge.sh:26
Finding

Broad Command-Line Process Matching Can Terminate Unrelated Processes

Content
View full analysis
$ROS_WS/rosbridge.log 2>&1 & echo "🔹 启动激光雷达节点..." pkill -f "$LIDAR_PKG_NAME" || true ros2 run $LIDAR_PKG_NAME $LIDAR_PKG_NAME \ > $ROS_WS/ldlidar.log 2>&1 & echo "🔹 启动雷达防撞预警节点..." pkill -f "$RADAR_NODE_NAME" || true ros2 run $RADAR_PKG_NAME $RADAR_NODE_NAME \ > $ROS_WS/radar_node.log 2>&1 & ``` The documented stop command uses the same broad matching: ```bash echo "🛑 停止: pkill -f rosbridge_websocket && pkill -f $LIDAR_PKG_NAME && pkill -f $RADAR_NODE_NAME" ``` ### Technical Analysis The `-f` option makes `pkill` search the full command line rather than an exact executable name or a known process identifier. Generic strings such as `ldlidar`, `rosbridge_websocket`, or the radar node name may occur in unrelated ROS commands, development tools, shell sessions, log viewers, or automation. Every matching process that the invoking account is permitted to signal can be terminated. The script neither records the PIDs of the processes it starts nor verifies process ownership and identity beyond the text match. This is primarily an availability issue. It is not a privilege-escalation mechanism because `pkill` remains constrained by the invoking user's existing signal permissions. ### Attack Path 1. An unrelated process runs under the same account and contains one of the matching strings in its command line. 2. An operator invokes the startup script or copies the documented stop command. 3. `pkill -f` scans complete command lines and matches the unrelated process. 4. The unrelated process receives a termination signal. 5. Its work or service becomes unavailable, po ...[truncated 916 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (8)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

A second documented mismatch indicates the skill may start and manage ROS2 infrastructure, kill existing processes with pkill, and launch rosbridge/LIDAR/radar services locally instead of merely issuing a WebSocket request. That expands the blast radius from passive querying to active process control on the Raspberry Pi, enabling service disruption or unsafe robotics state changes under the guise of a benign monitoring skill.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

A second documented mismatch indicates the skill may start and manage ROS2 infrastructure, kill existing processes with pkill, and launch rosbridge/LIDAR/radar services locally instead of merely issuing a WebSocket request. That expands the blast radius from passive querying to active process control on the Raspberry Pi, enabling service disruption or unsafe robotics state changes under the guise of a benign monitoring skill.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill documents executable behavior involving environment variables and shell/Node invocation but does not declare any tool scope such as permissions or allowed-tools. That weakens policy enforcement and reviewability, making it easier for the skill to run with broader-than-expected capabilities or be invoked in contexts where shell access was not intended.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrases include broad everyday language such as '开启雷达监控' or '检查障碍物', which can increase accidental activation. In this context, accidental invocation is more concerning because the skill may perform network access, background monitoring, or broader ROS/process operations, so an imprecise trigger can unintentionally start sensitive actions.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · SKILL.md (reported line 107)May include surrounding context.

1. 安装 rosbridge

bash
sudo apt install ros-jazzy-rosbridge-suite

2. ROS2 包配置

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This Python file contains its top-level description, usage notes, and service response description entirely in Chinese, and the runtime response messages are also hard-coded in Chinese. Under the policy rule, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly justified, which is not present here.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script's comments and all user-visible status messages are written in Chinese, which imposes a specific language on users without any opt-in or alternative locale handling. The policy explicitly calls for flagging language or locale constraints when they are forced rather than optional or clearly justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The code explicitly formats time using the 'zh-CN' locale, and the script’s user-facing messages and usage text are entirely in Chinese. This imposes a specific language/locale choice on users without offering any configuration or opt-in, which matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.