Back to skill

Security audit

Idle Ping — Proactive Outreach System

Security checks for vulnerabilities and agentic risk

Overview

This skill is not clearly malicious, but it installs persistent proactive messaging jobs and has an unsafe installer pattern that should be reviewed before use.

Install only if you intentionally want an autonomous background outreach system. Review or patch install.sh before running it, prefer --dry-run or --no-cron first, set clear quiet hours and daily caps, use a Telegram target you control, leave external heartbeat URLs unset unless needed, and audit openclaw cron list after installation.

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

Error
Location
install.sh:39
Finding

Shell Command Injection Through Installer Configuration

Content
View full analysis
/dev/null)" fi ``` ```bash SEND_PROMPT="$(sed -e "s|{{WORKSPACE}}|$WS|g" -e "s|{{SESSIONS_JSON}}|$SESSIONS_JSON|g" "$SCRIPT_DIR/templates/send-job-prompt.txt")" SEND_CMD="openclaw cron add --name idle-ping-send --declaration-key idle-ping-send --at 2036-01-01T00:00:00Z --session isolated --timeout-seconds 600 --light-context --disabled --keep-after-run --announce --channel telegram --to '$TELEGRAM_ID' --message \"\$SEND_PROMPT\" --json" [ -n "$MODEL" ] && SEND_CMD="openclaw cron add --name idle-ping-send --declaration-key idle-ping-send --at 2036-01-01T00:00:00Z --session isolated --timeout-seconds 600 --light-context --disabled --model '$MODEL' --announce --channel telegram --to '$TELEGRAM_ID' --message \"\$SEND_PROMPT\" --json" if [ "$DRY" = "1" ]; then echo " [dry-run] $SEND_CMD" else SEND_OUT="$(eval "$SEND_CMD" 2>/dev/null)" fi ``` ```bash CRAWLER_CMD="openclaw cron add --name idle-ping-crawler --declaration-key idle-ping-crawler --cron '15 * * * *' --tz '${IDLE_PING_TZ:-Asia/Hong_Kong}' --command 'python3 $WS/scripts/semantic-patrol.py --mode rotation' --command-env 'IDLE_PING_WS=$WS' --no-deliver --json" if [ "$DRY" = "1" ]; then echo " [dry-ru ...[truncated 2606 chars]
Remediation
View remediation
/dev/null)" ``` 3. Apply the same array-based pattern to send, pause, heartbeat, watchdog, crawler, topic-factory, and deep-explore job creation. 4. Pass prompts as direct array elements, such as `--message "$SEND_PROMPT"`, rather than embedding variable references inside command strings. 5. Validate configurable values before use: - Require a numeric Telegram chat identifier where applicable. - Allow only supported schedule formats. - Validate timezone names against an approved format or installed timezone database. - Restrict model names to the syntax accepted by OpenClaw. - Reject workspace or session paths containing control characters. 6. Replace the `run` helper with a function that receives arguments separately: ```bash run() { if [ "$DRY" = "1" ]; then printf ' [dry-run]' printf ' %q' "$@" printf '\n' else "$@" fi } ``` 7. Add regression tests containing quotes, semicolons, command substitutions, newlines, and redirection operators in every configurable input. Tests should verify that these values are rejected or passed literally and never executed. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
templates/deep-explore-job-prompt.txt:3
Finding

Indirect Prompt Injection Exposure in Autonomous Deep-Exploration Job

Content
View full analysis
"` 紀律:呢個 job delivery=none——**唔好 send 任何嘢俾用戶**,最終回覆用 NO_REPLY。 ``` ### Technical Analysis The daily deep-exploration job instructs an autonomous agent to search and fetch arbitrary external pages, then grants the same workflow access to: - The workspace filesystem. - Persistent memory files. - The local share queue. - General command execution through the `exec` tool. External pages are attacker-controlled input and may contain text designed to impersonate higher-priority instructions. The prompt does not state that all fetched page content is untrusted data, does not prohibit following instructions embedded in fetched content, and does not constrain command execution to a fixed structured interface. This omission is notable because `templates/send-job-prompt.txt:36` explicitly labels X search results as untrusted and instructs the agent not to execute their instructions. Equivalent protection is absent from the deep-exploration workflow. The vulnerability is an indirect prompt-injection exposure rather than evidence that a malicious page is currently bundled with the project. Exploitability depends on the OpenClaw agent's tool permissions and its adherence to instructions found in external content. ### Attack Path 1. An att ...[truncated 1419 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (78)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the installed system also includes heartbeat/watchdog logging and optional external health notification, that is materially different from a simple outreach feature and broadens both persistence and data flow. In the context of autonomous cron jobs, undisclosed monitoring functions make the skill more dangerous because they can run continuously and communicate externally without clear user awareness.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

If the installed system also includes heartbeat/watchdog logging and optional external health notification, that is materially different from a simple outreach feature and broadens both persistence and data flow. In the context of autonomous cron jobs, undisclosed monitoring functions make the skill more dangerous because they can run continuously and communicate externally without clear user awareness.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

If the installed system also includes heartbeat/watchdog logging and optional external health notification, that is materially different from a simple outreach feature and broadens both persistence and data flow. In the context of autonomous cron jobs, undisclosed monitoring functions make the skill more dangerous because they can run continuously and communicate externally without clear user awareness.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

If the installed system also includes heartbeat/watchdog logging and optional external health notification, that is materially different from a simple outreach feature and broadens both persistence and data flow. In the context of autonomous cron jobs, undisclosed monitoring functions make the skill more dangerous because they can run continuously and communicate externally without clear user awareness.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

If the installed system also includes heartbeat/watchdog logging and optional external health notification, that is materially different from a simple outreach feature and broadens both persistence and data flow. In the context of autonomous cron jobs, undisclosed monitoring functions make the skill more dangerous because they can run continuously and communicate externally without clear user awareness.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

If the installed system also includes heartbeat/watchdog logging and optional external health notification, that is materially different from a simple outreach feature and broadens both persistence and data flow. In the context of autonomous cron jobs, undisclosed monitoring functions make the skill more dangerous because they can run continuously and communicate externally without clear user awareness.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill does not clearly warn users that installation creates multiple autonomous cron jobs for crawling, exploration, gating, and outbound delivery. This is dangerous because it introduces persistence, recurring execution, and possible network activity after the initial interaction, which materially changes the trust and risk profile.

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

md
- `install.sh` — 一鍵安裝(建立 cron jobs + 複製 scripts + 設定 env)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
- `scripts/` — `idle-ping-gate.sh`(骰仔門神)、`semantic-patrol.py`(主題探索)、`share-queue.py`(倉)、`topic-factory.py`(主題工廠)、`system-log.sh`、`watchdog.sh`

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill is explicitly designed to send unsolicited outbound messages after idle periods, but the introductory description frames this as friendly behavior without a prominent warning about autonomous outreach. In an agent skill, that can normalize non-consensual contact and lead to spammy, privacy-sensitive, or policy-violating deployments if installed without clear user opt-in.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README promises that proactive deliveries are isolated from the main conversation thread, but elsewhere describes the send and pause flows as normal agent turns that announce into the chat. That mismatch can mislead operators about how messages affect user context, audit trails, and conversation continuity, creating a deceptive-consent and unexpected-behavior risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The default IDLE_PING_PAUSE_STYLES values are written in Chinese and will shape generated pause notices in that language or cultural style unless changed manually. This is a language/locale policy issue because the skill defaults to a specific language without an explicit user opt-in or language selection step.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill declares installation and automation behavior that clearly implies shell execution, filesystem writes, environment-variable use, and network access, yet it does not declare any tool scope or permissions. This creates a transparency and consent gap: a user or host system may authorize the skill without understanding that it will install cron jobs, write runtime state, and perform outbound crawling or messaging.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The activation conditions are broad enough to trigger on generic requests for the AI to proactively contact the user, which can lead to autonomous installation of recurring cron-driven behavior without a sufficiently specific request. In this context, overbroad activation is dangerous because the skill establishes persistence, outbound crawling, and unsolicited messaging.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The installer refuses to proceed unless TELEGRAM_ID is set when cron jobs are enabled, and later configures announcement delivery to Telegram. That introduces an external messaging channel capable of transmitting generated content and operational signals off-host, which is sensitive in a proactive autonomous skill and is not strictly necessary for local idle detection.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script configures outbound Telegram announcements using a user-supplied chat ID but does not provide a clear user-facing disclosure of data transmission, retention, or the nature of messages sent. In a system that schedules autonomous agent turns and notifications, this can leak content, metadata, and behavioral patterns to an external platform without informed consent.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The installer sets up far more than simple idle outreach: it provisions heartbeat/watchdog monitoring plus autonomous crawler, topic-factory, and deep-explore jobs that can generate and queue content without a direct user trigger. In this skill context, that scope expansion materially increases persistence, autonomy, and the amount of background activity, making the system more dangerous than the advertised purpose suggests.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The file’s human-facing comments and operational description are written exclusively in Cantonese/Traditional Chinese, with no indication of language choice, opt-in, or region-specific justification. This matches the policy category for language/locale constraints expressed in natural language.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The docstring states this is only the collection layer, but the implementation also performs downstream queue writes and workflow advancement. That mismatch is security-relevant because it can mislead reviewers or orchestrators into granting broader autonomy than intended, especially in a proactive outreach system.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file's natural-language descriptions and generated prompts are written in Chinese/Cantonese and the script prints user-visible status text in that language throughout, with no opt-in or fallback for other locales. This effectively forces a language choice on users and agents, which matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/semantic-patrol.py (reported line 306)May include surrounding context.

python
except Exception as e:
        print(f"[semantic] reddit urllib 失敗({e}),試 curl")
        try:
            out = subprocess.run(
                ["curl", "-s", "-A", "Mozilla/5.0 (X11; Linux x86_64)", "--max-time", "15", url],
                capture_output=True, text=True, timeout=20)
            data = out.stdout

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/semantic-patrol.py (reported line 364)May include surrounding context.

python
except Exception as e:
        print(f"[semantic] reddit urllib 失敗({e}),試 curl")
        try:
            out = subprocess.run(
                ["curl", "-s", "-A", "Mozilla/5.0 (X11; Linux x86_64)", "--max-time", "15", url],
                capture_output=True, text=True, timeout=20)
            data = out.stdout

Tainted flow: 'CHANNELS_FILE' from os.environ.get (line 98, credential/environment) → open (file write)

Medium
Category
Data Flow
Confidence
65% confidence
Finding

Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Content

Scanner excerpt · scripts/semantic-patrol.py (reported line 412)May include surrounding context.

python
mix = random.choice(rest)
    last.append(main)
    cfg["lastChannels"] = last[-6:]
    with open(CHANNELS_FILE, "w") as f:
        json.dump(cfg, f, ensure_ascii=False, indent=2)
    return main, mix

Tainted flow: 'STATE' from os.environ.get (line 26, credential/environment) → open (file write)

Medium
Category
Data Flow
Confidence
65% confidence
Finding

Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Content

Scanner excerpt · scripts/semantic-patrol.py (reported line 433)May include surrounding context.

python
print("OVERALL=請用 x_search tool 搜 X(query 用 TOPIC),自己整理 3-5 條有趣 post")
        state["lastSemanticPatrol"] = now_iso
        state["lastChannel"] = "xsearch"
        with open(STATE, "w") as f:
            json.dump(state, f, ensure_ascii=False, indent=2)
        return

Tainted flow: 'STATE' from os.environ.get (line 26, credential/environment) → open (file write)

Medium
Category
Data Flow
Confidence
65% confidence
Finding

Data from a source is assigned to a variable that is later passed to a sink, creating a variable-mediated taint flow.

Content

Scanner excerpt · scripts/semantic-patrol.py (reported line 475)May include surrounding context.

python
print("OVERALL=請用 x_search tool 搜 X(query 用 TOPIC),自己整理 3-5 條有趣 post")
        state["lastSemanticPatrol"] = now_iso
        state["lastChannel"] = "xsearch"
        with open(STATE, "w") as f:
            json.dump(state, f, ensure_ascii=False, indent=2)
        return

Static analysis

No suspicious patterns detected.