Back to skill

Security audit

Customer Logo Wall Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill has a legitimate logo-wall workflow, but it should be reviewed because its automatic web downloads and file writes are under-scoped and include unsafe overwrite paths.

Review before installing or running this skill on sensitive customer lists. Use copies of spreadsheets, avoid untrusted companies JSON, keep logo output in a dedicated directory, do not run it with elevated privileges, and be aware that customer names and optional official URLs may be sent to public search engines and websites.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/download_logos.js:172
Finding

Path Traversal Enables Arbitrary File Overwrite

Content
View full analysis
{ const protocol = url.startsWith('https') ? https : http; const file = fs.createWriteStream(dest); const req = protocol.get(url, { headers: { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36', 'Referer': 'https://image.baidu.com/', 'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8', }, timeout: 20000 }, (response) => { if ([301, 302].includes(response.statusCode)) { file.close(); fs.unlink(dest, () => {}); const loc = response.headers.location; if (loc && loc.startsWith('http')) return downloadFile(loc, dest).then(resolve).catch(reject); return reject(new Error('bad redirect')); } if (response.statusCode !== 200) { file.close(); fs.unlink(dest, () => {}); return reject(new Error('HTTP ' + response.statusCode)); } response.pipe(file); file.on('finish', () => { file.close(); const size = fs.statSync(dest).size; if (size < 1000) { fs.unlink(dest, () => {}); return reject(new Error(`File too small (${size}b)`)); } resolve(dest); }); }); req.on('error', (e) => { file.close(); fs.unlink(dest, () => {}); reject(e); }); req.on('timeout', () => { req.destroy(); file.close(); fs.unlink(dest, () => {}); reject(new Error('timeout')); }); }); } ``` ```javascript const destPath = path.join(outputDir, c.file); ``` The retry implementation contains the same i ...[truncated 2296 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/verify_logos.py:46
Finding

HTTPS Certificate and Hostname Verification Are Disabled

Content
View full analysis
1000: with open(dest, 'wb') as f: f.write(data) return True except Exception: pass ``` ### Technical Analysis Although `ssl.create_default_context()` initially enables secure defaults, the script explicitly disables hostname checks and sets the verification mode to `CERT_NONE`. As a result, HTTPS responses are accepted without establishing that the server certificate is trusted or belongs to the requested host. The received data is written to disk and subsequently processed by Pillow, OCR tooling, format converters, or `python-pptx`. The script also does not enforce a strict content type or bounded response size before reading the complete body. ### Attack Path 1. The user runs `verify_logos.py` with the `--retry` option and at least one logo fails verification. 2. The script extracts image URLs from search results and opens them using the insecure SSL context. 3. An attacker able to intercept or redirect network traffic presents an arbitrary certificate. 4. The connection succeeds because certificate-chain and hostname verification are disabled. 5. The attacker substitutes arbitrary response bytes exceeding the 1 KB minimum. 6. The response is stored as the company logo and later parsed or embedded by downstream components. ### Impact Assessment A network-position ...[truncated 510 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/download_logos.js:151
Finding

Chromium Sandbox Is Disabled While Loading Untrusted Websites

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (30)

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

The overall description promises Excel/customer-table handling and PPT generation, but the documented inputs and operations rely on JSON and local image directories plus undeclared network/OCR workflows. This discrepancy can cause agents to invoke the skill in situations involving sensitive customer data without understanding that data may be transformed, enriched from the internet, and written back locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The overall description promises Excel/customer-table handling and PPT generation, but the documented inputs and operations rely on JSON and local image directories plus undeclared network/OCR workflows. This discrepancy can cause agents to invoke the skill in situations involving sensitive customer data without understanding that data may be transformed, enriched from the internet, and written back locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The overall description promises Excel/customer-table handling and PPT generation, but the documented inputs and operations rely on JSON and local image directories plus undeclared network/OCR workflows. This discrepancy can cause agents to invoke the skill in situations involving sensitive customer data without understanding that data may be transformed, enriched from the internet, and written back locally.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The overall description promises Excel/customer-table handling and PPT generation, but the documented inputs and operations rely on JSON and local image directories plus undeclared network/OCR workflows. This discrepancy can cause agents to invoke the skill in situations involving sensitive customer data without understanding that data may be transformed, enriched from the internet, and written back locally.

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

md
$NODE_BIN scripts/download_logos.js --output <输出目录> --companies <公司列表JSON>

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
$NODE_BIN scripts/download_logos.js --output <输出目录> --companies <公司列表JSON>

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script disables TLS verification without prominently warning the user, creating hidden transport insecurity during remote downloads. Because the user-facing purpose is simple logo verification, this undisclosed weakening of security is particularly dangerous and misleading.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script exceeds the skill's stated Excel/logo-wall workflow by performing external image search and automatic re-downloads. This expansion introduces unnecessary network exposure, untrusted content ingestion, and file overwrites, making the skill materially more dangerous than its manifest suggests.

Content

No source excerpt is available for this finding.

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
60% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · scripts/verify_logos.py (reported line 181)May include surrounding context.

python
f"{name} {en} 品牌标志",
    ]

    env = os.environ.copy()
    env['AGENT_BROWSER_ENGINE'] = 'chrome'

    for query in queries:

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill invokes an external browser automation tool and downloads remote images from search results, which is unrelated to the minimal table-to-PPT purpose. In this context, the extra capability increases attack surface through browser automation, third-party content, and unexpected outbound network access.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill describes operations that require broad capabilities including filesystem writes, network access, environment-variable use, and shell execution, but it does not declare any tool scope or permission boundaries. This creates an overbroad and implicit trust model where an agent may perform sensitive actions without clear review or least-privilege constraints.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The invocation description says to use this skill when the user needs processing of customer data and PPT generation, while the workflow specifically searches for Chinese company names and adds a column labeled "公司中文名". This imposes a Chinese locale/output requirement without documenting user opt-in or a justified region-specific constraint.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly instructs overwriting the user's original Excel file by inserting a column and saving over the source, without a clear upfront warning or confirmation step. In the context of customer data processing, this can corrupt source records, destroy provenance, or unintentionally alter business-critical files.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This markdown file is written entirely in Chinese, which constitutes a language-specific constraint in natural-language instructions. The policy allows locale constraints only when the skill offers user choice or clearly documents a justified regional limitation, neither of which appears here.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · references/logo-verification.md (reported line 64)May include surrounding context.

pip install pytesseract pillow

Ubuntu/Debian

sudo apt-get install tesseract-ocr tesseract-ocr-chi-sim pip install pytesseract pillow

text

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The module docstring and CLI usage/help text are written in Chinese, and later user-facing status messages are also Chinese-only. This imposes a specific language on users without any opt-in, language selection, or documented region-specific justification, which matches the locale policy violation criteria.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

Including Playwright browser automation and raw HTTP/HTTPS download capability gives the skill broad third-party network access not inherent to simple spreadsheet-to-PPT generation. In this context, those capabilities materially expand the attack surface by enabling arbitrary browsing, remote content retrieval, and interaction with attacker-supplied URLs from input data.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script goes beyond local Excel-to-PPT processing by performing live web searches and downloading arbitrary remote images based on company names and optional URLs. This creates an external data-exfiltration and untrusted-content retrieval path: user/customer data is sent to third-party services, and attacker-controlled URLs or redirects can cause the tool to fetch unexpected content from the internet.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script sends company names and search queries to Baidu, Bing, and optionally official websites without any visible warning, approval step, or privacy notice. For customer lists, this may disclose sensitive business relationships or pipeline information to external services, making the skill more dangerous than its stated customer-table/PPT purpose suggests.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/normalize_logos.py (reported line 59)May include surrounding context.

python
"""SVG → PNG 转换,按优先级尝试多种工具"""
    # 1. rsvg-convert (最佳质量)
    try:
        result = subprocess.run(
            ['rsvg-convert', '-w', str(size), '-h', str(size),
             '--keep-aspect-ratio', svg_path, '-o', output_path],
            capture_output=True, text=True, timeout=15

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
82% confidence
Finding

The code copies attacker-influenced content to a predictable path in /tmp using tmp_svg = svg_path + '.svg' and then asks qlmanage to render it, later moving a predictable /tmp output file. In a multi-user or untrusted local environment, predictable temporary filenames in shared temporary directories can enable symlink/race-condition attacks, causing unintended file overwrite or interaction with attacker-prepared files.

Content

Scanner excerpt · scripts/normalize_logos.py (reported line 84)May include surrounding context.

python
try:
        tmp_svg = svg_path + '.svg'
        shutil.copy2(svg_path, tmp_svg)
        result = subprocess.run(
            ['qlmanage', '-t', '-s', str(size), '-o', '/tmp/', tmp_svg],
            capture_output=True, text=True, timeout=15
        )

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

TLS certificate verification and hostname checks are explicitly disabled for remote downloads. This allows man-in-the-middle attackers to tamper with downloaded image content or redirect requests to malicious endpoints, undermining the integrity of files written locally.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

When --retry is used, the script silently performs external searches and overwrites the destination logo file without a user-facing confirmation step. That can unexpectedly replace local assets with untrusted remote content, which is especially risky in an automation skill that users may assume is only doing validation.

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/verify_logos.py (reported line 186)May include surrounding context.

python
for query in queries:
        url = f"https://image.baidu.com/search/index?tn=baiduimage&word={urllib.parse.quote(query)}"
        subprocess.run([AGENT_BROWSER, 'open', url], capture_output=True, env=env)
        time.sleep(3)

        js = "JSON.stringify([...document.querySelectorAll('[data-objurl]')].map(e=>e.getAttribute('data-objurl')).filter(u=>u&&u.startsWith('http')).slice(0,8))"

Tainted flow: 'AGENT_BROWSER' from os.environ.get (line 45, credential/environment) → subprocess.run (code execution)

Medium
Category
Data Flow
Confidence
97% confidence
Finding

The executable path comes from the AGENT_BROWSER environment variable and is passed directly to subprocess.run. If an attacker can influence the environment, they can cause arbitrary code execution under the script's privileges when retry logic triggers browser automation.

Content

Scanner excerpt · scripts/verify_logos.py (reported line 186)May include surrounding context.

python
for query in queries:
        url = f"https://image.baidu.com/search/index?tn=baiduimage&word={urllib.parse.quote(query)}"
        subprocess.run([AGENT_BROWSER, 'open', url], capture_output=True, env=env)
        time.sleep(3)

        js = "JSON.stringify([...document.querySelectorAll('[data-objurl]')].map(e=>e.getAttribute('data-objurl')).filter(u=>u&&u.startsWith('http')).slice(0,8))"

Static analysis

No suspicious patterns detected.