Back to skill

Security audit

中文播客雷达

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a coherent Chinese podcast analytics tool, but it needs Review because one enrichment script can fetch arbitrary URLs and one tracking workflow stores invented history as if it were observed data.

Install only if you are comfortable with public podcast data being fetched from the listed services and local JSON tracking files being written. Treat generated subscriber growth reports with caution until synthetic history is removed or clearly labelled. Do not pass arbitrary or untrusted URLs to the Xiaoyuzhou enrichment script unless it is fixed to allow only canonical Xiaoyuzhou episode and podcast pages.

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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/enrich_xiaoyuzhou.py:89
Finding

Unrestricted URL Enrichment Enables Server-Side Request Forgery

Content
View full analysis
Dict[str, Any]: request = Request( url, headers={ "User-Agent": USER_AGENT, "Accept": "text/html,application/xhtml+xml", "Accept-Encoding": "gzip", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", }, ) with urlopen(request, timeout=30) as response: content_encoding = (response.getheader("Content-Encoding") or "").lower() decompressor = zlib.decompressobj(16 + zlib.MAX_WBITS) if "gzip" in content_encoding else None chunks: List[bytes] = [] total_read = 0 while total_read < MAX_READ_BYTES: raw_chunk = response.read(READ_CHUNK_SIZE) if not raw_chunk: break total_read += len(raw_chunk) chunk = decompressor.decompress(raw_chunk) if decompressor else raw_chunk if chunk: chunks.append(chunk) payload = extract_next_data_from_html_bytes(b"".join(chunks)) if payload is not None: return payload raise ValueError("Could not find __NEXT_DATA__ within the read limit.") ``` ```python def extract_urls_from_payload(payload: Any) -> List[str]: if isinstance(payload, list): items = payload elif isinstance(payload, dict): items = payload.get("items", []) else: return [] urls: List[str] = [] for item in items: if isinstance(item, str): urls.append(item) conti ...[truncated 4497 chars]
Remediation
View remediation
` - `/podcast/` 6. Resolve the hostname and reject any result in loopback, private, link-local, multicast, unspecified, or reserved IP ranges for both IPv4 and IPv6. 7. Disable automatic redirects or implement a redirect handler that validates every destination with the same policy before following it. 8. Apply identical validation to direct command-line URLs and URLs extracted from JSON. 9. Prefer accepting Xiaoyuzhou episode or podcast identifiers rather than complete URLs, then construct canonical URLs internally. 10. Add automated tests covering localhost, RFC1918 ranges, IPv6 loopback, alternate schemes, embedded credentials, malicious ports, DNS rebinding scenarios, and redirects to internal addresses. ]]>

other

Warning
Location
scripts/batch_track.py:92
Finding

Synthetic Subscriber History Is Presented as Genuine Tracking Data

Content
View full analysis
= 2: total, weekly = calc_weekly_growth(history) hot_with_growth.append({ ...[truncated 2910 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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
Findings (44)

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

声明描述的是一个功能较全面的播客分析工具包,但该代码块只覆盖其中一小部分,即热门播客发现与订阅追踪。更关键的是,初始化时并不是获取真实历史订阅趋势,而是基于当前订阅量和随机增长值生成12周历史数据,这会让“趋势”呈现为合成数据而非真实观测结果,属于对能力的实质性偏离。代码没有实现竞品格局分析、创作方向机会评估、完整报告生成、案例对标或话题热度监控等声明中的核心能力。因此描述与实际行为存在明显不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

声明描述的是一个较完整的播客数据分析工具包,覆盖发现、竞品、订阅趋势、创作机会与热度监控等多个分析场景。但该代码块的实际功能明显更窄,核心是“排名跟踪”:通过调用 fetch_xyz_rank.py 搜索播客、记录 externalId/title/genre,并按日期保存 rank 与 avgPlayCount 历史,再以命令行形式展示趋势。最关键的不一致在于声明提到“订阅追踪”,而代码并未处理订阅数据,只记录排名和平均播放数。其余诸如竞品分析、机会评估、报告生成、热度监控等也都没有实现。因此描述与实际行为存在明显的能力层级和功能范围不匹配。

Content

No source excerpt is available for this finding.

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

The skill recommends piping data fetched over the network directly into a Python interpreter invocation, which normalizes a risky execution pattern. Although this specific example uses python3 -m json.tool rather than executing downloaded code, documenting curl-to-interpreter pipelines encourages unsafe operator habits and weakens separation between untrusted network content and local execution.

Content

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

bash
# 查询单个播客历史趋势(以罗永浩为例)
curl -s "https://api.xyzrank.top/v1/metrics/68981df29e7bcd326eb91d88" | python3 -m json.tool

# 查询所有播客最新统计
curl -s "https://api.xyzrank.top/v1/stats" | python3 -c "import json,sys;d=json.load(sys.stdin);[print(f'{p['title']}: {p['latest_count']:,}') for p in d['data'][:10]]"

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

This example pipes remote API output directly into python3 -c one-liner code, combining untrusted network data with ad hoc shell/Python execution. Even if the response is treated as JSON input here, this pattern is brittle, easy to copy into more dangerous forms, and increases the blast radius of parsing or quoting mistakes in environments that permit shell execution.

Content

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

md
curl -s "https://api.xyzrank.top/v1/metrics/68981df29e7bcd326eb91d88" | python3 -m json.tool

# 查询所有播客最新统计
curl -s "https://api.xyzrank.top/v1/stats" | python3 -c "import json,sys;d=json.load(sys.stdin);[print(f'{p['title']}: {p['latest_count']:,}') for p in d['data'][:10]]"

# 按名称搜索播客获取 ID
curl -s "https://api.xyzrank.top/v1/podcast/纵横四海" | python3 -m json.tool

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Like the other pipeline examples, this line endorses streaming third-party content into a local interpreter process. In a skill that already lacks explicit tool scoping, such examples make unsafe execution patterns more dangerous because an agent or user may adopt them in privileged contexts.

Content

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

curl -s "https://api.xyzrank.top/v1/stats" | python3 -c "import json,sys;d=json.load(sys.stdin);[print(f'{p['title']}: {p['latest_count']:,}') for p in d['data'][:10]]"

按名称搜索播客获取 ID

curl -s "https://api.xyzrank.top/v1/podcast/纵横四海" | python3 -m json.tool

text

#### 在脚本中使用

Intent-Code Divergence

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The code fabricates 12 weeks of historical subscription data using random variance and synthetic growth, then stores it as if it were real tracking history. In a tool marketed for trend tracking, competitor analysis, and opportunity evaluation, this can mislead users into making business decisions based on invented analytics rather than observed data.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The update workflow appends real observations onto histories that may have been synthetically seeded during initialization, creating a mixed dataset that appears authentic end-to-end. This undermines data integrity and can produce false trend interpretations, especially given the skill's stated use for subscription tracking and creation opportunity analysis.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The description explicitly defines the package as a Chinese podcast toolkit, and the usage examples throughout the file are written as Chinese-only interaction patterns. Because the file does not indicate that language is optional or user-selectable, this creates a locale policy concern under the language-choice rule.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The conversational trigger examples show only Chinese prompts and do not mention that other languages are accepted. In the absence of an explicit opt-in or justification for a Chinese-only interface, this reads as a forced locale choice.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill documents capabilities that require network, shell, file read, and file write, but it does not declare any explicit tool scope or permissions boundaries. This creates an overbroad execution surface where an agent may invoke sensitive capabilities without user-visible restriction or least-privilege controls.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger descriptions are broad enough to match ordinary user requests, which can cause the skill to activate unexpectedly and perform network access, scraping, or local tracking when the user did not clearly request those actions. Ambiguous activation increases the chance of unintended data access and tool use in unrelated conversations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The skill describes scraping external pages and maintaining local JSON-based subscription tracking, but it does not clearly disclose persistence, retention, or external transmission implications. Users may unknowingly trigger collection and storage of third-party data over time, which raises privacy, compliance, and operational risk.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 59)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 63)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 68)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 77)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 80)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 83)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 318)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 321)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 · SKILL.md (reported line 324)May include surrounding context.

端点说明

text
GET https://api.xyzrank.top/v1/stats
# 返回所有播客最新订阅统计(含日/月变化)
# 字段: podcast_id, title, latest_count, daily_change, monthly_change

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Mapping generic phrases such as “热门播客” or “最近火什么” to specific automated behaviors is ambiguous and may hijack normal conversation into external queries or analysis flows. Because the default behavior can choose single-episode discovery unless the user specifies otherwise, the skill may act beyond user intent and expose unnecessary external interactions.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The prompt states "In casual Chinese requests" and frames behavior around Chinese-only interpretation for the skill, while the skill title and description are also Chinese-specific. This creates a locale/language constraint without explicitly offering the user a language choice or opt-in, which matches the language policy violation criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The 'User Language Mapping' section states 'In Chinese, users often say' and then defines a default interpretation for Chinese phrases, effectively prescribing Chinese-language handling without any opt-in or alternative language behavior. Under the policy, language/locale constraints should either offer user choice or be clearly documented as a justified region-specific limitation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The module docstring, command examples, help text, and user-facing output are written in Chinese, which imposes a specific language on users. The file does not provide an opt-in, alternative locale, or justification that this is intentionally region-specific.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.