Back to skill

Security audit

a2f

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent Archive2Figure API integration, but users should treat PDF uploads and API credentials carefully.

Install only if you are comfortable sending selected PDFs, extracted character details, and generation prompts to the Wuji A2F API. Avoid uploading confidential, regulated, copyrighted, or personal documents unless you understand the provider's retention and privacy terms. Use the default trusted API endpoint, do not pass custom api_base values from untrusted sources, and install dependencies in an isolated environment without installing the unnecessary asyncio package.

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
a2f_example.py:28
Finding

Authentication Headers Can Be Forwarded to a Caller-Controlled API Origin

Content
View full analysis
Dict: """Extract features from PDF""" headers = get_headers(BASE_HEADERS) async with httpx.AsyncClient() as client: with open(pdf_path, "rb") as f: files = {"files[0]": (pdf_path, f, "application/pdf")} data = {"role": role, "loop_count": 2, "gen_method": "qwen", "openclaw": 1} response = await client.post(f"{self.api_base}/archiveData", data=data, files=files, headers=headers) return response.json() ``` ```python headers = get_headers(BASE_HEA ...[truncated 2558 chars]
Remediation
View remediation
str: parsed = urlsplit(api_base) port = parsed.port or 443 if parsed.username or parsed.password: raise ValueError("Credentials are not permitted in the API URL") if (parsed.scheme, parsed.hostname, port) not in ALLOWED_API_ORIGINS: raise ValueError("Untrusted API origin") return api_base.rstrip("/") ``` The validated origin should then be stored, and `get_headers()` should only be called for requests to that origin. ]]>

T08 · Insecure Dependencies

Note
Location
README.md:72
Finding

Documentation Instructs Users to Install an Unnecessary Third-Party asyncio Package

Content
View full analysis
Remediation
View remediation
" ``` 3. Define dependencies in `pyproject.toml` or a version-controlled requirements file rather than relying only on an inline command. 4. Pin dependencies to reviewed versions and use hashes for reproducible installations where practical. 5. Regularly scan locked dependencies for known vulnerabilities. 6. Recommend installation inside a dedicated virtual environment and discourage privileged `pip` execution. ]]>
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 (11)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The workflow instructs uploading PDFs to a remote service but does not prominently warn that document contents and derived character features are sent to an external API. Because PDFs may contain sensitive, copyrighted, or confidential material, this omission can lead to unintentional exfiltration of user data.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill performs outbound network actions to a third-party API but does not declare tool scope or permissions. This creates a transparency and policy-enforcement gap: an agent or user may invoke the skill without an explicit understanding that files and prompts will be transmitted off-platform.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The trigger phrases are broad enough to match ordinary image-generation or document-processing requests, which can cause the skill to activate in contexts where the user did not intend PDF upload to an external service. Misrouting routine requests into this skill increases the chance of unintended data disclosure and unexpected network use.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
78% confidence
Finding

The documentation hardcodes Chinese-language negative prompts and the examples consistently require Chinese prompt text, but it does not clearly state that the skill is intentionally limited to Chinese-only operation or offer an opt-in language choice. This can violate language/locale policy when a skill imposes a specific language without user selection.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The default negative prompt is entirely in Chinese, which imposes a specific language choice in the skill's behavior. The file does not provide any opt-in, locale selection, or justification that this skill is intentionally region- or language-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The default style_prompt is set to a Chinese string, which establishes a fixed language/locale behavior for generated prompts. Because no user choice or documented locale constraint is present, this conflicts with the policy against forcing a specific language without opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The negative prompt is fixed to Chinese text ("低质量, 模糊, 变形"), which imposes a specific language choice in the skill behavior. The file also defaults to Chinese style text elsewhere, and there is no user opt-in or alternative locale handling.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The default style value is hard-coded as Chinese text ("写实风格,真人风格"), which sets a language-specific behavior automatically. The file provides no mechanism for the user to choose or opt into this locale preference.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The example code reads a local PDF and uploads it to a remote third-party API endpoint without any explicit consent prompt, warning, or data-classification guidance. Because PDFs may contain sensitive personal, research, or copyrighted material, this creates a real privacy and data-handling risk, especially in a quick-start script that users may run unchanged.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The script hard-codes Chinese-language content in the input file path, role, prompt, and negative prompt strings, implying a fixed language/locale experience. There is no natural-language indication that users may choose another language or that the Chinese-only setup is intentionally region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README's example inputs and prompt templates use Chinese text such as "写实风格,真人风格" and names like "李清照" without indicating that this is merely illustrative or that other languages are supported. This can be interpreted as a language/locale constraint in the skill documentation, which falls under natural-language policy concerns when no user opt-in or choice is provided.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.