Back to skill

Security audit

OpenClaw Unreal Engine

Security checks for vulnerabilities and agentic risk

Overview

The skill fits its Unreal integration purpose, but it needs review because the bundled plugin can send bearer tokens and task data to arbitrary or plaintext endpoints and its installer can overwrite an existing plugin directory.

Install only in a test or version-controlled Unreal project first. Use HTTPS or WSS with trusted OpenClaw hosts, avoid production tokens in Blueprint-readable settings or config files, rotate any exposed token, and review the installer before running it because it can delete an existing OpenClawUnrealPlugin directory.

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
assets/OpenClawUnrealPlugin/Source/OpenClawUnreal/Private/OpenClawSubsystem.cpp:9
Finding

Bearer Token Disclosure Through an Unrestricted HTTP Endpoint

Content
View full analysis
Request = FHttpModule::Get().CreateRequest(); Request->SetURL(Url); Request->SetVerb(TEXT("POST")); Request->SetHeader(TEXT("Content-Type"), TEXT("application/json")); if (!ApiKey.IsEmpty()) { Request->SetHeader(TEXT("Authorization"), FString::Printf(TEXT("Bearer %s"), *ApiKey)); } ``` ### Technical Analysis The Blueprint-callable configuration accepts an arbitrary base URL and retains an API key without validating the URL scheme, hostname, port, or destination trust boundary. The request subsequently attaches that key as a bearer credential. The implementation does not require HTTPS, reject embedded URL credentials, or enforce an administrator-controlled host allowlist. The use of plaintext HTTP is also demonstrated in `references/sample-blueprint-flow.md:60`: ```text URL: http:///api/unreal/task ``` Consequently, a caller that can influence Blueprint configuration can direct authenticated requests to an attacker-controlled server. If HTTP is used, an on-path attacker can also observe or alter the authorization header, task body, and response. ### Attack Path 1. An attacker gains influence over the values supplied to the Blueprint-callable `Configure()` function, such as through an untrusted configuration value or modifiable Blueprint. 2. The attacker supplies an endpoint such as `http://attacker-controlled.example`. 3. A val ...[truncated 791 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
assets/OpenClawUnrealPlugin/Source/OpenClawUnreal/Private/OpenClawWebSocketClient.cpp:15
Finding

Bearer Token Disclosure Through an Unrestricted WebSocket Endpoint

Content
View full analysis
Protocols; TMap Headers; if (!InAuthToken.IsEmpty()) { Headers.Add(TEXT("Authorization"), FString::Printf(TEXT("Bearer %s"), *InAuthToken)); } Socket = FWebSocketsModule::Get().CreateWebSocket(InUrl, Protocols, Headers); ``` ### Technical Analysis The client considers every nonempty URL acceptable and attaches the supplied bearer token to the WebSocket opening handshake. It does not require `wss://`, validate the hostname or port, or restrict the endpoint to a trusted destination. Using `ws://` exposes the opening handshake and subsequent WebSocket messages to interception and modification. Even with `wss://`, an attacker who can control the URL can cause the credential to be deliberately sent to an attacker-operated TLS endpoint. ### Attack Path 1. An attacker influences the URL passed to `FOpenClawWebSocketClient::Connect()`. 2. The attacker supplies `ws://attacker-controlled.example/socket` or a valid `wss://` endpoint under the attacker's control. 3. The caller supplies a valid authentication token. 4. The plugin places the token in the `Authorization` header and initiates the connection. 5. The attacker receives the token during the WebSocket handshake. 6. The attacker may reuse the credential against the legitimate service, subject to its assigned permissions. For a plaintext ...[truncated 451 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
assets/OpenClawUnrealPlugin/Source/OpenClawUnreal/Private/OpenClawSubsystem.cpp:90
Finding

JSON Structural Injection in Task and Remote-Control Envelopes

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/install_plugin.sh:19
Finding

Installer Unconditionally Deletes an Existing Plugin Directory

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (6)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
85% confidence
Finding

This code creates and sends a POST request containing TaskJson to a remote BaseUrl and may attach an Authorization bearer token. Although errors are broadcast, there is no confirmation prompt, user-facing notice before transmission, or explanatory comment/docstring warning that user or system data may be sent over the network.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

This code adds a bearer token to the Authorization header and opens a WebSocket connection, which transmits sensitive credential material over the network. There is no visible confirmation prompt, user-facing log, or explanatory comment/docstring in this file warning that an auth token will be sent to a remote endpoint.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The settings object exposes an API key as a normal editable Blueprint-readable FString without any user-facing warning, secret-specific handling, or indication of storage risk. In a UE plugin context, this increases the chance developers place long-lived credentials into project settings, config files, logs, Blueprints, or source control, leading to credential disclosure and downstream service compromise.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The sample flow explicitly instructs users to add an Authorization header and later uses a plain HTTP URL (http://<openclaw-host>/api/unreal/task). That combination can lead to bearer token exposure in transit if copied as-is, especially because the document does not warn that authentication data should only be sent over TLS or trusted local channels.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script unconditionally deletes the destination plugin directory with rm -rf before copying the new plugin, without warning, backup, or confirmation. If the target path already contains local modifications, generated files, or an unexpected symlinked/plugin directory, the user can lose data immediately; in a developer tooling context this is a real safety issue even if not an exploit primitive by itself.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

This markdown instructs the agent to use an install script to copy a plugin into a target Unreal project and to use a drop-in plugin scaffold, which can alter project contents. While the document discusses keeping destructive actions scoped, it does not explicitly warn users here that running these steps will modify files in the target project.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.