Back to skill

Security audit

NetEase Cloud Music Listening Profile

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly transparent about collecting NetEase Cloud Music data locally, but it leaves a powerful authenticated debugging port active without clear cleanup or warning.

Install only if you are comfortable letting the skill start NetEase Cloud Music with a local debugging port, collect your playlist and listening-rank data, and write private files under outputs/. After a run, close NetEase Cloud Music to shut down the debug-enabled session, keep the output directory private, be cautious opening CSVs in spreadsheet apps, and prefer pinned or reviewed installation/dependency sources where possible.

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
scripts/ncm_env.py:325
Finding

Authenticated CDP debugging interface remains active after collection

Content
View full analysis
list[str]: common_args = [ "--force-renderer-accessibility=complete", f"--remote-debugging-port={port}", ] if client.platform == "windows": return [str(client.path), *common_args] if client.platform == "macos": return ["open", "-na", str(client.path), "--args", *common_args] raise UserActionRequired( "Unsupported platform for this Skill. NetEase Cloud Music desktop collection " "is supported on Windows and macOS." ) def launch_client(client: NcmClient, port: int) -> subprocess.Popen: args = client_launch_args(client, port) return subprocess.Popen(args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) ``` The collection cleanup only closes the current WebSocket connection: ```python finally: if client is not None: client.close() ``` ### Technical Analysis The Skill launches NetEase Cloud Music with Chrome DevTools Protocol enabled on TCP port 9222. CDP permits target enumeration, arbitrary JavaScript evaluation, and interaction with an authenticated application context. Closing `CdpClient` only closes the Python process's WebSocket. It does not disable the debugging endpoint or close the Skill-launched desktop client. The returned `subprocess.Popen` object is not retained by the collector, so the collector cannot perform targeted lifecycle cleanup after final collection. Keeping the client running is temporarily necessary between playlist listing and final collection, but leaving CDP enabled after the final collection exceeds the minimum duration required by the declared functionality. Exploitation requires local access to the debugging ...[truncated 1360 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/ncm_outputs.py:67
Finding

Spreadsheet formula injection in generated CSV files

Content
View full analysis
None: with path.open("w", encoding="utf-8-sig", newline="") as handle: writer = csv.DictWriter(handle, fieldnames=fields, extrasaction="ignore") writer.writeheader() for row in rows: writer.writerow({field: csv_value(row.get(field)) for field in fields}) ``` API-controlled textual fields are passed into CSV rows without spreadsheet-specific neutralization: ```python result_rows.append( { "order": order, "title": _string_value(song.get("name")), "artistNames": source["artistNames"], "album": source["album"].get("name") or "", "duration": format_duration(duration_ms), "durationMs": duration_ms, "addedAt": format_added_at(added_at), } ) ``` ### Technical Analysis The CSV writer correctly performs CSV quoting, but CSV quoting does not prevent spreadsheet applications from interpreting cell contents as formulas. Song titles, artist names, and album names originate from remote service data and may begin with formula-triggering characters such as: - `=` - `+` - `-` - `@` When a user opens the generated CSV in a formula-capable spreadsheet application, such a cell may be evaluated rather than displayed as literal text. The README describes CSV files as suitable for manual inspection, making spreadsheet opening an expected workflow. ### Attack Path 1. A song, artist, or album entry contains text beginning with a spreadsheet formula marker. 2. NetEase returns that metadata through the playlist or listening-record API. 3. The Skill copies the text into a result row. 4. `write_csv` writes the value without formula neutralization. 5. The user opens the generated CSV in a spreadsheet application. 6 ...[truncated 782 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/requirements.txt:1
Finding

Python dependencies are installed without exact version or integrity pinning

Content
View full analysis
=5.9 requests>=2.31 websocket-client>=1.6 ``` The Skill instructs users to install these dependencies directly: ```text python -m pip install -r scripts/requirements.txt ``` ### Technical Analysis Each dependency uses an open-ended minimum version. A future installation can therefore resolve to package versions that were not part of this audit. The requirements file also provides no package hashes, so pip does not verify artifacts against an audited integrity manifest. These are legitimate, correctly named packages from the normal Python ecosystem; no dependency confusion or typosquatting was identified in the reviewed names. The issue is that the effective dependency code can change after the Skill itself has been reviewed. The dependencies execute with the same privileges as the Skill. In particular, they have access to local files, process information, network APIs, and the CDP connection when imported or called. ### Attack Path 1. A user follows the documented setup command. 2. Pip resolves the newest versions satisfying the lower bounds. 3. A future compromised, malicious, or incompatible release is selected. 4. The unreviewed package is installed without comparison to an expected artifact hash. 5. The package executes when imported or used by the Skill. 6. It inherits the Python process's file, process, and network privileges. ### Impact Assessment A compromised dependency could potentially: - Read files accessible to the invoking user. - Inspect local processes and network connections. - Intercept or alter CDP and API operations. - Access locally collected listening-profile files. - Send data over the network. - Execute arbitrary code with the invoking user's operating-system privileges. No currently malicious dependency was demonstr ...[truncated 118 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (28)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

根据给定代码块,build_aggregate(...) 只接收已经存在的 primary_raw/result、recent_raw/result、all_raw/result 数据并计算聚合结果,没有任何 CDP、客户端连接、浏览器控制、登录态利用或 /api 网络请求逻辑。因此,这段代码与声明中的“采集”部分并不相符。更重要的是,代码不仅仅是简单导出 aggregate 文件,还进行了广泛的行为画像式统计:例如歌曲时长偏好、添加时间模式、最近/长期听歌排名变化、艺人和专辑偏好、标题/专辑/艺人名称的 lexical/script 特征等。这类分析虽未直接输出‘人格结论’,但明显超出单纯采集,属于对听歌画像数据的本地分析与结构化总结。因此,描述与该代码块的实际行为存在实质性偏差。

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
94% confidence
Finding

The README instructs users to run npx skills add ... without pinning an exact package version. npx resolves and executes the latest published package by default, so a compromised publisher account, dependency confusion, or a malicious upstream update could result in arbitrary code execution on the user's machine during installation.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

The command npx -y @lobehub/market-cli ... executes a package fetched at runtime without pinning a specific version. Because this skill handles sensitive local music-profile data and requires users to install tooling locally, an unexpected or malicious package update could execute arbitrary code before the user even runs the skill itself.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill instructs the agent to run Python, install dependencies, access local files, and connect to a logged-in desktop client over CDP, but it does not declare any explicit tool/permission scope. That creates a governance gap: an operator or platform cannot easily constrain shell, file, or network access to the minimum required, increasing the chance of unintended data collection or command execution in a sensitive local context.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill handles sensitive behavioral data from a user's logged-in music account and writes multiple local artifacts, but the top-level description does not prominently warn about the privacy implications or persistence of that data. Users may consent to 'analysis' without understanding that detailed listening history and playlist information will be extracted from an authenticated session and stored on disk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The default activation phrase is very broad and can trigger this skill whenever a user mentions collecting NetEase Cloud Music listening-profile data, without requiring explicit confirmation that they want local client automation and extraction of playlist and listening-history data. In this context, the skill accesses sensitive personal preference and behavior data from an already logged-in desktop session, so over-broad triggering materially increases the chance of unintended data collection.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The document title and all operational guidance are written exclusively in Chinese, which constitutes a language constraint in the skill's natural-language instructions. The file does not offer an alternative language, user opt-in, or a documented region-specific justification for the locale restriction.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The entire skill reference is written in Chinese and does not indicate that users may choose another language or locale. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The document is written as an instruction file entirely in Chinese and immediately directs the reader to use it when modifying schema-related outputs. This imposes a specific language context without any indication that other languages are supported or that the user can opt into a preferred locale, which matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code collects sensitive user listening-profile data and persists multiple derived files to disk, but this file does not present a clear user-facing warning, consent prompt, or data-minimization guard at the point of collection/output. In the context of a skill that accesses a logged-in desktop client and exports playlists and listening history, silent local persistence increases privacy risk because other local users, backup systems, or downstream tools may access the exported profile data without the user fully realizing the scope of collection.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code deliberately aggregates and emits highly sensitive listening-history metadata, including track identifiers, timestamps, rankings, and behavioral summaries, into structured outputs. In the stated skill context, that data can reveal personal preferences, routines, language/cultural profile, and long-term habits; the absence of any in-function minimization, consent check, redaction, or warning increases the risk of privacy leakage if downstream components export, upload, or analyze the results.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The code issues authenticated requests with credentials: 'include' to NetEase Cloud Music endpoints that retrieve account identifiers, playlists, and listening history from an already logged-in desktop client context. In this skill’s context, that is the intended data collection behavior, but it still creates a real privacy-sensitive capability because the file itself contains no user-consent gate, warning, or data-minimization control before accessing and exporting personal listening data.

Content

No source excerpt is available for this finding.

Internal Network Request

Medium
Category
Server-Side Request Forgery
Confidence
70% confidence
Finding

Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Content

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

python
def get_targets(port: int) -> list[CdpTarget]:
    response = requests.get(f"http://127.0.0.1:{port}/json", timeout=2.0)
    response.raise_for_status()
    targets: list[CdpTarget] = []
    for item in response.json():

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The evaluate method exposes generic Runtime.evaluate execution against the attached NetEase Cloud Music renderer without constraining the JavaScript expression. In this skill context, CDP is used to access an already logged-in application session, so arbitrary evaluation can read sensitive in-app state, invoke privileged app-side APIs, and expand the blast radius if untrusted input can reach the expression parameter.

Content

No source excerpt is available for this finding.

Dynamic import via __import__()

Medium
Category
Dangerous Code Execution
Confidence
75% confidence
Finding

Dynamic import() can load arbitrary modules at runtime, bypassing static analysis and potentially importing malicious code.

Content

Scanner excerpt · scripts/ncm_env.py (reported line 55)May include surrounding context.

python
("websocket-client", "websocket"),
    ):
        try:
            __import__(import_name)
        except ImportError:
            missing.append(package)
    if missing:

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The skill is explicitly designed to attach to and collect data from a local NetEase Cloud Music client, and this file launches that client automatically without any in-file user-facing notice, confirmation gate, or consent enforcement. In a privacy-sensitive collection workflow, silent launch of a desktop app tied to an authenticated session increases the risk of unexpected data access and weakens informed user consent, especially since the broader skill description involves harvesting playlists and listening history.

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/ncm_env.py (reported line 343)May include surrounding context.

python
def launch_client(client: NcmClient, port: int) -> subprocess.Popen:
    args = client_launch_args(client, port)
    return subprocess.Popen(args, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)


def wait_for_cdp_version(port: int, timeout_s: float = 30.0) -> dict:

Scope Creep

Low
Category
Excessive Agency
Confidence
70% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

Scanner excerpt · LICENSE (reported line 12)May include surrounding context.

text
permit persons to whom the Software is furnished to do so.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The usage section presents the invocation example only in Simplified Chinese, which can imply a language-specific interaction requirement. The file does not explicitly state that other languages are equally supported or that Chinese is optional, so this may conflict with a language/locale neutrality policy.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The troubleshooting guidance is written entirely in Chinese and provides no indication that another language can be used or that the language choice is optional. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern unless the locale constraint is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

This code opens a WebSocket connection to a Chrome DevTools Protocol target, which is a network operation that can access and control a browser-like target. The file contains no confirmation prompt, print/log message, or comment/docstring disclosing that this connection is being established.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The dependency is specified with a lower bound only (psutil>=5.9), which makes builds non-reproducible and allows installation of newer releases that have not been reviewed or tested by the skill author. This increases supply-chain risk and makes it difficult to determine whether a vulnerable or incompatible version may be installed in different environments.

Content

Scanner excerpt · scripts/requirements.txt (reported line 1)May include surrounding context.

text
psutil>=5.9
requests>=2.31
websocket-client>=1.6

Unverifiable Dependency: psutil has 2 known advisory(ies) (CVE-2019-18874 (Double Free in psutil); CVE-2019-18874 (psutil (aka python-psutil) through 5.6.5 can have a double free. This occurs bec)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
84% confidence
Finding

The manifest does not pin psutil, and known advisories exist for some historical versions, so it is impossible to verify from this file whether an affected release could be installed. This is primarily a dependency hygiene and provenance problem rather than proof that the vulnerable version is actually in use.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.