Back to skill

Security audit

Meta Workflow Discoverer

Security checks for vulnerabilities and agentic risk

Overview

This workflow-discovery skill has no clear exfiltration or destructive code, but it persistently profiles user activity and under-specifies sensitive sharing, consent, and storage controls.

Review before installing. Use this only for non-sensitive workflows unless storage is scoped and protected, avoid enabling conversation or skill-usage hooks without explicit user consent and retention limits, do not use cross-user learning without strong isolation/anonymization, and remove or pin the unused installation dependencies.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
workflow_discoverer.py:25
Finding

Path Traversal Through Unsanitized User Identifier and Storage Path

Content
View full analysis

Vulnerability Details

File Location: workflow_discoverer.py, lines 25–46
Vulnerability Type: Path traversal and unsafe filesystem access
Risk Level: Medium

Vulnerable Code:

python
# Storage
self.storage_path = storage_path or f"~/.workflow_discoverer/{user_id}.json"
self.data = self._load()

# Initialize
self.data.setdefault('tasks', [])
self.data.setdefault('sequences', [])
self.data.setdefault('workflows', [])
self.data.setdefault('automations', [])

def _load(self) -> Dict:
    """Load data"""
    path = os.path.expanduser(self.storage_path)
    if os.path.exists(path):
        with open(path, 'r') as f:
            return json.load(f)
    return {}

def _save(self):
    """Save data"""
    path = os.path.expanduser(self.storage_path)
    os.makedirs(os.path.dirname(path), exist_ok=True)
    with open(path, 'w') as f:
        json.dump(self.data, f, indent=2)

Technical Analysis

The constructor directly interpolates the caller-controlled user_id into a filesystem path. Neither user_id nor a caller-supplied storage_path is validated, canonicalized, or checked against an approved storage directory.

Path components such as ../ can therefore escape the intended ~/.workflow_discoverer directory. The resulting path is passed to open() for both reading and writing. The implementation also follows symbolic links and does not verify that the resolved target is a regular file owned by the expected user.

Reading requires the target file to contain valid JSON because json.load() is used. Writing occurs when methods such as record_task(), create_automation(), enable_automation(), or disable_automation() call _save().

Attack Path

  1. An attacker gains control over the user_id argument or the optional storage_path argument passed to WorkflowDiscoverer.
  2. The attacker supplies a traversal value such as ../target for user_id.
  3. Th ...[truncated 1133 chars]
Remediation
View remediation

Remediation Suggestions

  • Do not use raw user identifiers as filenames. Convert them to a fixed safe representation, such as a SHA-256 digest.
  • If readable identifiers are required, enforce a strict allowlist such as ^[A-Za-z0-9_-]{1,64}$.
  • Resolve the base directory and destination with pathlib.Path.resolve(), then verify that the destination remains beneath the approved base directory.
  • Reject absolute paths and traversal components in caller-provided storage_path values, or remove the ability for untrusted callers to select storage paths.
  • Defend against symbolic-link attacks by rejecting symlink targets and, where supported, opening files with safe flags such as O_NOFOLLOW.
  • Write through a securely created temporary file in the same directory and atomically replace the destination.
  • Apply restrictive directory and file permissions, such as 0700 for the storage directory and 0600 for data files.
  • Handle malformed JSON and filesystem errors without exposing unrelated file contents or corrupting existing state.

T08 · Insecure Dependencies

Note
Location
SKILL.md:45
Finding

Unpinned and Unused Third-Party Installation Dependencies

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 45–49
Vulnerability Type: Unsafe dependency installation guidance
Risk Level: Low

Vulnerable Code:

markdown
## Installation

```bash
pip install numpy pandas scikit-learn
text

### Technical Analysis

The installation instructions request three third-party packages without exact version constraints or integrity hashes. Consequently, package resolution can produce different artifacts over time and depends on the package index configured in the user's environment.

Python package installation may execute build backends or other installation-time code. If an upstream release, configured package index, dependency, or network trust boundary is compromised, following this command can execute attacker-controlled installation logic with the privileges of the invoking user.

The reviewed `workflow_discoverer.py` file does not import `numpy`, `pandas`, or `scikit-learn`. These dependencies therefore introduce avoidable supply-chain exposure for the current implementation.

### Attack Path

1. A user follows the documented `pip install` command.
2. `pip` resolves mutable package versions and transitive dependencies from the user's configured index.
3. A compromised upstream release, dependency, index mirror, or maliciously configured package source supplies an attacker-controlled artifact.
4. The package manager downloads and builds or installs that artifact.
5. Installation-time code executes with the privileges of the user running `pip`.
6. The malicious package can access files, credentials, environment variables, and network resources available to that user.

This finding does not establish that the named packages are malicious. The risk arises from unnecessary dependencies and the absence of reproducible version and integrity controls.

### Impact Assessment

If the dependency supply chain is compromised, attacker code could execute with th
...[truncated 371 chars]
Remediation
View remediation

Remediation Suggestions

  • Remove numpy, pandas, and scikit-learn from the installation instructions unless the implementation actually requires them.
  • If dependencies become necessary, pin exact reviewed versions rather than relying on unconstrained resolution.
  • Use a lock file or requirements file containing cryptographic hashes, and install with hash verification enabled.
  • Review and pin transitive dependencies as part of the release process.
  • Install packages from a trusted, explicitly configured index.
  • Prefer isolated virtual environments and avoid installing packages with administrative privileges.
  • Add automated dependency scanning and periodic review procedures.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The 'Cross-User Learning' feature states that learned behavior is shared across users without any warning, consent model, or isolation guarantees. In this context, pattern sharing can leak one user's habits, workflows, recipients, schedules, or business processes into another user's environment, creating a significant privacy and confidentiality risk.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
83% confidence
Finding

The skill advertises automation discovery and creation but does not declare any explicit tool scope or permissions despite behavior that implies reading histories and generating or persisting workflows. That mismatch weakens least-privilege controls and can allow broader file access than users or the host platform expect.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The description markets efficiency benefits but omits that the skill observes user history and can import external task data to infer patterns and generate automations. Users may unknowingly expose sensitive operational, personal, or business history because meaningful data collection and profiling are not clearly disclosed upfront.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

Plain-language product behavior explicitly implies sharing learned patterns across users, which can expose derived data from task histories even if raw records are not directly shown. Because workflows often encode sensitive context such as communication targets, timing, and business routines, this sharing is especially dangerous in an automation-discovery skill.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The OpenClaw integration records message-derived intent and tool usage after conversations, creating a passive collection channel from natural-language interactions. This can capture sensitive prompts, operational goals, and inferred behavior without clear minimization or consent, making the skill more dangerous because its core purpose is to turn those observations into executable automations.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Learning from skill usage stores execution steps, context, and results, which can retain secrets, business data, or user-specific operational details. Retained histories become a sensitive dataset that could be misused for inference, unauthorized sharing, or overbroad automation generation if not tightly scoped and protected.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
84% confidence
Finding

The skill maintains session persistence by storing accumulated tasks, sequences, workflows, and automations across runs on disk. In this skill context, long-term retention increases sensitivity because it builds a behavioral history of user activity patterns that could reveal habits, schedules, and potentially sensitive workflow details if accessed or repurposed.

Content

Scanner excerpt · workflow_discoverer.py (reported line 2)May include surrounding context.

python
"""
Workflow Discoverer - Auto-detect and create workflows
"""
import json
import os

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

Task, workflow, context, and automation history are persisted to a predictable local file under the user's home directory without any notice, consent flow, or protection controls. Because context may contain sensitive operational or personal data, silent persistence can expose private information to other local processes, backups, shared accounts, or accidental disclosure.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The manifest describes a skill that automatically generates executable automation workflows, implying created automations can actually run. In code, create_automation only persists metadata and run_automation explicitly notes that production execution is absent and merely simulates success, so the implemented behavior falls short of the claimed operational capability.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The run_automation docstring says 'Run automation manually', which implies performing the automation's steps. However, the implementation explicitly comments that it does not execute steps and instead increments counters and returns success, contradicting the stated intent of the method documentation.

Content

No source excerpt is available for this finding.