Back to skill

Security audit

Openclaw Unreal Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill is transparent about controlling Unreal Editor, but its legacy gateway bridge path lacks a clear authentication boundary and should be reviewed before installation.

Install only for trusted local Unreal projects, keep the gateway and Unreal bridge off untrusted networks, prefer an OpenClaw gateway version that uses authenticated route registration, and do not enable OPENCLAW_EDITOR_ALLOW_DESTRUCTIVE unless you are ready to approve each project-changing action. Review screenshots and logs before sharing them because they can contain secrets or local paths.

Vulnerability Patterns
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • 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 (1)

T07 · Tool Hijacking and Spoofing

Error
Location
extension/index.ts:280
Finding

Legacy HTTP Registration Fallback Lacks an Explicit Authentication Boundary

Content
View full analysis

Vulnerability Details

File Location: extension/index.ts:280-307, 318-426, 454-465
Vulnerability Type: Unauthenticated tool bridge and session spoofing
Risk Level: High

Vulnerable Code

ts
function sendJson(res: ServerResponse, status: number, data: any) {
  res.statusCode = status;
  res.setHeader("Content-Type", "application/json");
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
  res.end(JSON.stringify(data));
}
ts
if (req.method === "OPTIONS") {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
  res.statusCode = 204;
  res.end();
  return true;
}
ts
case "register": {
  if (req.method !== "POST") {
    sendJson(res, 405, { error: "Method not allowed" });
    return true;
  }

  const body = await readJsonBody(req);
  const { project, version, platform, tools } = body;

  const sessionId = generateId();
  const session: UnrealSession = {
    sessionId,
    registeredAt: Date.now(),
    lastHeartbeat: Date.now(),
    projectName: project || "Unknown",
    engineVersion: version || "Unknown",
    platform: platform || "UnrealEditor",
    toolCount: tools || 0,
    pendingCommands: [],
    results: new Map(),
  };

  sessions.set(sessionId, session);
  console.log(`[Unreal] Registered: ${project} (UE ${version}) - Session: ${sessionId}`);

  sendJson(res, 200, { sessionId, status: "connected" });
  return true;
}
ts
case "poll": {
  const sessionId = url.searchParams.get("sessionId");

  const session = sessions.get(sessionId || "");
  if (!session) {
    sendJson(res, 404, { error: "Session not found" });
    return true;
  }

  session.lastHeartbeat = Date.now();

  if (session.pendingCommands.length > 0) 
...[truncated 4075 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the unauthenticated legacy fallback or require a minimum OpenClaw version that supports authenticated route registration.
  2. If legacy compatibility is required, implement authentication inside handleUnrealHttpRequest so security does not depend on the registration API:
    • Require a cryptographically strong shared secret or verified gateway identity.
    • Use constant-time secret comparison.
    • Reject every unauthenticated request before endpoint dispatch.
  3. Bind each session to its authenticated principal and verify ownership on heartbeat, poll, and result.
  4. Do not disclose session IDs through a broadly accessible status endpoint. Return only non-sensitive aggregate status unless the requester is authorized.
  5. Replace wildcard CORS with an explicit trusted-origin allowlist, or disable CORS because the Editor bridge does not require arbitrary browser access.
  6. Use cryptographically secure session identifiers, such as crypto.randomUUID() or random bytes from node:crypto, instead of Date.now() combined with Math.random().
  7. Prevent session-registration races and default-session spoofing:
    • Require an authenticated Editor identity.
    • Select sessions explicitly rather than using the first map entry.
    • Consider requiring pairing or administrator approval for new Editors.
  8. Add integration tests covering both registration APIs and verifying that:
    • Unauthenticated registration is rejected.
    • Session IDs cannot be enumerated anonymously.
    • One authenticated session cannot poll or submit results for another.
    • Browser-originated requests from untrusted origins are rejected.
    • Spoofed sessions cannot become the implicit destination of Agent commands.
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (10)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
skill (`extension/index.ts`), so it covers every call routed through the OpenClaw

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

Clear the build cache and restart the editor:

bash
rm -rf YourProject/Plugins/OpenClaw/Binaries YourProject/Plugins/OpenClaw/Intermediate

Connection issues

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
. Keep the project under source control before automation sessions. The Korean `SKILL_KO.md` states the same recommendation; if the two ever disagree, this file

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · extension/dist/index.js (reported line 29)May include surrounding context.

js
var BATCH_TOOLS = /* @__PURE__ */ new Set(["batch.execute"]);
var MAX_BATCH_DEPTH = 4;
function currentEnv() {
  return globalThis?.process?.env ?? {};
}
function isTruthyFlag(value) {
  if (value === true) return true;

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · extension/index.ts (reported line 91)May include surrounding context.

ts
var BATCH_TOOLS = /* @__PURE__ */ new Set(["batch.execute"]);
var MAX_BATCH_DEPTH = 4;
function currentEnv() {
  return globalThis?.process?.env ?? {};
}
function isTruthyFlag(value) {
  if (value === true) return true;

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The README says the skill is 'automatically loaded' and instructs users to 'Use natural language to interact with Unreal Editor,' followed by everyday-style phrases like 'Show me the level hierarchy' and 'Take a screenshot.' Because the documentation does not define explicit trigger boundaries, exclusions, or invocation constraints, the activation scope is overly broad for a markdown skill description and may overlap with common requests.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

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

md
components and transforms, the open level, imported assets, PIE (Play In Editor),
and whatever a console command reaches (`console.execute`).

**What runs without asking:** read-only tools only — `level.getCurrent`,
`level.list`, `actor.find`, `actor.getAll`, `actor.getData`, `transform.get*`,
`component.get`, `editor.getState`, `asset.list`, `blueprint.list`,
`debug.hierarchy`, `debug.screenshot`, `console.getLogs`, `debug.log`. Their

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

The README first states 'MIT License' and then immediately states the project has been licensed under Apache-2.0 since its initial release. These statements are directly contradictory and create intent/documentation divergence about the governing license terms.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

This markdown file includes natural-language examples for creating, moving, and starting play mode in Unreal, which can affect project or editor state. Although safety controls are documented earlier, the usage examples themselves are not annotated to remind users that some actions require destructive-change opt-in and confirmation, which is the type of user warning SQP-2 expects in markdown descriptions.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

This manifest describes what the plugin connects to, but it does not specify when or under what conditions the skill/plugin should activate. For manifest files, missing trigger specificity can lead to ambiguous invocation behavior because there is no explicit scope, trigger list, or exclusion guidance.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.