Back to skill

Security audit

妙言小智 (PicTech.cc) 专业级跨境电商图片抠图/白底图工具

Security checks for vulnerabilities and agentic risk

Overview

This image background-removal skill mostly matches its stated purpose, but it has review-worthy risks around arbitrary URL fetching, third-party image upload, credential guidance, and dependency hygiene.

Install only if you are comfortable sending selected images to PicTech/stableai for processing and exposing a VK API key to this skill. Avoid using sensitive photos or private business images unless you trust the service, do not paste API keys into chat, prefer a scoped config or environment secret, and avoid processing arbitrary URLs from untrusted users until URL validation and size limits are added.

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
index.js:75
Finding

Server-Side Request Forgery Through Unrestricted Remote Image URLs

Content
View full analysis
{ // Generate a unique temporary file path const tempFileName = `rmbg_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`; const tempPath = path.join(os.tmpdir(), tempFileName); // Download the image const response = await axios({ url, method: 'GET', responseType: 'arraybuffer', timeout: 30000 }); const buffer = Buffer.from(response.data); // Write the response to a temporary file await fsPromises.writeFile(tempPath, buffer); ``` ### Technical Analysis The Skill accepts a user-controlled string as a remote image URL and passes it directly to Axios. The only preliminary check is whether the input begins with `http`. There is no canonical URL validation, hostname allowlist, IP-address filtering, redirect validation, or restriction against loopback, link-local, private, and reserved network ranges. Consequently, the HTTP request originates from the machine running the Skill and inherits that machine's network reachability. This enables an attacker to make requests to resources that may not be accessible from the attacker's own network location. Axios can also follow redirects. Even if an initially supplied hostname resolves to a public address, it may redirect to an internal address unless every redirect destination is independently validated. DNS rebinding creates an additional bypass risk if validation and connection do not use a safely pinned resolution. The fetched bytes are ...[truncated 2088 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
utils.js:21
Finding

Unbounded Remote Response Buffering Enables Memory and Disk Exhaustion

Content
View full analysis
{ // Generate a unique temporary file path const tempFileName = `rmbg_${Date.now()}_${crypto.randomBytes(4).toString('hex')}`; const tempPath = path.join(os.tmpdir(), tempFileName); // Download the image const response = await axios({ url, method: 'GET', responseType: 'arraybuffer', timeout: 30000 }); const buffer = Buffer.from(response.data); // Write the response to a temporary file await fsPromises.writeFile(tempPath, buffer); // Attempt to obtain the file name from the URL let fileName = 'web_image.png'; ``` ```js // index.js:125-128 const stats = await fsPromises.stat(task.path); if (stats.size > MAX_SIZE) { throw new Error('File exceeds the 15 MB limit'); } ``` ### Technical Analysis The 15 MB size restriction is applied only to local files. Remote URL responses are requested with `responseType: 'arraybuffer'`, which causes Axios to buffer the complete response in process memory before returning control. The remote path does not configure `maxContentLength` or `maxBodyLength`, stream the response through a byte-counting limiter, validate `Content-Length`, or stop reading after 15 MB. The complete response is then copied into a `Buffer` and written to the system temporary directory. The request timeout does not provide an adequate size limit. A remote server can transmit a large body within the timeout, and multiple sequential invocations can repeatedly consume memory and disk space. The code also does not verify image MIME types or file signatures, so arbitrary response content is accepted. ### Attack Path 1. An attacker hosts or identifies an HTTP endpoint that returns a very large response b ...[truncated 1207 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
package.json:6
Finding

Unpinned Dependencies and Missing Lockfile Weaken Supply-Chain Integrity

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (20)

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The credential memory section directs the skill to automatically save a user's API key to a local configuration file and read it later without re-entry. This is especially dangerous in an agent skill because it creates persistent secret material that may be accessible to other local processes, other users on the machine, backups, or malicious prompts that induce the agent to reuse stored credentials.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
不要自己手写抠图逻辑。不要直接在回复中调用 RMBG API。应调用本 skill 目录下 `index.js` 的默认导出函数 `run(params)`。

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
不要自己手写抠图逻辑。不要直接在回复中调用 RMBG API。应调用本 skill 目录下 `index.js` 的默认导出函数 `run(params)`。

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
不要自己手写抠图逻辑。不要直接在回复中调用 RMBG API。应调用本 skill 目录下 `index.js` 的默认导出函数 `run(params)`。

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
不要自己手写抠图逻辑。不要直接在回复中调用 RMBG API。应调用本 skill 目录下 `index.js` 的默认导出函数 `run(params)`。

Ssd 3

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The README promotes 'persistent memory' and silent reuse of a credential by the agent, which normalizes long-lived credential retention beyond the immediate task. In an agent environment, automatic reuse of stored secrets expands the blast radius of prompt injection, local compromise, or unintended cross-task access to the API key.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The prompt example instructs users to paste their API key directly into chat, which risks exposing the secret in conversation logs, telemetry, screenshots, and model context. In agent systems, chat transcripts may be retained or accessible to other components, making this a direct credential-handling anti-pattern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README explicitly states that a user-provided API key will be stored locally for future reuse, but it does not clearly disclose the security implications, storage protections, rotation guidance, or consent model. Persisting credentials on disk without transparent warning increases the risk of credential theft from local compromise, shared machines, backups, or accidental file exposure.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding

The skill instructs use of environment-provided secrets (RMBG_VK) but does not declare any explicit tool scope, permissions, or allowed-tools boundaries. This creates an authorization ambiguity where the runtime may expose environment access more broadly than intended, increasing the risk of secret misuse or accidental credential access by the skill implementation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest description and all user-facing instructions are written entirely in Chinese, and the reply guidance assumes Chinese responses without offering any language or locale choice. This creates a language policy concern because the skill effectively constrains interaction to a specific language without explicit user opt-in or documented regional justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file's user-facing error messages and explanatory comments are written only in Chinese, with no indication that the user can choose another language. This creates a language-policy concern because the skill appears to assume a specific language/locale without documented opt-in or justification.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill sends user-provided image content to a third-party remote service (stableai.com.cn) using the provided API key, but the code contains no consent flow, disclosure, or configuration guard that makes this transfer explicit to the user at execution time. Because images may contain personal, proprietary, or sensitive business data, silent exfiltration to an external processor creates a real privacy and data-handling risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill description says it supports processing local files and network URLs via an external API service, but it does not warn users that image content and possibly related metadata may be transmitted off-device to pictech.cc for processing. This creates a real privacy and consent risk because users may submit sensitive product images, personal photos, or proprietary assets without understanding they are leaving the local environment.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

All user-facing instructions, examples, and prompts are presented only in Chinese, and the examples instruct users to invoke the skill in Chinese. This can amount to a language-policy issue when no opt-in, alternative language support, or explicit locale limitation is provided.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

The code saves downloaded output files to a batch directory on disk, but there is no visible confirmation prompt, print/log statement, or explanatory docstring/comment disclosing this file write behavior to the user. For a skill that modifies the local filesystem, some explicit notice is expected unless already clearly documented elsewhere.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

The dependency is specified with a caret range (^4.1.2), which permits automatic installation of newer minor/patch releases rather than a single reviewed version. This weakens supply-chain control and reproducibility, increasing the chance that a vulnerable or malicious upstream release is pulled into the skill without explicit review.

Content

Scanner excerpt · package.json (reported line 7)May include surrounding context.

json
"version": "1.0.0",
  "main": "index.js",
  "dependencies": {
    "@seald-io/nedb": "^4.1.2",
    "axios": "^1.15.2",
    "form-data": "^4.0.5"
  }

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
99% confidence
Finding

The axios dependency is not pinned to an exact version and instead uses a caret range (^1.15.2). In a skill that likely fetches remote images or APIs, allowing version drift increases supply-chain exposure and makes it harder to verify whether deployed builds include vulnerable releases.

Content

Scanner excerpt · package.json (reported line 8)May include surrounding context.

json
"main": "index.js",
  "dependencies": {
    "@seald-io/nedb": "^4.1.2",
    "axios": "^1.15.2",
    "form-data": "^4.0.5"
  }
}

Unverifiable Dependency: axios has 16 known advisory(ies) (CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
87% confidence
Finding

Axios has multiple known advisories, and because the manifest uses a non-exact version, it is not possible to verify from this file alone whether the installed release is affected. Given this skill's stated purpose of processing local/network images, axios is plausibly used for network retrieval, so unresolved axios flaws could increase exposure to SSRF, response tampering, or other client-side request risks depending on code usage.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

The form-data dependency is declared with a caret range (^4.0.5), so installations may resolve to different package contents over time. This is a supply-chain hygiene issue that can introduce vulnerable or unexpected code into an image-processing skill that may handle untrusted files and outbound multipart uploads.

Content

Scanner excerpt · package.json (reported line 9)May include surrounding context.

json
"dependencies": {
    "@seald-io/nedb": "^4.1.2",
    "axios": "^1.15.2",
    "form-data": "^4.0.5"
  }
}

Unverifiable Dependency: form-data has 2 known advisory(ies) (CVE-2025-7783 (form-data uses unsafe random function in form-data for choosing boundary); CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
83% confidence
Finding

Form-data has known advisories, and the unpinned manifest prevents verification of whether a vulnerable version is installed. In a skill that likely uploads images or constructs multipart requests, issues such as unsafe boundary generation or CRLF injection could become relevant if attacker-controlled fields or filenames are included in multipart bodies.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.