Back to skill

Security audit

Workflow Automator

Security checks for vulnerabilities and agentic risk

Overview

This workflow automation skill is mostly coherent, but it grants broad unattended shell and browser automation powers with incomplete runtime limits.

Install only if you are comfortable with a skill that can run approved shell commands, automate browser sessions, keep schedules, and store workflow outputs locally. Use restricted_mode and explicit allowed_commands for every workflow, avoid autonomous runs for sensitive sites or private data, review plan files and destination URLs before approval, and periodically purge screenshots, run logs, audit logs, and browser sessions.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/execute-step.sh:17
Finding

Autonomous shell execution can bypass incomplete command safety filters

Content
View full analysis
*/dev/tcp|\| *nc |\| *netcat |> */dev/udp' ENCODING_PATTERNS='base64|\\\\x[0-9a-fA-F]|\$\x27\\\\x|eval |exec |source /dev' ``` ```bash # 1. Destructive patterns (hard block — BOTH modes) if echo "$cmd" | grep -qE "$UNSAFE_PATTERNS"; then echo "BLOCKED: Destructive command pattern: $cmd" >&2 log_entry "BLOCKED destructive command: $cmd" blocked="true" fi # 2. Data exfiltration patterns if echo "$cmd" | grep -qE "$EXFIL_PATTERNS"; then log_entry "DETECTED exfiltration pattern: $cmd" if [ "$AUTONOMOUS" = "true" ]; then echo "BLOCKED: Exfiltration pattern not allowed in autonomous mode: $cmd" >&2 blocked="true" else warnings="${warnings} ⚠ EXFILTRATION: This command pipes data to an external endpoint\n" needs_confirmation="true" fi fi # 3. Encoding/obfuscation patterns if echo "$cmd" | grep -qE "$ENCODING_PATTERNS"; then log_entry "DETECTED encoding pattern: $cmd" if [ "$AUTONOMOUS" = "true" ]; then echo "BLOCKED: Obfuscated commands not allowed in autonomous mode: $cmd" >&2 blocked="true" else warnings="${warnings} ⚠ OBFUSCATION: This command uses encoding/eval patterns\n" needs_confirmation="true" fi fi ``` ```bash elif [ -n "$STEP_CMD" ]; then # Shell command execution if ! safety_check "$STEP_CMD"; then EXIT_CODE=1 echo "Command blocked by safety check" > "$STDERR_FILE" else # Execute with timeout (use gtimeout on macOS if timeout unavailable) TIMEOUT_CMD="timeout" if ! command -v timeout >/dev/n ...[truncated 3215 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/execute-step.sh:363
Finding

Autonomous browser navigation does not enforce the declared site allowlist at runtime

Content
View full analysis
/dev/null; then site_found="true" break fi done <<< "$USER_SITES" if [ "$site_found" = "false" ]; then WARNINGS+=("$PREFIX: URL '$url' not in user-specified sites list") fi fi # Sensitive site detection if echo "$url" | grep -qiE "$SENSITIVE_SITES"; then ERRORS+=("$PREFIX: BLOCKED — URL '$url' matches a sensitive/financial site. Automating banking, payment, or investment sites is not allowed for security reasons.") fi ``` ```bash # Validate JSON if ! jq empty "$PLAN_FILE" 2>/dev/null; then echo "Error: Invalid JSON: $PLAN_FILE" >&2 exit 1 fi # --- Approval Summary --- STEP_COUNT=$(jq '.steps | length' "$PLAN_FILE") SHELL_CMDS=$(jq '[.steps[] | select(.command != null and .command != "")] | length' "$PLAN_FILE") BROWSER_STEPS=$(jq '[.steps[] | select(.type | startswith("browser"))] | length' "$PLAN_FILE" 2>/dev/null || echo 0) ``` ```bash if is_browser_step; then # Browser steps: output a JSON instruction for the agent runtime # The agent runtime interprets these and drives the actual browser browser_instruction="" case "$STEP_TYPE" in browser-navigate) browser_instruction="{\"action\": \"goto\", \"url\": \"$STEP_URL\", \"timeout\": $TIMEOUT}" ;; browser-click) browser_instruction="{\"action\": \"click\", \"selector\": \"$STEP_SELECTOR\", \"timeout\": $TIMEOUT}" ;; browser-fill) browser_instruction="{\"action\": \"fill\", \"selector\": \"$STEP_SE ...[truncated 3184 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/execute-step.sh:510
Finding

Workflow outputs, commands, and screenshots may be persisted with permissive filesystem permissions

Content
View full analysis
"$RESULT_FILE" ``` ```bash AUDIT_FILE="$HOME/.openclaw/workflow-automator/audit.log" ... mkdir -p "$(dirname "$AUDIT_FILE")" ... # Sanitize command — replace tabs and newlines with spaces, truncate to 200 chars CLEAN_CMD=$(echo "$CMD" | tr '\t\n' ' ' | cut -c1-200) printf "%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" \ "$TS" "$MODE" "$WORKFLOW" "$STEP" "$TYPE" "$CLEAN_CMD" "$EXIT_CODE" "$HASH_VERIFIED" \ >> "$AUDIT_FILE" ``` ### Technical Analysis The Skill persists several classes of potentially sensitive artifacts: - Captured standard output and standard error in run-result JSON. - Workflow commands in `audit.log`. - Browser screenshots that may include authenticated pa ...[truncated 1818 chars]
Remediation
View remediation
Vulnerability Patterns
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (50)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The code chunk does not implement the declared core capabilities like task decomposition, scheduling, browser automation, messaging notifications, or Excel/CSV processing. Instead, it provides an audit-log management tool for workflow executions. While audit logging could be a supporting component of a larger workflow automation system, this chunk’s actual behavior is specifically focused on local logging and reporting, which is a materially different primary purpose from the broad end-user automation functionality described. Therefore, the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code chunk’s actual purpose is limited to environment validation for a larger 'workflow-automator' system. It checks for binaries like bash, jq, curl, bc, and shasum/sha256sum, optionally reports optional tools, and caches pass/fail status. This is a supporting setup utility, not an implementation of the broad automation features promised in the description. Because the declared purpose emphasizes operational workflow automation capabilities while the provided code only performs dependency checking, the description does not accurately represent what this code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The supplied code does not implement workflow automation, scheduling, notifications, browser automation, CSV/Excel processing, or plain-English task decomposition. Instead, it is a maintenance/data-management script focused on showing and purging on-disk state for the workflow automator. This is a materially different primary purpose from the declared description. While the data categories relate to the broader automation skill, this chunk specifically exposes storage inventory and destructive deletion capabilities that are not described in the declared purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The description presents a comprehensive automation agent capable of interpreting plain-English tasks, orchestrating multi-step workflows, scheduling them, processing files, and extracting web data. The supplied code does not implement any of those primary capabilities. It only prepares structured notification payloads for a limited messaging helper script. While notifications are mentioned in the description, this code is only a small supporting component and does not match the declared overall purpose of the skill. Additionally, it includes channels beyond WhatsApp/Telegram, but the main mismatch is that the actual code is far narrower than the declared workflow automation functionality.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description presents a workflow automation agent that executes and schedules tasks, processes files, automates browsers, and sends notifications. The supplied code does not perform any of those automation functions. Instead, it is a governance/safety utility that manages approvals for workflow plans using hashes, TTLs, revocation state, and run counts. While it references workflow plans and summarizes their steps, it does not decompose tasks, execute workflows, schedule jobs, process Excel/CSV files, browse websites, or send WhatsApp/Telegram notifications. This is a materially different primary purpose, so the description does not accurately represent the code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a broad workflow automation agent with messaging, file processing, scheduling, and browser automation capabilities. The supplied code chunk does not implement those user-facing automation functions. Instead, it is a narrow support utility focused on browser session safety: storing per-workflow session metadata, checking max session age, creating isolated profile directories, and deleting session data. While this could support browser automation internally, its primary purpose is materially different from the declared skill description, and it introduces undeclared capabilities around authentication/session management and local filesystem handling.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code chunk has a much narrower purpose than the declared description. It only summarizes prior workflow execution results from local files under ~/.openclaw/workflow-automator, including step pass/fail counts, durations, screenshots, schedule metadata, and notification channel metadata. Although it mentions schedule and notification info, it merely reads and reports those fields; it does not perform scheduling or send messages. Therefore the description materially overstates the implemented behavior and primary purpose of this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description presents an automation agent that carries out workflows, browser actions, file processing, scheduling, and messaging integrations. The supplied code instead is a validator for workflow-plan JSON. Its primary function is static analysis and policy enforcement: checking required fields, validating cron syntax, ensuring browser steps contain URLs/selectors, warning on exfiltration/obfuscation patterns, enforcing allowed_commands in restricted mode, and blocking sensitive financial-site automation. While validation could be a supporting component of an automation system, this chunk by itself does not implement the advertised execution, scheduling, messaging, or data-processing capabilities, and it adds notable undeclared security controls. Therefore the description does not accurately represent the actual behavior of this code chunk.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
### Safety
I will refuse to execute commands that:
- Delete system files or recursive force-delete (rm -rf /)
- Format disks or overwrite block devices
- Escalate privileges without explicit intent
- Modify system configuration files

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/data-inventory.sh (reported line 218)May include surrounding context.

sh
rm -f "$TARGET"
            echo "Purged: audit log"
        else
            rm -rf "${TARGET:?}"/*
            echo "Purged: $CATEGORY ($(dir_size "$TARGET"))"
        fi
        ;;

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/data-inventory.sh (reported line 233)May include surrounding context.

sh
# Schedule
        if [ -f "$BASE_DIR/schedules/${SLUG}.json" ]; then
            rm -f "$BASE_DIR/schedules/${SLUG}.json"
            echo "  Removed: schedules/${SLUG}.json"
            removed=$((removed + 1))
        fi

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/data-inventory.sh (reported line 240)May include surrounding context.

sh
# Approval
        if [ -f "$BASE_DIR/approvals/${SLUG}.json" ]; then
            rm -f "$BASE_DIR/approvals/${SLUG}.json"
            echo "  Removed: approvals/${SLUG}.json"
            removed=$((removed + 1))
        fi

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/data-inventory.sh (reported line 247)May include surrounding context.

sh
# Session
        if [ -d "$BASE_DIR/sessions/${SLUG}" ]; then
            rm -rf "$BASE_DIR/sessions/${SLUG}"
            echo "  Removed: sessions/${SLUG}/"
            removed=$((removed + 1))
        fi

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/data-inventory.sh (reported line 254)May include surrounding context.

sh
# Runs
        if [ -d "$BASE_DIR/runs/${SLUG}" ]; then
            rm -rf "$BASE_DIR/runs/${SLUG}"
            echo "  Removed: runs/${SLUG}/"
            removed=$((removed + 1))
        fi

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

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

md
CUSTOM_SCREENSHOT_DIR=""

BROWSER_TYPES="browser-navigate browser-click browser-fill browser-extract browser-screenshot browser-wait"
UNSAFE_PATTERNS="rm -rf /|mkfs|dd if=.*of=/dev|chmod -R 777 /|:(){ :|:& };:"
EXFIL_PATTERNS='\| *curl |\| *wget |> */dev/tcp|\| *nc |\| *netcat |> */dev/udp'
ENCODING_PATTERNS='base64|\\\\x[0-9a-fA-F]|\$\x27\\\\x|eval |exec |source /dev'
INTERPRETER_PATTERN='^(py[a-z]*[23]?|perl|ruby|node|php|lua)$'

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
100% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/execute-step.sh (reported line 17)May include surrounding context.

sh
CUSTOM_SCREENSHOT_DIR=""

BROWSER_TYPES="browser-navigate browser-click browser-fill browser-extract browser-screenshot browser-wait"
UNSAFE_PATTERNS="rm -rf /|mkfs|dd if=.*of=/dev|chmod -R 777 /|:(){ :|:& };:"
EXFIL_PATTERNS='\| *curl |\| *wget |> */dev/tcp|\| *nc |\| *netcat |> */dev/udp'
ENCODING_PATTERNS='base64|\\\\x[0-9a-fA-F]|\$\x27\\\\x|eval |exec |source /dev'
INTERPRETER_PATTERN='^(py[a-z]*[23]?|perl|ruby|node|php|lua)$'

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/execute-step.sh (reported line 17)May include surrounding context.

sh
CUSTOM_SCREENSHOT_DIR=""

BROWSER_TYPES="browser-navigate browser-click browser-fill browser-extract browser-screenshot browser-wait"
UNSAFE_PATTERNS="rm -rf /|mkfs|dd if=.*of=/dev|chmod -R 777 /|:(){ :|:& };:"
EXFIL_PATTERNS='\| *curl |\| *wget |> */dev/tcp|\| *nc |\| *netcat |> */dev/udp'
ENCODING_PATTERNS='base64|\\\\x[0-9a-fA-F]|\$\x27\\\\x|eval |exec |source /dev'
INTERPRETER_PATTERN='^(py[a-z]*[23]?|perl|ruby|node|php|lua)$'

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/session-guard.sh (reported line 157)May include surrounding context.

sh
# Remove chrome profile data but keep the .last-auth record
        if [ -d "$SESSION_DIR/chrome-profile" ]; then
            rm -rf "$SESSION_DIR/chrome-profile"
            echo "Browser profile cleared for '$WF_NAME'"
        fi

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/session-guard.sh (reported line 162)May include surrounding context.

sh
fi

        # Remove auth record too
        rm -f "$SESSION_DIR/.last-auth"
        echo "Session data cleaned up for '$WF_NAME'"
        ;;

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill advertises and enables powerful shell and network-driven automation but does not declare a concrete tool scope such as explicit permissions or an allowlist. In a workflow automation skill, that omission increases the chance of overbroad execution, confused-deputy behavior, and unsafe invocation because reviewers and runtime policy cannot easily constrain what tools the skill is meant to use.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The invocation language is extremely broad, covering generic automation, data processing, scraping, scheduling, and notifications. Broad matching criteria increase the chance the skill is auto-selected for requests beyond the user's intent, exposing shell, browser, network, and scheduling capabilities in contexts where a narrower skill should have been used.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
91% confidence
Finding

The skill explicitly allows subsequent scheduled runs to execute autonomously without approval. Because the skill can combine shell commands, network access, browser sessions, file access, and messaging, autonomous execution materially increases the blast radius if a workflow is misconfigured, tampered with, or socially engineered during initial approval.

Content

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

md
4. I show you the full plan with schedule and notification settings
5. You approve, edit, or reject
6. First run: I execute step by step with your approval
7. If scheduled: subsequent runs are autonomous — no approval needed
8. After each run, I message you the results on WhatsApp/Telegram/Slack
9. On any failure: I alert you immediately on your preferred channel

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
93% confidence
Finding

This is a repeated statement of autonomous execution after first approval. Even with integrity hashes and TTLs, unattended reruns of workflows that can access local files, network endpoints, and persisted browser sessions remain dangerous because legitimate approved plans can still exfiltrate data or perform unintended actions over time.

Content

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

md
### First run vs scheduled runs
- **First run** of any workflow: human approval per step (always)
- **Subsequent scheduled runs**: autonomous (no approval needed)
- You can switch any workflow back to "approval mode" anytime
- **Plan integrity**: When a plan is approved, its SHA-256 hash is recorded.
  Autonomous runs verify the hash before execution. If the plan file has

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

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

md
- Delete system files or recursive force-delete (rm -rf /)
- Format disks or overwrite block devices
- Escalate privileges without explicit intent
- Modify system configuration files

## Plan Format

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The documentation contradicts itself about whether audit logging and multi-channel escalation exist. In a high-privilege automation skill, inconsistent safety disclosures can cause reviewers or users to misunderstand what data is retained and what external notification paths may activate, which increases privacy and governance risk.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.