Back to skill

Security audit

@openclaw/orchestration

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed local task-orchestration tool with some shared-use security caveats, but I found no hidden exfiltration, deception, or unrelated privileged behavior.

Install this only in environments where users and agents with access to the SQLite database are trusted to mutate the queue. Be careful with restore because it overwrites database state, update/pin dependencies before production use, and verify the sibling @openclaw/interchange implementation before relying on refresh output. Downstream agents should treat generated task markdown as untrusted task data.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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 (2)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/queue.js:65
Finding

Missing Agent Authentication and Task-Level Authorization

Content
View full analysis
') .description('Claim a task') .requiredOption('--agent ', 'Agent name') .action((taskId, opts) => { const db = initDb(); try { const t = claimTask(db, taskId, opts.agent); if (t) console.log(`Task ${taskId} claimed by ${opts.agent}`); else console.error(`Failed to claim task ${taskId} (already taken or not pending)`); } catch (e) { console.error(e.message); } closeDb(); }); task.command('complete ') .description('Complete a task') .option('--result-path ', 'Path to result file') .option('--summary ', 'Summary of result') .action((taskId, opts) => { const db = initDb(); try { completeTask(db, taskId, { resultPath: opts.resultPath, summary: opts.summary }); console.log(`Task ${taskId} completed.`); } catch (e) { console.error(e.message); } closeDb(); }); task.command('fail ') .description('Fail a task') .option('--reason ', 'Reason for failure') .action((taskId, opts) => { const db = initDb(); try { failTask(db, taskId, opts.reason); console.log(`Task ${taskId} marked as failed.`); } catch (e) { console.error(e.message); } closeDb(); }); ``` ```js export function claimTask(db, taskId, agentName) { // Wrap everything in a transaction — no stale reads outside const doClaim = db.transaction(() => { const task = getTask(db, taskId); if (!task) throw new Error(`Task ${taskId} not found`); if (task.status !== 'pending') return null; // Check dependencies inside the transaction if (task.depends_on.length > 0) { const placeholders = task.depends_on.map(() => '?').join(','); co ...[truncated 4217 chars]
Remediation
View remediation

T01 · Skill Instruction Hijacking

Warning
Location
src/protocol.js:12
Finding

Untrusted Task Content Is Published into Agent-Consumed Markdown

Content
View full analysis
') .description('Create a new task') .option('--desc ', 'Task description', '') .option('--priority ', 'Priority: high/medium/low', 'medium') .option('--timeout ', 'Timeout in minutes', '60') .option('--depends-on ', 'Comma-separated dependency task IDs', '') .option('--created-by ', 'Creating agent', 'cli') .option('--max-retries ', 'Max retries', '3') .action((title, opts) => { const db = initDb(); const t = createTask(db, { title, description: opts.desc, priority: opts.priority, timeout: parseInt(opts.timeout, 10), dependsOn: opts.dependsOn ? opts.dependsOn.split(',').map(s => s.trim()) : [], createdBy: opts.createdBy, maxRetries: parseInt(opts.maxRetries, 10), }); console.log(`Created task ${t.id}: ${t.title} [${t.priority}]`); closeDb(); }); ``` ```js export function taskToMd(task, result) { const frontmatter = { skill: 'orchestration', type: 'detail', layer: 'state', task_id: task.id, status: task.status, assigned_to: task.assigned_agent || null, created_by: task.created_by, priority: task.priority, timeout_minutes: task.timeout_minutes, depends_on: Array.isArray(task.depends_on) ? task.depends_on : JSON.parse(task.depends_on || '[]'), version: 1, generator: 'orchestration@1.0.0', tags: ['task'], }; let content = `# Task: ${task.title}\n\n`; content += `## Description\n${task.description || 'No description provided.'}\n\n`; content += `## Constraints\n- Complete within ${task.timeout_minutes} minutes\n- Priority: ${task.priority}\n\n`; content += `## Result\n`; if (result) ...[truncated 3112 chars]
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (14)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node src/cli.js agent register my-agent --capabilities "coding,research"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node src/cli.js agent register my-agent --capabilities "coding,research"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node src/cli.js agent register my-agent --capabilities "coding,research"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node src/cli.js agent register my-agent --capabilities "coding,research"

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node src/cli.js agent register my-agent --capabilities "coding,research"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The restore function performs a file write that can replace the active database at the default path, which is a potentially destructive operation. While there is a warning about WAL/SHM corruption risk, there is no disclosure or confirmation that the restore will overwrite the target database contents.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The provided file is a Markdown code review, not an implementation file or manifest-backed skill definition. It contains prose about other source files and their behavior, but does not itself implement capabilities that can be compared against a stated purpose, so the intent/capability mismatch rules are not meaningfully applicable here.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

This is a markdown file, so vague-trigger checks apply. The document identifies a review target and summarizes findings, but it provides no specific invocation scope, trigger examples, or exclusion conditions, which can make activation boundaries unclear if this file is used as skill-facing documentation.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: uuid==9.0.1 — 1 advisory(ies): CVE-2026-41907 (uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided)

Low
Category
Supply Chain
Confidence
92% confidence
Finding

The lockfile pins uuid to 9.0.1, and the reported advisory describes a missing buffer bounds check in certain UUID generation paths when a caller supplies a buf argument. This is a real dependency risk, even though the package-lock.json alone does not prove the vulnerable API is exercised by this skill; if reachable, it could cause crashes or undefined behavior in consumers using those functions.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 16)May include surrounding context.

json
"node": ">=18"
  },
  "dependencies": {
    "better-sqlite3": "^11.0.0",
    "commander": "^12.0.0",
    "uuid": "^9.0.0"
  }

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 17)May include surrounding context.

json
},
  "dependencies": {
    "better-sqlite3": "^11.0.0",
    "commander": "^12.0.0",
    "uuid": "^9.0.0"
  }
}

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 18)May include surrounding context.

json
"dependencies": {
    "better-sqlite3": "^11.0.0",
    "commander": "^12.0.0",
    "uuid": "^9.0.0"
  }
}

Known Vulnerable Dependency: uuid==9.0.1 — 1 advisory(ies): CVE-2026-41907 (uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided)

Low
Category
Supply Chain
Confidence
84% confidence
Finding

The static analysis indicates resolution to uuid 9.0.1, which is affected by CVE-2026-41907 involving missing buffer bounds checks in certain UUID generation paths when a buf argument is supplied. If this package or downstream code invokes the vulnerable API shape, malformed input could trigger crashes or other unintended behavior, creating a dependency-level denial-of-service risk even though package.json alone does not prove exploitability.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The module documentation says this is a 'Commander CLI entry point for the orchestration skill', which suggests a control interface for orchestration tasks. However, the same file imports and exposes backup and restore functionality, including full database restoration, which is a materially different administrative capability rather than just orchestration flow control.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.