Back to skill

Security audit

Poe Connector

Security checks for vulnerabilities and agentic risk

Overview

The skill is a real Poe connector, but it needs Review because it automatically downloads model-supplied URLs and writes them locally without sufficient limits or validation.

Install only if you are comfortable sending prompts and explicitly attached files to Poe and downstream model providers. Do not attach secrets, private documents, or regulated data unless approved. Prefer running this in a constrained environment, pinning the openai dependency, and patching media download behavior to require explicit confirmation, trusted host allowlists, and strict size/content limits.

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
src/poe_media.py:32
Finding

Unrestricted Media URL Fetch Enables Server-Side Request Forgery and Resource Exhaustion

Content
View full analysis
bool: """Download *url* to *output_path*. Returns True on success.""" try: req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0 poe-connector/1.0"}) with urllib.request.urlopen(req, timeout=30) as resp: Path(output_path).write_bytes(resp.read()) return True except Exception as e: print(f"Warning: auto-download failed — {e}", file=sys.stderr) return False ``` ```python url_match = re.search(r"https?://\S+", content) if url_match: url = url_match.group(0).rstrip(")") if not output_path: ext = DEFAULT_EXTENSIONS.get(media_type, ".bin") output_path = str(Path.cwd() / f"poe_generated_{media_type}{ext}") if _auto_download(url, output_path, media_type): ``` ### Technical Analysis The media-generation response is treated as trusted content. The code extracts the first HTTP or HTTPS URL from that response and passes it directly to `urllib.request.urlopen()`. No validation is applied to: - The URL hostname or port. - The resolved destination address. - Loopback, private, link-local, multicast, or reserved IP ranges. - Redirect targets. - The expected Poe or media-CDN domain. - The response content type. - The response content length. Consequently, a malicious or manipulated upstream response could cause the Skill runtime to make requests to internal services such as loopback interfaces, private network hosts, or cloud metadata endpoints. Because `urllib` follows redirects by default, checking only the original URL would not be sufficient unless every redirect destination is also validated. The call to `resp.read()` reads the entire respo ...[truncated 2289 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unbounded Third-Party Dependency Version Creates Supply-Chain and Reproducibility Risk

Content
View full analysis
=1.0.0 ``` Related installation guidance in `README.md:46-48` and `examples/basic_usage.md:5-7` instructs users to install the dependency without a lockfile or integrity hashes: ```bash pip install openai ``` ### Technical Analysis The requirement accepts every `openai` release from version 1.0.0 onward, including future major versions. There is no upper bound, lockfile, exact version pin, or package hash. This does not demonstrate that the current `openai` package is malicious. However, it allows the effective installed code to change after the Skill has been reviewed. A future compromised, incompatible, or behaviorally changed release could be selected during installation without any modification to this repository. Python package installation may execute package build or installation logic with the privileges of the user running `pip`. Runtime imports also execute the installed package's Python initialization code. The absence of deterministic version and integrity controls therefore increases supply-chain exposure and makes audited behavior difficult to reproduce. ### Attack Path 1. A user follows the documented setup procedure and runs `pip install openai`, or installs from `requirements.txt`. 2. The package resolver selects the newest release satisfying `openai>=1.0.0`. 3. A future compromised or unexpectedly incompatible release remains eligible under this constraint. 4. Package installation or import-time code executes with the invoking user's privileges. 5. The compromised dependency could access data and resources available to the Skill process, including prompts, attachments, network access, and the Poe API credential passed to the client. This is a conditional supply-chain path rather than evidence of an active malicious dependency in the audited project. ...[truncated 611 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Rogue AgentSelf-Modification, Session Persistence
Findings (20)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

This mismatch indicates the skill may download remote media and write files locally despite being presented primarily as a bash-based Poe access helper. Undisclosed downloading and local file creation materially changes the risk profile because it introduces filesystem and content-handling exposure not obvious from the manifest text.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

This mismatch indicates the skill may download remote media and write files locally despite being presented primarily as a bash-based Poe access helper. Undisclosed downloading and local file creation materially changes the risk profile because it introduces filesystem and content-handling exposure not obvious from the manifest text.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

This mismatch indicates the skill may download remote media and write files locally despite being presented primarily as a bash-based Poe access helper. Undisclosed downloading and local file creation materially changes the risk profile because it introduces filesystem and content-handling exposure not obvious from the manifest text.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README encourages sending prompts and attached files to Poe's external API but does not explicitly warn that user content, documents, images, audio, or video will leave the local environment. In an agent skill context, this can cause accidental disclosure of sensitive or regulated data because operators may assume the tool is just a local connector rather than a third-party data transfer path.

Content

No source excerpt is available for this finding.

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

md
### 1. Get your Poe API key

Go to https://poe.com/api/keys and create an API key.

### 2. Configure the API key

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
85% confidence
Finding

The skill advertises executable behavior that can read/write local files and access the network, but it does not declare any explicit tool scope or permission boundary. That makes the effective capability set opaque to reviewers and increases the chance the skill will be invoked with broader access than users or operators expect.

Content

No source excerpt is available for this finding.

Shadow Command Trigger

Medium
Category
Trigger Abuse
Confidence
84% confidence
Finding

The trigger 'ask poe' overlaps with a common built-in command pattern and can shadow or hijack intended routing. In context, that can redirect user requests into an external-network skill unexpectedly, increasing the chance of unintentional data disclosure or execution through the wrong toolchain.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger list is broad and includes generic phrases like 'poe', 'use poe', and 'ask poe', which can cause unintended activation. In this skill's context, accidental activation is more dangerous because the skill can initiate network requests and potentially transmit prompts, attachments, or generated media through an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The examples encourage sending local files such as images and PDFs to Poe-hosted models, but they omit any warning that file contents will be transmitted to a third-party remote service. This can lead users to upload sensitive documents or personal media under the mistaken assumption that processing is local, especially because the skill is framed as a simple bash connector.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The wrapper dispatches user-provided prompts to Python tools that are clearly intended to interact with Poe.com, a remote third-party service, but it gives no notice that prompt contents may leave the local environment. This creates a real privacy and data-handling risk because users may assume a local skill execution path and unknowingly transmit sensitive data, especially given the skill description encourages use for arbitrary chat and media generation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The code automatically downloads any URL found in model output and writes the response bytes to a local file when no explicit output path is provided. Because the URL is taken from untrusted model-generated content, this creates a silent network fetch and disk write primitive that can be abused to save unexpected or malicious content, trigger requests to attacker-controlled infrastructure, or consume local resources without user consent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · src/poe_utils.py (reported line 21)May include surrounding context.

python
print("Error: openai package not installed. Run: pip install openai", file=sys.stderr)
    sys.exit(1)

POE_BASE_URL = "https://api.poe.com/v1"

MIME_MAP = {
    ".jpg": "image/jpeg",

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 · src/poe_utils.py (reported line 99)May include surrounding context.

python
def get_client() -> openai.OpenAI:
    """Create an OpenAI client configured for the Poe API."""
    api_key = _load_key_from_openclaw_json()
    if not api_key:
        print(

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The code automatically reads arbitrary local files, base64-encodes them, and prepares them for transmission to the remote Poe API without any disclosure or confirmation mechanism in this module. In a bash-tool skill that is explicitly designed to access an external model provider, this increases the risk of inadvertent exfiltration of sensitive local data if higher-level callers pass unsafe paths or if a user does not realize attachments leave the host.

Content

No source excerpt is available for this finding.

Context Window Stuffing

Medium
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Content

Scanner excerpt · src/poe_utils.py (reported line 151)May include surrounding context.

python
403: "Permission denied — this model or action is not allowed.",
        404: "Model not found — run poe_models.py --list to see available models.",
        408: "Request timed out — the model took too long to respond. Try again.",
        413: "Request too large — reduce the input size (tokens exceed context window).",
        429: "Rate limit hit (500 rpm). Retrying with backoff...",
        500: "Provider error — the upstream model had an issue. Try again shortly.",
        502: "Upstream error — the model backend is temporarily unavailable.",

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The README explicitly states that the skill reads the Poe API key from ~/.openclaw/openclaw.json at runtime and says 'No environment variable needed.' In the provided skill manifest context, however, the configured mechanism is an env entry for POE_API_KEY, so the documentation is in tension with the intended runtime behavior and could mislead users about how the skill actually obtains credentials.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The instruction says the agent 'MUST use the bash/shell tool' and forbids all other methods. While not a language/locale issue, this is the only plausible natural-language policy concern present and is operationally rigid; however, it does not clearly violate the stated SQP-3 examples unless your policy treats hardcoded execution-method mandates as policy constraints.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The line states 'Run these with the bash tool. Nothing else works,' which imposes a specific execution mode unconditionally. Under the policy criteria, forcing a specific language/tool choice without opt-in is a natural-language policy issue unless clearly justified as a region- or context-specific constraint.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency is specified as openai>=1.0.0 without an upper bound or exact pin, which allows future versions to be installed implicitly. This creates supply-chain and stability risk because a later release could introduce breaking changes or a compromised/transitively vulnerable package version into the skill environment.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
openai>=1.0.0

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The code accesses ~/.openclaw/openclaw.json and extracts POE_API_KEY, which is credential-related behavior covered by the warning requirement for code files. Although the function name and docstring indicate what it does, there is no broader user-facing disclosure or warning about credential access within the skill behavior.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.