Back to skill

Security audit

project-manager-pro

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent local task manager, but its setup can request administrator package installation and it persists personal task data with broad automation.

Review setup.sh before installing. Run dependency installation yourself instead of letting the skill invoke sudo automatically, and treat the pm-pro directory and exports as sensitive plaintext because they may contain work, finance, health, schedule, and cross-tool context.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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
scripts/setup.sh:31
Finding

Sensitive task data and exports are created without restrictive permissions

Content
View full analysis

Vulnerability Details

File Location: scripts/setup.sh:31-61; scripts/export-tasks.sh:29-30, 82, 108-114
Vulnerability Type: Insecure file and directory permissions
Risk Level: Medium

Vulnerable Code

scripts/setup.sh:31-61:

bash
# Create data directory
if [ -d "$DATA_DIR" ]; then
    echo "📁 Data directory already exists: $DATA_DIR"
else
    mkdir -p "$DATA_DIR/archive"
    echo "📁 Created data directory: $DATA_DIR"
fi

# Initialize tasks.json
if [ ! -f "$DATA_DIR/tasks.json" ]; then
    echo "[]" > "$DATA_DIR/tasks.json"
    echo "📋 Initialized tasks.json"
else
    TASK_COUNT=$(jq 'length' "$DATA_DIR/tasks.json")
    echo "📋 tasks.json exists ($TASK_COUNT tasks)"
fi

# Initialize projects.json
if [ ! -f "$DATA_DIR/projects.json" ]; then
    echo "[]" > "$DATA_DIR/projects.json"
    echo "📁 Initialized projects.json"
else
    PROJECT_COUNT=$(jq 'length' "$DATA_DIR/projects.json")
    echo "📁 projects.json exists ($PROJECT_COUNT projects)"
fi

# Initialize check-in log
if [ ! -f "$DATA_DIR/check-in-log.json" ]; then
    echo "[]" > "$DATA_DIR/check-in-log.json"
    echo "📝 Initialized check-in-log.json"
else
    echo "📝 check-in-log.json exists"
fi

# Ensure archive directory exists
mkdir -p "$DATA_DIR/archive"

scripts/export-tasks.sh:29-30, 82, 108-114:

bash
# Ensure export directory
mkdir -p "$(dirname "$OUTPUT")"
bash
        } > "$OUTPUT"
        echo "✅ Exported $TASK_COUNT tasks to $OUTPUT"
bash
    json)
        OUTPUT="${OUTPUT}.json"
        jq '.' "$TASKS_FILE" > "$OUTPUT"
        echo "✅ Exported $TASK_COUNT tasks to $OUTPUT"
        ;;

Technical Analysis

The scripts do not set a restrictive process umask and do not explicitly assign secure modes to newly created directories or files. Consequently, permissions are inherited from the caller's environment. Under a co ...[truncated 1684 chars]

Remediation
View remediation

Remediation Suggestions

  1. Set a restrictive umask at the beginning of every script that creates or rewrites sensitive data:

    bash
    umask 077
    
  2. Explicitly create the data and archive directories with mode 0700:

    bash
    install -d -m 0700 "$DATA_DIR" "$DATA_DIR/archive"
    
  3. Create task databases, logs, archives, temporary files, and exports with mode 0600.

  4. Validate and repair permissions on existing installations:

    bash
    chmod 700 "$DATA_DIR" "$DATA_DIR/archive"
    find "$DATA_DIR" -type f -exec chmod 600 {} \;
    
  5. Preserve restrictive permissions when replacing files through temporary-file and mv operations.

  6. Warn users when an export destination is outside the protected data directory.

  7. Consider rejecting export destinations located in shared or world-writable directories unless the user explicitly confirms the risk.

T05 · Unauthorized Access and Privilege Escalation

Note
Location
scripts/setup.sh:11
Finding

Setup automatically invokes privileged system package installation

Content
View full analysis

Vulnerability Details

File Location: scripts/setup.sh:11-24
Vulnerability Type: Unnecessary privilege boundary crossing
Risk Level: Low

Vulnerable Code

bash
# Check for jq
if ! command -v jq &>/dev/null; then
    echo "⚠️  jq not found. Installing..."
    if command -v brew &>/dev/null; then
        brew install jq
    elif command -v apt-get &>/dev/null; then
        sudo apt-get install -y jq
    elif command -v dnf &>/dev/null; then
        sudo dnf install -y jq
    else
        echo "❌ Could not install jq automatically."
        echo "   Install it manually: https://jqlang.github.io/jq/download/"
        exit 1
    fi
    echo "✅ jq installed"
fi

Technical Analysis

The setup script is described primarily as initializing a user-local data directory, but it automatically invokes sudo when jq is unavailable on systems using APT or DNF. This crosses from user-level workspace initialization into system-wide package management.

The dependency and package-manager sources are standard, and the README discloses that jq may be installed automatically. No malicious package name, dependency-confusion pattern, or untrusted package repository was identified. Nevertheless, automatically requesting administrative privileges violates least-privilege principles because initialization itself does not require root access.

The -y option also removes the package manager's normal confirmation step after privilege authorization. Security consequences depend on the integrity of the host's configured repositories, package-manager hooks, and sudo environment.

Attack Path

  1. A user runs scripts/setup.sh, expecting user-local workspace initialization.
  2. The script determines that jq is missing.
  3. On an APT- or DNF-based system, it invokes sudo and requests administrator authorization.
  4. The package manager modifies system-wide package state using ...[truncated 974 chars]
Remediation
View remediation

Remediation Suggestions

  1. Do not invoke sudo or install system packages automatically from the setup script.
  2. If jq is unavailable, stop with a clear prerequisite message and provide platform-specific commands for the user to review and execute explicitly.
  3. Separate dependency installation from workspace initialization.
  4. Initialize the empty JSON files without requiring jq; require jq only for operations that actually parse JSON.
  5. If optional automated installation is retained, require an explicit command-line flag and interactive confirmation before invoking any package manager.
  6. Document the exact system modifications and supported package sources before requesting elevated privileges.
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (23)

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · README.md (reported line 38)May include surrounding context.

2. Setup

Run the setup script to create the data directory:

bash
chmod 700 ~/.openclaw/skills/project-manager-pro/scripts/*.sh

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · README.md (reported line 41)May include surrounding context.

Run the setup script to create the data directory:

bash
chmod 700 ~/.openclaw/skills/project-manager-pro/scripts/*.sh
~/.openclaw/skills/project-manager-pro/scripts/setup.sh

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README instructs users to 'Just talk to your agent,' which is an overly broad activation description for a markdown file. It does not define clear trigger scope, constraints, or negative examples, so ordinary conversation could plausibly overlap with skill invocation.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
80% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · README.md (reported line 56)May include surrounding context.

md
### 4. Use

Just talk to your agent:
- "Add a task to review the contract by Thursday"
- "Break down the apartment move into subtasks"
- "What's on my plate today?"
- "Mark the dentist appointment as done"

Session Persistence

Medium
Category
Rogue Agent
Confidence
80% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · examples/example-project-breakdown.md (reported line 62)May include surrounding context.

md
### 4. Use

Just talk to your agent:
- "Add a task to review the contract by Thursday"
- "Break down the apartment move into subtasks"
- "What's on my plate today?"
- "Mark the dentist appointment as done"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README states that 'jq' is installed automatically by setup.sh if missing, but the setup instructions do not warn the user that running setup may modify the host system by installing packages. Hidden system modification increases supply-chain and privilege-risk because users may execute the script without realizing it changes package state or invokes package managers.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The setup prompt instructs the agent to run setup.sh before the conversation and later to write settings.json and create a data directory, but it does not require any explicit user notice or confirmation for these side effects. In an agent context, hidden filesystem writes or shell execution during first-run setup can surprise users, create unwanted persistence, and normalize unsafe behavior that could be abused if the script or write targets are modified.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger phrases are broad and include everyday language such as 'I need to...' and 'don't let me forget...', which can cause the skill to activate on casual conversation and persist data the user did not clearly intend to store. In a task-management skill that writes to disk automatically, overbroad activation materially increases the risk of unintended task creation, data retention, and cross-context behavioral confusion.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill specifies that tasks, notes, projects, and related metadata are stored in local JSON files, but it does not clearly warn the user that potentially sensitive personal or work information will be persisted on disk. This creates a privacy and informed-consent issue, especially because notes and cross-linked project context may contain sensitive data the user did not expect to be retained.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
91% confidence
Finding

The skill instructs the agent to parse implied task statements into structured data and store them persistently, which is a form of session-to-session memory creation. Without explicit consent and with broad natural-language triggers, this can cause unintentional retention of personal plans, reminders, and sensitive notes beyond the current conversation.

Content

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

md
When the user says something that implies a task, parse it into structured data. Use these patterns:

**Direct task creation:**
- "Add a task to call the dentist by Friday" → title: "Call the dentist", due: next Friday, priority: P3
- "I need to file taxes by April 15" → title: "File taxes", due: 2026-04-15, priority: P1 (deadline-driven)
- "Don't forget to buy groceries" → title: "Buy groceries", priority: P3, no due date
- "Remind me to review the pitch deck tomorrow morning" → title: "Review the pitch deck", due: tomorrow

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The cross-tool integration section enables automatic ingestion of actionable items from other tools and persists them as tasks without a clear user warning or consent boundary. This can silently aggregate data across domains like finance, health, meals, and content planning, increasing privacy exposure and the chance of storing sensitive derived inferences.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
87% confidence
Finding

The initialization behavior allows the agent to create persistent local directory structures and data stores automatically on first use. Even though the storage is local, silently establishing long-lived state on disk without an explicit notice or opt-in raises persistence and privacy concerns, especially in environments where workspace contents may later be backed up or shared.

Content

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

Initialization

On first use, run the setup script or let the agent create the directory structure:

bash
~/.openclaw/workspace/pm-pro/scripts/setup.sh

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 503)May include surrounding context.

md
- Create duplicate tasks — check for similar titles before creating
- Nag about the same overdue task more than once per check-in
- Create tasks from casual conversation ("I should really clean my desk" is not a task unless confirmed)
- Override user-set priorities without asking
- Send check-ins during configured quiet hours
- Make assumptions about project scope — ask before decomposing unless the user explicitly requests it

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This JSON manifest/config file falls under the SQP-1 scope. The auto-suggest trigger keywords include very broad terms like "plan," "build," "organize," and "prepare," which overlap with common everyday language and may cause the skill behavior to activate in unintended contexts without clear scope constraints or exclusions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The examples show automatic task creation that propagates sensitive personal and behavioral data across tools, including bills, subscriptions, spending patterns, workout schedules, supplement purchases, and content plans. Even though this is documentation, it normalizes cross-tool data sharing without any explicit privacy warning, consent boundary, minimization guidance, or mention of access controls, which could lead implementers or users to expose more personal data than necessary.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This markdown file describes setting up Google Analytics and Meta Pixel, which can affect user privacy by collecting visitor tracking data. The surrounding skill description does not include any warning or disclosure that the generated plan may recommend analytics/marketing trackers or that privacy/compliance review may be needed.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script’s comments describe only local directory and store initialization, but it also attempts to install jq and may invoke package managers with elevated privileges. This mismatch is security-relevant because users may run the script expecting harmless local setup while it performs system-wide changes and triggers privileged operations.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
89% confidence
Finding

The script invokes sudo apt-get install -y jq, which causes privileged system changes during setup. While installing jq is not inherently malicious, automatic elevation in a skill setup script increases risk because it expands the script’s effect beyond the application directory and may execute with more trust than the user intended.

Content

Scanner excerpt · scripts/setup.sh (reported line 18)May include surrounding context.

sh
if command -v brew &>/dev/null; then
        brew install jq
    elif command -v apt-get &>/dev/null; then
        sudo apt-get install -y jq
    elif command -v dnf &>/dev/null; then
        sudo dnf install -y jq
    else

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
89% confidence
Finding

The script invokes sudo dnf install -y jq, introducing privileged package installation as part of setup. In the context of an agent skill, this is more dangerous because users may execute setup scripts with limited review, and privileged package manager actions can alter the host system outside the skill’s local data scope.

Content

Scanner excerpt · scripts/setup.sh (reported line 20)May include surrounding context.

sh
elif command -v apt-get &>/dev/null; then
        sudo apt-get install -y jq
    elif command -v dnf &>/dev/null; then
        sudo dnf install -y jq
    else
        echo "❌ Could not install jq automatically."
        echo "   Install it manually: https://jqlang.github.io/jq/download/"

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script is presented as a read-only weekly review generator, but it also performs state-changing archival and deletion of completed tasks from the active task file. This mismatch is dangerous because an agent or user may invoke it expecting reporting only, causing unintended data modification and weakening informed consent and auditability.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The auto-archive logic silently rewrites both the monthly archive and the active tasks file during what appears to be a reporting operation, with no prior warning or confirmation. In an agent context, hidden destructive side effects are especially risky because routine scheduled execution can mutate or remove active records unexpectedly, and failures during rewrite can also lead to data loss or duplication.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

This markdown skill example depicts the agent changing task metadata, including marking tasks done and updating a due date, but the description does not include any user warning that the skill may alter the user's task records. Because markdown files should warn about behaviors that could affect user data, this is a missing disclosure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The example has the agent escalating priority, setting a hard deadline, and updating a dependency chain, all of which imply writes to the user's task/planning data. The markdown does not warn that using the skill can modify planning records, so users are not explicitly informed of this behavior.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.