Back to skill

Security audit

Pindou Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its bead-pattern purpose, but it defaults to sending images, prompts, and API credentials to a third-party relay and recommends storing API keys in source files.

Review this before installing. Use it only if you are comfortable with photos, prompts, masks, and API credentials being sent to api.bianxie.ai by default. Prefer environment variables or a secret manager, avoid putting real keys in source files, switch to an endpoint you trust, use a virtual environment with pinned dependencies, and do not process sensitive personal or copyrighted images without clear consent.

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

Error
Location
scripts/generate.py:18
Finding

API Credentials and User Content Are Sent to a Third-Party Relay by Default

Content
View full analysis
str: if cli_key: return cli_key for var in ("OPENAI_API_KEY", "BIANXIE_API_KEY", "IMAGE_API_KEY"): v = os.environ.get(var) if v: return v raise SystemExit( "[edit] no API key. Pass --api-key, or export OPENAI_API_KEY / " "BIANXIE_API_KEY / IMAGE_API_KEY." ) ``` ```python ap.add_argument("--api-key", default=None, help="API key; falls back to OPENAI_API_KEY / " "BIANXIE_API_KEY / IMAGE_API_KEY env vars") ap.add_argument("--base-url", default=os.environ.get("OPENAI_BASE_URL", DEFAULT_BASE_URL), help=f"OpenAI-compatible base url (default {DEFAULT_BASE_URL}, " "or $OPENAI_BASE_URL)") ``` ```python api_key = resolve_api_key(args.api_key) client = OpenAI(api_key=api_key, base_url=args.base_url) ``` ```python files = [open(img_path, "rb")] mask_fh = open(args.mask, "rb") if args.mask else None try: kwargs = dict( model=args.model, image=files, prompt=args.prompt, size=args.size, n=args.n, quality=args.quality, response_format="b64_json", ) if args.background: kwargs["background"] = args.background if mask_fh is not None: kwargs["mask"] = mask_fh resp = client.images.edit(**kwargs) finally: for f in files: ...[truncated 3046 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:20
Finding

Runtime Dependencies Are Installed Without Exact Versions or Integrity Hashes

Content
View full analysis
Remediation
View remediation
opencv-python-headless== numpy== scipy== scikit-image== pandas== pillow== cairosvg== ``` 2. Generate and verify cryptographic hashes for every package and transitive dependency. Install with: ```bash pip install --require-hashes -r requirements.txt ``` 3. Separate required and optional dependencies. For example, list `cairosvg` as an optional rendering dependency if PNG output can be skipped without it. 4. Install dependencies in a dedicated virtual environment or sandbox rather than the global Python environment. 5. Use a trusted package index over TLS and prevent unreviewed fallback indexes or dependency-confusion sources. 6. Add automated dependency auditing, such as vulnerability scanning and periodic lock-file update reviews. 7. Test and review dependency updates before changing pinned versions. Do not automatically adopt newest releases in production workflows. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (30)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

声明描述的是一个面向拼豆图纸制作的专用流程型工具,核心产出应是像素化后的网格图、颜色统计、色号以及采购清单。而代码没有任何像素化、网格化、调色板量化、颜色统计、清单生成或打印图纸相关逻辑。相反,它只是把输入图片和编辑提示词发送到 OpenAI 兼容的 images.edit 接口,返回并保存编辑后的图像。这属于与声明主目的显著不同的能力;其主要功能是通用图像编辑,而不是拼豆图纸生成。因此应判定为明显不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description centers on transforming a user's photo into a Perler/bead pattern, including style discussion, pixel-art conversion, extraction of color regions, and production of a printable grid with color IDs and a purchasing list. The supplied code does none of that. It simply takes a text prompt, calls an OpenAI-compatible image generation endpoint, decodes base64 image data, and saves PNG files. There is no image input handling, no photo processing, no pattern/grid logic, no palette analysis, and no bill-of-materials generation. This is a clear primary-purpose mismatch, not just an implementation detail difference.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是核心生产流程型技能,面向用户把照片转成拼豆图纸并产出相关物料;而提供的代码仅是 README 展示用的辅助脚本。它读取三张输入图片,绘制标题、箭头、说明文字,合成一张三面板预览图并保存。虽然文案中提到“参考图 -> AI 像素图 -> 拼豆图纸”的流程,但代码并未执行这些步骤,只是可视化已经生成好的结果。因此其主要用途与声明的主要用途存在实质性不一致,应判定为 mismatch。

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script's actual behavior is a generic text-to-image generator that sends prompts to a third-party image API, which materially differs from the declared skill purpose of converting a user-provided photo into a perler/bead pattern. This kind of capability mismatch is dangerous because it can mislead users and reviewers about what data is processed and where it is sent, undermining consent, trust, and security review assumptions.

Content

No source excerpt is available for this finding.

External Model or Provider Selection

High
Category
Excessive Agency
Confidence
90% confidence
Finding

Skill selects an external model or provider that may use a different account or billing plan than the operator expects. Undisclosed model switches can cause unexpected cost or quota consumption.

Content

Scanner excerpt · scripts/generate.py (reported line 22)May include surrounding context.

python
BASE_URL = "https://api.bianxie.ai/v1"
# bianxie: gpt-image-2 调用方式与 gpt-image-1 完全一致 (官方教程
# https://bianxieai.com/how-to-use-gpt-image-1.html), 只是模型名不同。
# 想退回到 -1 试对比, --model gpt-image-1。
DEFAULT_MODEL = "gpt-image-2"
OUT_DIR = Path(__file__).parent / "outputs"

Prompt Exfiltration via Tool

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains patterns that exfiltrate system prompts or internal instructions via tool calls (file writes, network requests, logging).

Content

Scanner excerpt · scripts/spec_to_prompt.py (reported line 111)May include surrounding context.

python
ap = argparse.ArgumentParser()
    ap.add_argument("spec", help="path to spec.json")
    ap.add_argument("-o", "--output", default=None,
                    help="write prompt to file; default is print to stdout")
    args = ap.parse_args()

    spec = json.loads(Path(args.spec).read_text(encoding="utf-8"))

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The pipeline description says photos/text are sent to gpt-image-2, but the README does not present a clear privacy warning or explicit consent language near user-facing usage instructions. Because this skill processes user-provided images and prompts, omission of disclosure can lead to unintentional transmission of sensitive personal or copyrighted content to external services.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The README explicitly tells users to place API credentials directly in source files and to use a third-party proxy endpoint for model access. Hardcoded secrets are easily leaked through screenshots, commits, backups, or support bundles, and routing user images/prompts through an intermediary materially increases credential exposure and data disclosure risk.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
96% confidence
Finding

The README directs traffic and credentials to https://api.bianxie.ai/v1, an external intermediary unrelated to the local bead-pattern functionality itself. Sending user photos, prompts, and API credentials through a proxy expands the trust boundary and can expose sensitive content or tokens to a service the user may not realize they are trusting.

Content

Scanner excerpt · README.md (reported line 65)May include surrounding context.

python
API_KEY = "xxx"                              # 把 xxx 换成你的真实 key
BASE_URL = "https://api.bianxie.ai/v1"       # 默认走 bianxie 中转,可自行替换
DEFAULT_MODEL = "gpt-image-2"                # bianxie 的 gpt-image-2,与 gpt-image-1 调用方式一致

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README says the skill triggers when the user says "帮我把这张照片做成拼豆图纸" directly in Claude Code. This invocation description provides only a single natural-language example and no exclusion conditions or trigger constraints, making activation scope unclear and potentially overlapping with ordinary image-editing requests.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill clearly expects file read/write and environment or secret usage, yet declares no explicit permissions or allowed-tools scope. In an agent setting, this can cause overbroad execution authority, making it easier for the skill to access local files or secrets beyond what is necessary for generating bead patterns.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The invocation description includes broad phrases like "像素图", "网格图", and "用豆子拼" alongside a general "用户给一张照片想做成…时使用" condition. These terms can plausibly match ordinary requests for pixel-art or grid-image conversion, without clearly limiting activation to this specific perler-bead pattern workflow or giving exclusion examples.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

Transmission to the official OpenAI API is still an external data transfer and therefore a genuine privacy/security consideration for user images and prompts. Although less suspicious than the third-party relay, the skill should still treat it as sensitive exfiltration of potentially personal content and govern it with consent and least-privilege credential handling.

Content

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

pip install openai opencv-python-headless "numpy<2" scipy scikit-image pandas pillow

text

API key / endpoint 配置:`scripts/edit.py` 和 `scripts/generate.py` 顶部的 `API_KEY` 和 `BASE_URL` 直接写在文件里,默认走 `https://api.bianxie.ai/v1`(bianxie 中转的 gpt-image-2)。换 OpenAI 官方就改 `BASE_URL = "https://api.openai.com/v1"`、`DEFAULT_MODEL = "gpt-image-1"`。

工作目录约定: 把当前会话的产物都丢进 `outputs/<run_name>/` 一个目录里(spec、prompt、ai_pixel、raw.svg、grid.json、pattern.png 一起)。`<run_name>` 用语义+模型 tag,别只用时间戳。

External Transmission

Medium
Category
Data Exfiltration
Confidence
89% confidence
Finding

Transmission to the official OpenAI API is still an external data transfer and therefore a genuine privacy/security consideration for user images and prompts. Although less suspicious than the third-party relay, the skill should still treat it as sensitive exfiltration of potentially personal content and govern it with consent and least-privilege credential handling.

Content

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

pip install openai opencv-python-headless "numpy<2" scipy scikit-image pandas pillow

text

API key / endpoint 配置:`scripts/edit.py` 和 `scripts/generate.py` 顶部的 `API_KEY` 和 `BASE_URL` 直接写在文件里,默认走 `https://api.bianxie.ai/v1`(bianxie 中转的 gpt-image-2)。换 OpenAI 官方就改 `BASE_URL = "https://api.openai.com/v1"`、`DEFAULT_MODEL = "gpt-image-1"`。

工作目录约定: 把当前会话的产物都丢进 `outputs/<run_name>/` 一个目录里(spec、prompt、ai_pixel、raw.svg、grid.json、pattern.png 一起)。`<run_name>` 用语义+模型 tag,别只用时间戳。

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file hard-codes an external image-edit API endpoint and model that are not aligned with the skill's stated purpose of generating bead/perler patterns from user images. This expands the skill from deterministic pattern generation into arbitrary remote image transformation, which can transmit user-supplied images to third parties and materially changes the data-handling and trust model.

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 · README.md (reported line 69)May include surrounding context.

md
from openai import OpenAI

# Default endpoint targets bianxie's OpenAI-compatible relay (gpt-image-2).
# Switch to https://api.openai.com/v1 + gpt-image-1 for the official API.
DEFAULT_BASE_URL = "https://api.bianxie.ai/v1"
DEFAULT_MODEL = "gpt-image-2"
OUT_DIR = Path(__file__).parent / "outputs"

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 · scripts/edit.py (reported line 21)May include surrounding context.

python
from openai import OpenAI

# Default endpoint targets bianxie's OpenAI-compatible relay (gpt-image-2).
# Switch to https://api.openai.com/v1 + gpt-image-1 for the official API.
DEFAULT_BASE_URL = "https://api.bianxie.ai/v1"
DEFAULT_MODEL = "gpt-image-2"
OUT_DIR = Path(__file__).parent / "outputs"

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This line sets a default external base URL to a third-party relay, causing user images and prompts to be sent off-box unless overridden. In a skill advertised for bead-pattern generation, defaulting to remote third-party image editing is more dangerous because users may not expect their source photos to leave the environment or be processed by an unrelated service.

Content

Scanner excerpt · scripts/edit.py (reported line 22)May include surrounding context.

python
# Default endpoint targets bianxie's OpenAI-compatible relay (gpt-image-2).
# Switch to https://api.openai.com/v1 + gpt-image-1 for the official API.
DEFAULT_BASE_URL = "https://api.bianxie.ai/v1"
DEFAULT_MODEL = "gpt-image-2"
OUT_DIR = Path(__file__).parent / "outputs"

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The code accepts an arbitrary prompt, optional mask, configurable base URL, and sends the user's image to a remote service for unrestricted image editing. In the context of a bead-pattern generation skill, this is over-privileged functionality that could be used to exfiltrate sensitive images or perform unexpected transformations unrelated to the advertised task, increasing privacy and supply-chain risk.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The module docstring explicitly states 'text -> image,' contradicting the skill's documented photo-to-perler-pattern purpose. This discrepancy is a security-relevant integrity issue because it signals hidden or misrepresented functionality, making it easier for unsafe remote data processing or unauthorized capability expansion to evade review.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

A hardcoded API key in source code is a direct secret-management vulnerability because the credential can be leaked through source distribution, logs, backups, or repository history. Combined with remote API access, an exposed key can enable unauthorized use, billing abuse, and potential access to associated account resources.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
81% confidence
Finding

The script transmits user-supplied prompts to an external provider at api.bianxie.ai, creating a real data egress path. In this skill context, that is more dangerous because the manifest suggests a local photo-to-pattern utility, so users and reviewers may not expect third-party transmission at all.

Content

Scanner excerpt · scripts/generate.py (reported line 19)May include surrounding context.

python
from openai import OpenAI

API_KEY = "xxx"
BASE_URL = "https://api.bianxie.ai/v1"
# bianxie: gpt-image-2 调用方式与 gpt-image-1 完全一致 (官方教程
# https://bianxieai.com/how-to-use-gpt-image-1.html), 只是模型名不同。
# 想退回到 -1 试对比, --model gpt-image-1。

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The code invokes an external image-generation service even though the stated skill purpose does not justify remote text-prompt transmission for photo-to-pattern conversion. In this context, undisclosed external processing increases privacy and supply-chain risk because user inputs may be transmitted to a third party without necessity or expectation.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.