T03 · Remote Payload Retrieval and Execution
- Location
SKILL.md:53- Finding
Remote Installer Is Downloaded and Executed Without Integrity Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill mostly matches its content-generation purpose, but it needs Review because it can fetch arbitrary URLs, write generated files from user-controlled names, and includes a Reddit prompt designed to make AI-written content look like organic human testimony.
Install only after reviewing the Reddit agent and disabling or rewriting it for transparent, fact-backed drafts. Run URL extraction in a sandbox with restricted network access, avoid internal or sensitive URLs, use scoped API keys, prefer verified package installation with a lockfile, and validate brand and recipe names before allowing writes.
SKILL.md:53Remote Installer Is Downloaded and Executed Without Integrity Verification
scripts/extractors/extract.py:17Arbitrary Source URLs Permit Server-Side Request Forgery and Local-Network Access
SKILL.md:328User-Controlled Recipe and Brand Names Can Escape the Declared Project Directory
scripts/extractors/extract.py:20Chromium Sandbox Is Disabled While Rendering Untrusted Pages
scripts/extractors/extract.py:88Downloaded PDF Files Are Left Behind in Temporary Storage
pyproject.toml:6Unpinned Dependencies Make Installations Non-Reproducible
agents/reddit-human.md:3Reddit Agent Encourages Fabricated Human-Like Personal Testimony
The declared description focuses on transforming content into publish-ready marketing assets and discovering/generating topics and images. This code does not perform content generation at all; its primary purpose is ingestion/extraction of source text from various online resources. While extraction could be a supporting step in a larger content pipeline, the supplied chunk itself implements undeclared scraping/extraction capabilities, including browser-based retrieval with bot-evasion measures, PDF downloading, and API-based GitHub retrieval. It also lacks the core declared behaviors: no Exa integration, no fal.ai calls, no social-post generation, no infographic/diagram creation, and no content recipe logic. Therefore the code chunk is materially mismatched with the declared purpose.
The declared description focuses on generating publish-ready marketing/social content, trend discovery, and image creation. The actual code does none of that. Instead, it tests a content/source extraction pipeline that fetches and classifies URLs and validates returned JSON. This is a materially different primary purpose from the declared skill behavior. While extraction could hypothetically support a larger content workflow, this specific code chunk is centered on extractor testing and source parsing, which is not accurately represented by the declared description.
The declared description focuses on runtime content creation and topic discovery capabilities, but the provided code chunk does not implement any of those behaviors. Instead, it performs offline validation/testing of recipe configuration files and agent file references. While recipe validation could be a supporting development detail in a larger content-generation system, this chunk’s actual primary purpose is test/schema enforcement rather than generating content, discovering topics, or creating images. Therefore, the supplied code does not accurately represent the declared end-user functionality.
This task explicitly plans for the agent/skill to author or rewrite its own SKILL.md, which is the instruction set governing future behavior. Self-modification of the skill definition is dangerous because it can let untrusted content, prompt injection from sources, or erroneous generations persistently alter agent behavior, expand capabilities, or weaken safety constraints. In a content-generation skill that ingests external web/PDF/social sources, this context makes the issue more dangerous because adversarial source material could influence durable instruction changes.
- **Effort:** S
- **Blocked by:** Recipe YAML schema.
### Write SKILL.md (core skill definition)
- **What:** Write the OpenClaw SKILL.md that teaches the agent the full Content Claw pipeline: recipe execution, brand graph wizard, recipe listing, error handling, all user commands.
- **Why:** This IS the product. The SKILL.md is the instruction set that makes the OpenClaw agent a content engine.
- **Effort:** M
This agent is materially out of scope for the declared skill purpose of creating publish-ready branded assets: it is optimized for covert Reddit participation disguised as an ordinary user. That mismatch increases risk because it suggests the capability is meant to bypass governance and use a benign manifest as cover for undisclosed social manipulation.
The skill explicitly instructs the model to generate Reddit content that appears to have been written by a real person, which is deceptive impersonation rather than transparent assistance. In the context of a content-generation skill, this enables covert influence, astroturfing, and evasion of platform or user disclosure expectations.
The line 'reads like it was typed by a real person' is a direct instruction to impersonate a human author and conceal AI involvement. This is dangerous because it facilitates deceptive communication at scale, undermines trust, and can be used for undisclosed marketing, persuasion, or manipulation in public forums.
The repeated stylistic directives—intentional typos, meandering details, inconsistent capitalization, and other 'humanizing' artifacts—are deliberate deception techniques designed to evade detection as AI-generated or coordinated content. In a Reddit-focused agent, this materially increases the likelihood of covert influence operations and policy evasion.
The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
"""Scoped .env loader for Content Claw. Only loads declared keys."""
import os
from pathlib import Path
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
"""Scoped .env loader for Content Claw. Only loads declared keys."""
import os
from pathlib import Path
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
"""Scoped .env loader for Content Claw. Only loads declared keys."""
import os
from pathlib import Path
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
"""Scoped .env loader for Content Claw. Only loads declared keys."""
import os
from pathlib import Path
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
"""Scoped .env loader for Content Claw. Only loads declared keys."""
import os
from pathlib import Path
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
"""Scoped .env loader for Content Claw. Only loads declared keys."""
import os
from pathlib import Path
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
"""Scoped .env loader for Content Claw. Only loads declared keys."""
import os
from pathlib import Path
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def load_env(extra_keys: set[str] | None = None):
"""Load only allowed keys from .env into process environment."""
allowed = ALLOWED_KEYS | (extra_keys or set())
env_path = Path(__file__).parent.parent / ".env"
if not env_path.exists():
return
for line in env_path.read_text().splitlines():
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def load_env(extra_keys: set[str] | None = None):
"""Load only allowed keys from .env into process environment."""
allowed = ALLOWED_KEYS | (extra_keys or set())
env_path = Path(__file__).parent.parent / ".env"
if not env_path.exists():
return
for line in env_path.read_text().splitlines():
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
def load_env(extra_keys: set[str] | None = None):
"""Load only allowed keys from .env into process environment."""
allowed = ALLOWED_KEYS | (extra_keys or set())
env_path = Path(__file__).parent.parent / ".env"
if not env_path.exists():
return
for line in env_path.read_text().splitlines():
This extractor performs broad outbound network access to arbitrary user-supplied URLs via Playwright and httpx, but the capability is not declared or constrained. In an agent skill context, undeclared network access is risky because it can be used for SSRF-style access to internal resources, metadata endpoints, or unintended third-party transmission without clear user awareness.
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.
f"\n\n{content_description}"
)
return prompt
FAL_MODELS = {
The trigger phrases are broad and overlap with ordinary user requests like 'generate content' or 'make a post from this.' In agent ecosystems with automatic skill routing, that can cause unintended invocation of a skill that performs external fetches, browser automation, file writes, and API-backed actions, expanding the attack surface without deliberate user intent.
The skill is explicitly designed to persist specs, generated content, metadata, topics, and brand graphs across runs using Write/Edit permissions. Persistent storage is not inherently malicious, but it does create privacy and integrity risks if sensitive source material, URLs, or derived metadata are retained longer than the user expects.
allowed-tools:
- Bash
- Read
- Write
- Edit
- Glob
- Grep
The skill claims it only accesses files within BASE_DIR, but instructs resolution of BASE_DIR by reading symlink targets under the user's home directory. Even limited metadata access outside the declared boundary weakens the trust model and can expose filesystem layout or resolve to an unexpected target if the symlink is tampered with. In a security-sensitive agent environment, boundary contradictions are dangerous because users may rely on the narrower scope guarantee.
Automatically running topic discovery after brand creation initiates external-network activity and data processing without a separate confirmation step. Because this uses Exa and brand-derived inputs, it can transmit user-provided business context externally and create unexpected side effects, especially if the user only intended to save configuration.
### Auto-discovery during brand creation
After completing the brand graph wizard (all 6 questions answered and files saved), automatically run topic discovery:
1. Tell the user: "Brand graph saved. Now discovering trending topics for <brand-name>..."
2. Run the topic discovery script with the new brand directory
No suspicious patterns detected.