Back to skill

Security audit

Trending Skills

Security checks for vulnerabilities and agentic risk

Overview

The skill appears intended to fetch public skills.sh rankings and details, but it uses under-scoped network/browser behavior and non-reproducible installation steps that deserve manual review before installation.

Install only in an isolated environment with limited filesystem and network access. Prefer pinned dependencies, avoid global or privileged installs, do not use untrusted SKILLS_BASE_URL values, and treat the Playwright no-sandbox configuration as a review item before running it on a sensitive machine.

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
src/detail_fetcher.py:94
Finding

Unrestricted URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
Optional[Dict]: """ 获取单个技能详情 Args: url: 技能详情页 URL skill_info: 技能基本信息 Returns: 技能详情字典或 None """ if not skill_info: skill_info = {} try: response = self.session.get(url, timeout=self.timeout) response.raise_for_status() html_content = response.text # 解析页面 detail = self.parse_detail_page(html_content, url, skill_info) return detail ``` ### Technical Analysis `fetch_detail_page()` sends a request to the supplied `url` without validating its scheme, hostname, port, resolved IP address, or relationship to the expected `skills.sh` service. The `requests` session also follows redirects by default. The method is called by `fetch_top20_details()`, which accepts URLs directly from skill dictionaries: ```python url = skill.get("url", "") if not url: # 尝试构建 URL name = skill.get("name", "") owner = skill.get("owner", "") url = f"{self.base_url}/{owner}/{name}" detail = self.fetch_detail_page(url, skill) ``` Consequently, any caller capable of supplying or modifying a skill dictionary can cause the process to connect to arbitrary destinations. Potential targets include loopback services, private network systems, link-local addresses, and cloud instance metadata endpoints. Redirects from an initially permitted-looking address can also lead the request to an internal destination. The response body is retained in the returned `html_content` field, making this more than blind SSRF: accessible internal response data may be exposed to the caller. ### Attack Path 1. An attacker gains control over a skill dictionary passed to `fetch_top20_details()` or direc ...[truncated 1250 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/skills_fetcher.py:55
Finding

Chromium Sandbox Disabled While Rendering Remote Content

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:45
Finding

Unpinned Dependencies and Privileged System Dependency Installation

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • 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 (13)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The skill is described primarily as fetching trending rankings, but it also documents a detail-fetching mode that retrieves individual skill pages and extracts structured metadata from them. This broader data collection behavior matters because users and reviewers may approve the skill expecting a narrow ranking lookup, while the actual workflow supports deeper scraping of external content.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill is described primarily as fetching trending rankings, but it also documents a detail-fetching mode that retrieves individual skill pages and extracts structured metadata from them. This broader data collection behavior matters because users and reviewers may approve the skill expecting a narrow ranking lookup, while the actual workflow supports deeper scraping of external content.

Content

No source excerpt is available for this finding.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · src/detail_fetcher.py (reported line 237)May include surrounding context.

python
})

                    if rules:
                        return rules

        # 备用方案:从 HTML 中提取所有看起来像规则的链接
        pattern = r'rules/([a-z0-9_-]+)\.md'

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · src/detail_fetcher.py (reported line 249)May include surrounding context.

python
})

                    if rules:
                        return rules

        # 备用方案:从 HTML 中提取所有看起来像规则的链接
        pattern = r'rules/([a-z0-9_-]+)\.md'

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill instructs the agent to run Python code, install packages, and access external websites, but it declares no explicit tool scope or permission boundaries. That creates an authorization gap where the agent may use network and execution capabilities more broadly than users or platform policy expect, increasing the risk of unintended outbound access or environment interaction.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest advertises a trending-skills capability, but the package documentation describes AI news collection, Claude-based analysis, and HTML page generation. Such inconsistencies can hide unauthorized functionality or cause operators to grant permissions and trust based on false assumptions about what the skill does.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The module docstring describes an unrelated AI news aggregation and HTML generation tool, while the skill metadata claims this package fetches skills.sh trending rankings. This kind of identity mismatch is dangerous because it can conceal repackaged, swapped, or mislabeled code, making review, deployment, and trust decisions unreliable.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This Python file contains natural-language docstrings, comments, and console output in Chinese, including the module description and runtime status messages. Because the skill does not offer a language/locale choice or explain that it is intentionally region-specific, it violates the policy against forcing a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The file's docstrings, comments, and printed user-facing status messages are written in Chinese throughout, with no indication that language is configurable or selected by user preference. This can violate language/locale policy when a skill imposes a specific language without opt-in.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The code launches Playwright with anti-bot evasion-oriented flags such as disabling AutomationControlled and uses a spoofed browser user agent for a simple public leaderboard fetch. That behavior is unnecessary for the stated purpose and can bypass site bot-detection or terms-based controls, increasing legal/compliance risk and making the skill more suspicious if reused in broader scraping contexts.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The module docstring describes the skill exclusively in Chinese, which may imply a language-specific experience without stating that the skill is intended only for Chinese-speaking users or offering any language choice. Under the policy, forcing a specific language without user opt-in can be a natural-language policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

This Python file contains user-facing natural-language strings and comments primarily in Chinese, including category names and descriptions, with no indication that the skill offers a language choice or is intentionally restricted to a Chinese-speaking context. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code retrieves remote page content from skills.sh and, on parse failure, prints a preview of the fetched page text to logs. While the skill's purpose is fetching leaderboard data, there is no explicit warning in this file that remote content may be logged during failure handling, which is a user-visible safety disclosure gap for network-retrieved data.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.