Back to skill

Security audit

Team Projects

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its team-project purpose, but it asks for broad agent and tool authority and includes under-disclosed local execution and optional unauthenticated API behavior.

Review carefully before installing. Use explicit allowlists instead of wildcards, keep TEAM_PROJECTS_PORT disabled unless an authenticated and origin-restricted API is added, avoid sending sensitive project data through chat/tasks, and verify any spawned-agent task before letting it write files or use powerful tools.

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 (3)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/gateway-handlers.js:73
Finding

Unauthenticated State-Changing HTTP API with Wildcard CORS

Content
View full analysis
createProject(body), "GET /api/projects": (body) => listProjects(body), "GET /api/projects/:id": (body) => getProject(body.id), "PATCH /api/projects/:id": (body) => updateProject(body.id, body), "DELETE /api/projects/:id": (body) => deleteProject(body.id), "POST /api/phases": (body) => addPhase(body.projectId, body), "POST /api/tasks": (body) => addTask(body.projectId, body.phaseId, body), "PATCH /api/tasks/:id": (body) => updateTask(body.projectId, body.id, body), "GET /api/tasks": (body) => listTasks(body.projectId, body), "POST /api/comments": (body) => addComment(body.projectId, body.taskId, body), "POST /api/chat": (body) => appendChatMessage(body.projectId, body), "GET /api/chat": (body) => getChatHistory(body.projectId, body), "GET /api/stats": (body) => getProjectStats(body.projectId), "GET /api/wbs": (body) => getWBS(body.projectId), "GET /api/dispatch/plan": (body) => getDispatchPlan(body.projectId), "GET /api/dispatch/ready": (body) => findReadyTasks(body.projectId), "POST /api/dispatch/advance": (body) => advancePhases(body.projectId), }; const server = http.createServer(async (req, res) => { res.setHeader("Content-Type", "application/json"); res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE, OPTIONS"); res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); if (req.method === "OPTIONS") { res.writeHead(200); res.end(); return; } ``` ### Technical Analysis When `TEAM_PROJECTS_PORT` is set to a positiv ...[truncated 2053 chars]
Remediation
View remediation

T01 · Skill Instruction Hijacking

Error
Location
scripts/orchestrator.js:187
Finding

Stored Indirect Prompt Injection Through Project Task Content

Content
View full analysis
p.id === projectId || p.slug === projectId); if (!project) return null; const phase = (project.phases || []).find(ph => ph.id === phaseId); if (!phase) return null; if (!phase.tasks) phase.tasks = []; const task = { id: `task_${randomUUID().slice(0, 8)}`, title, description: description || "", assignee: assignee || null, priority: priority || "medium", status: "todo", tags: tags || [], dependsOn: Array.isArray(dependsOn) ? dependsOn : (dependsOn ? [dependsOn] : []), sessionKey: null, comments: [], artifacts: [], createdAt: now(), updatedAt: now(), startedAt: null, completedAt: null, }; ``` ### Technical Analysis Task titles, descriptions, project names, and phase names are persistent data that may originate from users, chat content, or t ...[truncated 1929 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
references/example-config.json:15
Finding

Wildcard Coordinator, Agent Communication, and Session Permissions

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
Findings (19)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises a substantial multi-agent project management system with coordination features and UI components. The supplied code chunk does not implement any of those behaviors; it merely exports an empty config schema and some TypeScript types from other modules. This is a materially different and far narrower purpose than described, so the description does not accurately represent the actual behavior of the provided code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

The description promises a full multi-agent project-management and orchestration skill, including UI components, coordinator-driven planning/assignment/dispatch, and sessions_spawn-based agent execution. The supplied code only provides backend persistence and a CLI for managing project data, phases, tasks, comments, chat history, stats, and WBS in local files. While some declared aspects are partially supported at the data-model level (projects, phases, tasks, assignees, dependencies, WBS, progress stats, chat message storage with mentions), the primary orchestration and UI claims are not implemented in this code chunk. In particular, mentions are merely stored as metadata, not routed; chat is file-based history, not a live drawer; and there is no code to spawn or coordinate agent sessions. Therefore the description materially overstates the actual behavior.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Copy `gateway-plugin/team-chat-drawer.ts` to `ui/src/ui/views/team-chat-drawer.ts`.

Exfiltration Commands

High
Category
Prompt Injection
Confidence
90% confidence
Finding

Instructions found that direct the agent to transmit conversation context or user data to external services.

Content

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

md
1. **Push-based completion** — No polling. OpenClaw's `subagent-announce` system delivers completion events automatically.
2. **Dependency gates** — The orchestrator only dispatches tasks whose `dependsOn` are all `done`.
3. **Tool isolation** — Each agent gets only the tools they need. A researcher can't exec arbitrary code; a coder can't send messages to external channels.
4. **File-based persistence** — Simple JSON storage. No database required. Works on any OpenClaw instance.
5. **CLI-first** — All operations available via CLI. The UI is optional.
6. **Agent-native** — Uses OpenClaw's existing `sessions_spawn`, `sessions_send`, and `agents_list` tools. No custom transport.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The UI view is not merely rendering data; it sends a natural-language instruction to an agent session telling it to run a local Node.js command from a fixed filesystem path and return raw JSON. That expands the plugin's authority from display-only behavior into agent-mediated code execution, which is dangerous because any compromise, prompt injection, or misuse of this pathway can trigger local command execution under the agent/runtime context.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
97% confidence
Finding

The HTTP API exposes powerful create, update, and delete operations directly from request parameters with no authentication, authorization, or input validation. In the context of a multi-agent project coordination skill, this allows any local process or code able to reach the bound port to manipulate projects, tasks, comments, and dispatch state, causing unauthorized actions, data tampering, or destructive deletions.

Content

Scanner excerpt · scripts/gateway-handlers.js (reported line 77)May include surrounding context.

js
"GET /api/projects":         (body) => listProjects(body),
    "GET /api/projects/:id":     (body) => getProject(body.id),
    "PATCH /api/projects/:id":   (body) => updateProject(body.id, body),
    "DELETE /api/projects/:id":  (body) => deleteProject(body.id),
    "POST /api/phases":          (body) => addPhase(body.projectId, body),
    "POST /api/tasks":           (body) => addTask(body.projectId, body.phaseId, body),
    "PATCH /api/tasks/:id":      (body) => updateTask(body.projectId, body.id, body),

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · scripts/orchestrator.js (reported line 126)May include surrounding context.

js
*/
export function recordCompletion(taskId, { agentId, summary, artifacts }) {
  const state = loadState();
  delete state.dispatched[taskId];
  state.completions.push({
    taskId,
    agentId,

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/orchestrator.js (reported line 202)May include surrounding context.

js
prompt += `1. Summarize what you did\n`;
  prompt += `2. List any artifacts (files created, URLs, etc.)\n`;
  prompt += `3. Note any issues or follow-up needed\n`;
  return prompt;
}

function countBlockedTasks(project) {

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill explicitly describes capabilities that involve inter-agent messaging, plugin installation, CLI execution, and file-backed persistence, but it does not declare any explicit tool scope or permission boundaries in the skill manifest. In a multi-agent environment, missing scope declarations increases the chance the skill is invoked with broader environment or network-capable tools than users expect, enabling overreach or unintended data access.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The invocation guidance is very broad and could cause the skill to trigger for ordinary planning or collaboration requests where users may not expect persistent storage, agent spawning, or message routing. In agentic systems, over-broad activation criteria can expand the attack surface by causing high-privilege orchestration behavior in contexts that only needed simple assistance.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill states that projects, chat logs, and orchestrator state are persisted under the user's workspace, but it does not present a prominent privacy or retention warning before usage. Because the stored content may include agent communications, task details, and potentially sensitive business/project data, silent persistence raises confidentiality and compliance risks.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The comments misdescribe the behavior as 'read directly from the filesystem,' while the implementation actually instructs an agent to execute a Node command through a session message. This mismatch is security-relevant because it obscures the real trust boundary and execution model, making review, auditing, and user understanding harder and increasing the chance that risky command execution remains unnoticed.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The code explicitly tells the agent to 'Run this silently' and return only raw JSON, meaning command-style execution occurs without meaningful user-facing disclosure or consent. Hidden execution increases the risk of users triggering privileged local actions from a dashboard refresh flow without realizing that a backend agent is being asked to run code.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The comments state this file is only a reference or future enhancement, but it actually starts a live HTTP server whenever TEAM_PROJECTS_PORT is set. That mismatch is dangerous because operators may assume the code is inert and unintentionally expose project-management functionality, including mutation endpoints, without planning authentication, review, or hardening.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The dispatch object sets taskId: task.id, but ready-task objects created earlier use the field name taskId rather than id. This contradicts the nearby documentation that getDispatchPlan returns a structured plan the coordinator can execute, because the emitted plan silently omits the intended task identifier.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code exposes deletion operations that permanently modify the JSON-backed datastore, but there is no confirmation prompt, warning message, or user-facing disclosure at the point of execution. Because the file is also callable as a CLI, a user can invoke deletion commands without any explicit notice that data will be removed.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The coordinator prompt explicitly instructs spawned agents to write deliverables into workspace paths such as '/workspace/research/competitors.md' without any user-facing warning or confirmation step. In a multi-agent orchestration context, this can cause silent filesystem modification, unexpected overwrites, or persistence of generated content based solely on coordinator decisions rather than explicit user consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The code takes free-form text from the textarea and sends it through client.request("sessions.send", { message: msg }). While the UI implies messaging, there is no explicit warning, confirmation, or explanatory comment about transmitting potentially sensitive user text to backend sessions or agents.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
80% confidence
Finding

The orchestrator instructs spawned agents to complete tasks and report artifacts including files and URLs, which implies downstream file creation or possible network-affecting work. While the file has a high-level module comment, it does not provide any user-facing disclosure or warning at the point of autonomous dispatch that tasks may modify data or interact with external systems.

Content

No source excerpt is available for this finding.