Back to skill

Security audit

DeckCraft

Security checks for vulnerabilities and agentic risk

Overview

DeckCraft is a coherent presentation-generation skill, but it includes under-scoped URL and WeChat importers that can fetch arbitrary or internal resources from the user's environment.

Review before installing. Use this skill only in a constrained workspace, avoid running its URL or WeChat importers on untrusted links, and block access to localhost, private networks, cloud metadata endpoints, and non-HTTP(S) schemes at the environment level. Prefer pinned dependencies in a virtual environment. The deck-generation and QA parts look purpose-aligned, but the remote import features need tighter controls before use in sensitive environments.

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

T09 · Insecure Skill Coding Practices

Error
Location
importers/url.py:17
Finding

Unrestricted URL Fetching Enables SSRF and Local Resource Access

Content
View full analysis
Optional[str]: """Try fetching via openclaw CLI's web_fetch.""" try: result = subprocess.run( ["openclaw", "web-fetch", url], capture_output=True, text=True, timeout=30, ) if result.returncode == 0 and result.stdout.strip(): return result.stdout.strip() except (FileNotFoundError, subprocess.TimeoutExpired): pass return None def _fetch_via_curl(url: str) -> Optional[str]: """Fetch raw HTML via curl.""" try: result = subprocess.run( ["curl", "-sL", "--max-time", "20", "-A", "Mozilla/5.0 (compatible; DeckCraft/6.0)", url], capture_output=True, text=True, timeout=25, ) if result.returncode == 0 and result.stdout.strip(): return result.stdout.strip() except (FileNotFoundError, subprocess.TimeoutExpired): pass return None ``` ### Technical Analysis The URL import command accepts an arbitrary user-controlled string and forwards it directly to `opencl ...[truncated 2585 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
importers/wechat.py:33
Finding

Bypassable WeChat Host Validation Enables Arbitrary Requests

Content
View full analysis
bool: """Check if URL is a WeChat article.""" return "mp.weixin.qq.com" in url ``` ```python # importers/wechat.py:38-54 def _fetch_wechat_html(url: str) -> Optional[str]: """Fetch WeChat article HTML with proper headers.""" try: result = subprocess.run( ["curl", "-sL", "--max-time", "30", "-A", WECHAT_UA, "-e", WECHAT_REFERER, "-H", "Accept: text/html,application/xhtml+xml", "-H", "Accept-Language: zh-CN,zh;q=0.9", url], capture_output=True, text=True, timeout=35, ) if result.returncode == 0 and result.stdout.strip(): return result.stdout.strip() except (FileNotFoundError, subprocess.TimeoutExpired): pass return None ``` ```python # importers/wechat.py:188-193 if not _is_wechat_url(url): raise ValueError( f"Not a WeChat article URL: {url}\n" "Expected URL containing 'mp.weixin.qq.com'" ) html = _fetch_wechat_html(url) ``` ### Technical Analysis The purported WeChat restriction is implemented as a substring search over the complete URL. It does not parse or compare the actual hostname. An attacker can therefore satisfy the check while directing curl to another destination. Examples of syntactically plausible bypasses include: - `https://attacker.example/?mp.weixin.qq.com` - `https://mp.weixin.qq.com.attacker.example/` - A URL where the trusted text appears in user information or a path. After this weak check, curl receives the complete attacker-controlled URL. The `-L` option also follows redirects without checking that subsequent destinations remain ...[truncated 1722 chars]
Remediation
View remediation
bool: try: parsed = urlsplit(url) except ValueError: return False return ( parsed.scheme == "https" and parsed.hostname is not None and parsed.hostname.rstrip(".").lower() == "mp.weixin.qq.com" and parsed.username is None and parsed.password is None ) ``` 2. If subdomains are required, use an explicit boundary-aware policy such as: ```python host == "mp.weixin.qq.com" or host.endswith(".mp.weixin.qq.com") ``` Only permit subdomains if they are documented and necessary. 3. Resolve the hostname and reject non-public IP address classes before connecting. 4. Do not follow redirects automatically. Inspect each `Location` value and repeat all scheme, hostname, and IP checks before following it. 5. Restrict curl to HTTPS if WeChat imports require HTTPS: ```text --proto =https --proto-redir =https ``` 6. Set a low redirect limit and a maximum response size. 7. Add regression tests for trusted text in the query, path, user information, and attacker-controlled suffixes, as well as redirect-to-private-address scenarios. ]]>

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Open-Ended Dependency Constraints Create Supply-Chain and Reproducibility Risk

Content
View full analysis
=0.6.21 lxml>=4.9.0 Pillow>=9.0.0 # Source importers (v5.3+) PyMuPDF>=1.23.0 # PDF parsing python-docx>=1.0.0 # DOCX parsing ``` ```markdown > **Required tools**: Read, Write, Bash > **Requires**: `pip install python-pptx lxml Pillow` > **Render QA**: LibreOffice Impress (soffice --headless) + poppler-utils (pdftoppm) ``` ```markdown ## Dependencies | Tool | Install | |------|---------| | python-pptx | `pip install python-pptx` | | lxml | `pip install lxml` | | Pillow | `pip install Pillow` | ``` ### Technical Analysis The dependency file uses open-ended minimum-version constraints. The Skill documentation also recommends installing packages without version constraints. No lock file or package hashes are supplied. As a result, two installations performed at different times may resolve to different package versions. Any future release satisfying the minimum constraint can be installed automatically, including a compromised release or a version with newly introduced vulnerabilities or incompatible behavior. This finding does not establish that any currently named package is malicious. The risk arises from the absence of reviewed exact versions and integrity controls. ### Attack Path 1. A user follows `SKILL.md` or runs `pip install -r requirements.txt`. 2. Pip resolves the latest available versions satisfying the open-ended constraints. 3. A future dependency release is compromised, malicious, vulnerable, or behaviorally incompatible. 4. Pip downloads and installs that release because no exact version or artifact hash prevents it. 5. Dependency installation o ...[truncated 831 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (57)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
87% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

Undisclosed fetching of arbitrary remote URLs and WeChat articles meaningfully increases risk because the skill becomes a networked ingestion utility, not just a local presentation generator. In agent environments, arbitrary remote content can contain prompt-injection text, sensitive links, or malformed data that influences downstream processing and broadens exposure beyond user expectations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The changelog explicitly advertises a WeChat importer that can 'bypass WeChat anti-scraping with custom UA + Referer' without any caution about authorization, terms-of-service, privacy, or legal boundaries. Even though this is documentation rather than executable code, it normalizes and enables misuse of the skill for unauthorized content acquisition, which is especially relevant because the project also includes URL auto-fetching features that lower the barrier to scraping.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The migration guide introduces an LLM-driven multi-role workflow (strategist_plan, execute_plan) but does not warn users that prompts, briefs, or source content may be sent to an external model provider or otherwise processed outside the local runtime. In a presentation-generation skill, users may reasonably pass confidential business briefs, internal documents, or customer data, so lack of disclosure can lead to unintended data exposure and unsafe adoption.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding

The skill explicitly requires Read, Write, and Bash capabilities, but it does not declare a formal tool scope such as allowed-tools or permissions. That creates an authorization ambiguity where an agent may grant broader file-system or shell access than users expect, increasing the blast radius if the skill is misused or prompt-injected through its inputs.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The Fast Track mode can be triggered by broad everyday words like 'quick', 'fast', or 'simple', which may unintentionally relax validation steps for normal user phrasing rather than explicit informed consent. In a skill that writes files and runs shell-based QA, ambiguous trigger logic can weaken safety and quality controls in ways users do not realize.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.