Back to skill

Security audit

TreeListy

Security checks for vulnerabilities and agentic risk

Overview

This is mostly a local project-planning skill, but its optional push command can send tree data and a token over unencrypted WebSocket to any host even though the documentation frames it as localhost-only.

Install only if you are comfortable with a local Node CLI and avoid using the push command with remote hosts or sensitive tree contents until it restricts destinations to loopback or supports authenticated encrypted connections. Treat CSV exports as untrusted when opening them in spreadsheets, update the ws dependency, and use the freespeech pattern only with informed consent from anyone whose transcript is being analyzed.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/push.js:29
Finding
Arbitrary Remote Host Allows Plaintext Disclosure of Tree Data and Authentication Tokens<![CDATA[ ## Vulnerability Details **File Location**: `scripts/push.js:29-53`; externally controlled parameters originate from `scripts/treelisty-cli.js:233-258` **Vulnerability Type**: Plaintext transmission of sensitive data to an unrestricted destination **Risk Level**: Medium ### Vulnerable Code ```js // scripts/treelisty-cli.js:233-258 async function cmdPush(options) { const { input, port = 3456, token, host = 'localhost' } = options; if (!input) { console.error('Error: --input is required (path to tree JSON file)'); process.exit(1); } // Check connection first console.log(`Checking TreeListy connection at ${host}:${port}...`); const status = await checkConnection({ port: parseInt(port), host }); if (!status.available) { console.error(`Cannot connect to TreeListy.`); console.error('Make sure TreeListy is open in your browser with MCP bridge enabled.'); console.error(`Reason: ${status.reason}`); process.exit(1); } console.log('Connected. Pushing tree...'); // Read and parse tree const content = readInput(input); const tree = parseJSON(content); try { const result = await push(tree, { port: parseInt(port), token, host }); ``` ```js // scripts/push.js:29-53 const { port = DEFAULT_PORT, token = null, host = 'localhost' } = options; return new Promise((resolve, reject) => { const wsUrl = `ws://${host}:${port}`; // Connection timeout const connectTimer = setTimeout(() => { ws.close(); reject(new Error(`Connection timeout - is TreeListy running with MCP bridge on port ${port}?`)); }, CONNECT_TIMEOUT); const ws = new WebSocket(wsUrl); ws.on('open', () => { clearTimeout(connectTimer); // Send handshake with token if provided const handshake = { type: 'handshake', source: 'openclaw-skill', version: '1.0.0', token: token }; ws.send(JSON.stringify(handshake)); }); ``` After the hands ...[truncated 2641 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Restrict ordinary push operations to loopback destinations: - Accept only `localhost`, `127.0.0.1`, and `::1`. - Resolve hostnames and verify that the resulting address is loopback to prevent DNS-based bypasses. 2. If remote connections are required, place them behind a separate explicit option such as `--allow-remote`. 3. Require `wss://` for every non-loopback connection and validate the server certificate. 4. Allow the complete WebSocket URL to be configured safely instead of unconditionally constructing a `ws://` URL. 5. Display a clear confirmation before sending a tree or token to a remote destination. 6. Use short-lived, narrowly scoped tokens and avoid placing secrets directly in command-line arguments, where they may appear in shell history or process listings. 7. Document the exact network behavior and update claims that imply the push function is restricted to localhost. 8. Consider applying destination allowlists and limits on tree size before transmission. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/export.js:154
Finding
CSV Export Does Not Neutralize Spreadsheet Formula Injection<![CDATA[ ## Vulnerability Details **File Location**: `scripts/export.js:154-183` **Vulnerability Type**: CSV formula injection **Risk Level**: Medium ### Vulnerable Code ```js // Escape CSV value function csvEscape(val) { if (val === null || val === undefined) return ''; const str = String(val); if (str.includes(',') || str.includes('"') || str.includes('\n')) { return `"${str.replace(/"/g, '""')}"`; } return str; } // Add a node row function addRow(node, level) { const row = [ pattern?.levels[level] || `Level ${level}`, csvEscape(node.name), csvEscape(node.patternType || ''), csvEscape(node.description || '') ]; if (includeFields && pattern && pattern.fields) { for (const field of Object.keys(pattern.fields)) { row.push(csvEscape(node[field])); } } rows.push(row.join(',')); } ``` ### Technical Analysis The `csvEscape` function correctly addresses structural CSV characters such as commas, quotation marks, and newlines. It does not, however, neutralize values that spreadsheet applications interpret as formulas. Tree names, descriptions, pattern types, and pattern-specific fields may originate from untrusted input. If a value begins with a formula trigger such as `=`, `+`, `-`, or `@`, it is written directly to the exported CSV. Quoting such a value for CSV syntax does not reliably prevent spreadsheet software from evaluating it as a formula. The vulnerability is triggered when a victim opens the generated CSV in spreadsheet software that evaluates formulas. The exact capabilities and security prompts depend on the spreadsheet product and its configuration. ### Attack Path 1. An attacker supplies or contributes tree data containing a formula-like field, for example: ```json { "name": "=HYPERLINK(\"https://attacker.example/collect\",\"Open report\")", "type": "root", "pattern": "generic", "children": [] } ``` 2. The victim exports the tree: ```bash node scripts/t ...[truncated 1264 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Detect cells whose first significant character is `=`, `+`, `-`, or `@`. 2. Neutralize formula-like cells by prefixing them with an apostrophe or another spreadsheet-safe text marker before applying normal CSV quoting. 3. Account for bypass characters such as leading tabs, carriage returns, line feeds, and spaces that some spreadsheet applications ignore before formula evaluation. 4. Apply protection to every attacker-controlled field, including names, descriptions, pattern types, and pattern-specific values. 5. Consider adding a safe-by-default spreadsheet export mode and a separate raw CSV mode only when explicitly requested. 6. Add regression tests for representative payloads: ```text =1+1 +SUM(1,1) -1+2 @SUM(1,1) \t=HYPERLINK("https://example.invalid","Click") ``` 7. Document that CSV output should be treated as untrusted until formula neutralization is implemented. ]]>
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (40)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill is presented primarily as a local planning/decomposition tool, but it also documents a `push` capability that connects to a browser-based bridge on a port and sends data to a running TreeListy instance. That hidden or underemphasized network behavior expands the trust boundary, creates opportunities for unintended data exfiltration or interaction with external/local services, and is especially relevant in agent environments where users may expect purely local formatting operations.

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Content
---
name: treelisty
description: Hierarchical project decomposition and planning. Use when breaking down complex projects, structuring information, planning multi-step workflows, or organizing any nested hierarchy. Supports 21 specialized patterns (WBS, GTD, Philosophy, Sales, Film, etc.) and exports to JSON, Markdown, and Mermaid diagrams.
license: Apache-2.0
metadata:
  author: prairie2cloud
  version: "1.0.0"
  openclaw:
    requires:
      bins: ["node"]
---

# TreeListy Skill

TreeListy is your hierarchical decomposition engine. When you need to break down a complex topic, plan a project, or structure inform
Confidence
80% confidence
Finding
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node scripts/treelisty-cli.js patterns
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
97% confidence
Finding
The lockfile pins the skill to ws 8.19.0, and the supplied advisory data indicates this version is affected by an uninitialized memory disclosure issue and a memory-exhaustion denial-of-service issue. Because this skill exposes a CLI and includes a WebSocket library, any code path that accepts untrusted WebSocket input could allow remote attackers to crash the process or potentially disclose sensitive memory contents.

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
91% confidence
Finding
If this package range resolves to ws 8.19.0, the project would include a version reported as affected by memory disclosure and memory exhaustion denial-of-service issues. Even though this file alone does not prove the vulnerable version is installed, the declared semver range allows that version, making the dependency risk real for consumers who install or update without a restrictive lockfile.

Context-Inappropriate Capability

High
Confidence
95% confidence
Finding
The 'freespeech' pattern explicitly advertises psychological pattern detection and hidden-pattern interpretation of transcription data, which goes beyond neutral hierarchical planning into sensitive inference about mental state or inner beliefs. This creates a meaningful risk of privacy invasion, manipulative profiling, and unsafe analysis of sensitive user data without clear consent or safeguards.

Missing User Warnings

High
Confidence
95% confidence
Finding
The freespeech pattern invites psychological analysis of voice or transcription content, including hidden patterns, contradictions, and implicit beliefs, without warning users about the sensitivity of such profiling. This is dangerous because it can normalize invasive inference from speech data and encourage unsupported or harmful conclusions about a person’s psychology.

Static analysis

No suspicious patterns detected.