Back to skill

Security audit

Nba Analyst

Security checks for vulnerabilities and agentic risk

Overview

This is a Chinese-language NBA data helper that fetches public NBA data and writes local cache/report files, with some install and routing cautions but no artifact-backed malicious behavior.

Install this in an isolated Python environment and prefer pinned dependencies or a lockfile before relying on it. Expect Chinese-language output, outbound requests to NBA data services, and local cache/report files created inside the skill package.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (1)

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding

Unpinned Third-Party Dependencies Permit Unreviewed Package Releases

Content
View full analysis

Vulnerability Details

File Location: requirements.txt:1-5, clawhub.json:14-20, and SKILL.md:57-61
Vulnerability Type: Supply-chain exposure through non-reproducible dependency resolution
Risk Level: Medium

Complete Code Snippets

requirements.txt:1-5:

text
nba_api>=1.2.0
pandas>=2.0.0
numpy>=1.24.0
matplotlib>=3.7.0
requests>=2.31.0

clawhub.json:14-20:

json
"pip": [
  "nba_api>=1.2.0",
  "pandas>=2.0.0",
  "numpy>=1.24.0",
  "matplotlib>=3.7.0",
  "requests>=2.31.0"
]

SKILL.md:57-61:

markdown
## Dependency Installation

```bash
pip install nba_api pandas numpy matplotlib requests
text

### Technical Analysis

The project specifies only minimum dependency versions and does not provide an exact lockfile or package integrity hashes. The installation command in `SKILL.md` is even less restrictive because it contains no version constraints at all. Consequently, separate installations may resolve to different and previously unreviewed package releases.

Python packages can execute code during installation and whenever imported. If an allowed upstream package release or its distribution channel is compromised, installation can introduce attacker-controlled code even though the audited project source remains unchanged. This is a supply-chain risk rather than evidence that any currently named package is malicious.

The audit also found that `requests` and `matplotlib` are declared but are not directly imported by the project scripts. Unless they are required transitively or for an undocumented feature, retaining them unnecessarily expands the dependency and vulnerability surface.

### Attack Path

1. An attacker compromises the publisher account, build pipeline, or distribution artifact of one of the allowed dependencies and publishes a malicious version that satisfies the open-ended constraint.
2. A user or automa
...[truncated 1202 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin every direct dependency to an exact, reviewed version rather than using minimum-version constraints.
  2. Generate and commit a reproducible lockfile that also resolves and pins all transitive dependencies.
  3. Record cryptographic hashes for every permitted distribution and install with hash enforcement, such as pip install --require-hashes -r requirements.txt.
  4. Update SKILL.md so its installation command uses the locked dependency file instead of unconstrained package names.
  5. Remove requests and matplotlib if dependency analysis confirms that the Skill does not require them.
  6. Perform dependency updates through a controlled review process that includes vulnerability scanning, provenance verification, automated tests, and review of material package changes.
  7. Install dependencies in an isolated virtual environment under a non-privileged account, and restrict runtime filesystem and network permissions to the minimum required for NBA API access and report generation.
  8. Prefer trusted package indexes and disable unapproved supplemental indexes to reduce dependency-confusion exposure.
Vulnerability Patterns
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (25)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The description states '全中文界面', which indicates the skill is restricted to a Chinese-only interface. This is a natural-language locale constraint presented without offering the user a language choice or documenting an explicit regional justification.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The auto-activation conditions are defined as broad NBA-related query categories with no boundaries or confirmation step. In practice, this makes skill invocation overly permissive and can hijack general sports discussion, especially in a multi-skill environment where routing precision matters for safety and user control.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The trigger list is very broad and includes common sports terms, team names, and star player names that frequently appear in ordinary conversation. This can cause accidental activation, routing user requests into the skill without clear intent, which increases the chance of unnecessary data access, unwanted file generation, or confusing outputs.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This JSON maps English player names exclusively to Chinese renderings, which implies a forced language/locale behavior in the skill data. Under the policy, locale constraints should either be user-selectable or clearly documented and justified; this file contains no such opt-in or justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This Python file contains docstrings, comments, and all returned user-facing strings exclusively in Chinese, such as the module description and error/output messages. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale constraint is explicitly documented and justified, which is not present here.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This code’s natural-language descriptions and method semantics consistently prescribe Chinese as the output locale, such as translating labels and names to Chinese by default. Under the policy, forcing a specific language without user opt-in is a locale-policy violation unless the regional constraint is clearly documented and justified.

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 description, docstrings, usage messages, and help output are all presented in Chinese, with no indication that users can choose another language. This is a natural-language policy concern because it effectively forces a locale/language on users rather than offering opt-in or a documented region-specific justification.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This code file contains natural-language descriptions and user-facing outputs in Chinese, indicating the skill forces a specific language/locale. The file does not offer user opt-in or an alternative language choice, and no justified region-specific constraint is documented here.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This code uses Chinese-only natural-language strings for the module description and, throughout the file, generates Chinese-language HTML content by default. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly documented and justified.

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 descriptions and returned user-visible strings exclusively in Chinese, starting with the module docstring and continuing throughout the functions. That forces a specific language/locale without user opt-in, which matches the policy-violation criteria for natural-language constraints.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code's user-facing text, docstrings, and formatted output are all explicitly in Chinese, including error messages and standings labels. The file does not indicate any user opt-in or configurable locale, which can violate language/locale policy when a skill forces a specific language by default.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This code file contains natural-language descriptions and returned messages entirely in Chinese, beginning with the module docstring. The policy scope includes language/locale violations in code string literals, and there is no indication that users can choose another language or that the Chinese-only behavior is explicitly justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest description is written entirely in Chinese ("NBA 全能数据分析助手 - 比分/排名/球员/球队/对比/报告/选秀") with no indication that users can choose another language or locale. Per the policy, a skill that imposes a specific language without opt-in can be a natural-language policy violation unless the locale constraint is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The dependency uses a lower-bound version specifier (>=) instead of pinning to an exact version, which makes builds non-reproducible and allows installation of unexpected future releases. This increases supply-chain risk because security posture and compatibility can change over time without review.

Content

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

text
nba_api>=1.2.0
pandas>=2.0.0
numpy>=1.24.0
matplotlib>=3.7.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

pandas>=2.0.0 is unpinned, so installations may resolve to different versions over time, reducing reproducibility and making it harder to know whether known vulnerabilities are present. In dependency manifests, this is a real but low-severity supply-chain weakness rather than an immediate exploit by itself.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
nba_api>=1.2.0
pandas>=2.0.0
numpy>=1.24.0
matplotlib>=3.7.0
requests>=2.31.0

Unverifiable Dependency: pandas has 1 known advisory(ies) (CVE-2020-13091 (** DISPUTED ** pandas through 1.0.3 can unserialize and execute commands from an)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
90% confidence
Finding

pandas has at least one historical advisory, but the manifest does not pin a specific version, so it is impossible to determine from this file whether an affected release could be installed. In this context, the danger comes from unverifiable dependency state rather than proof that a vulnerable version is definitely present.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

numpy>=1.24.0 permits any newer version, which can introduce unreviewed code changes or resolve to versions with different security characteristics. This weakens reproducibility and complicates assurance that deployed environments are using safe, tested packages.

Content

Scanner excerpt · requirements.txt (reported line 3)May include surrounding context.

text
nba_api>=1.2.0
pandas>=2.0.0
numpy>=1.24.0
matplotlib>=3.7.0
requests>=2.31.0

Unverifiable Dependency: numpy has 16 known advisory(ies) (CVE-2014-1859 (Numpy arbitrary file write via symlink attack); CVE-2021-41495 (NumPy NULL Pointer Dereference); CVE-2021-33430 (NumPy Buffer Overflow (Disputed)) +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
92% confidence
Finding

numpy has multiple known advisories across versions, and the unpinned manifest prevents verification of whether the resolved version is safe. This creates uncertainty in the supply chain and may allow an affected version to be introduced during installation or future rebuilds.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

matplotlib>=3.7.0 is not pinned, so future installs may pull different versions than the one originally tested. While not inherently malicious, this creates a supply-chain control gap and can expose the project to regressions or newly introduced vulnerabilities.

Content

Scanner excerpt · requirements.txt (reported line 4)May include surrounding context.

text
nba_api>=1.2.0
pandas>=2.0.0
numpy>=1.24.0
matplotlib>=3.7.0
requests>=2.31.0

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

requests>=2.31.0 allows any newer version and therefore makes the environment non-deterministic. Because requests is network-facing and has had multiple security advisories historically, lack of pinning makes it harder to verify that deployed versions are not affected.

Content

Scanner excerpt · requirements.txt (reported line 5)May include surrounding context.

text
pandas>=2.0.0
numpy>=1.24.0
matplotlib>=3.7.0
requests>=2.31.0

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +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
95% confidence
Finding

requests has numerous historical advisories, including issues affecting credential handling and request verification, and the unpinned requirement means the actual installed version cannot be validated from the manifest. Because this package handles outbound HTTP interactions, uncertainty around its version is somewhat more dangerous in a data-fetching skill than for a purely local library.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The line mixes an English title with a Chinese description ('NBA 数据分析助手'), indicating the skill is presented in a specific language without any visible user choice or opt-in. Under the stated policy, locale-specific language should either be optional or clearly justified.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

技能描述声明的范围包括比分、排名、球员数据、球队信息、球员/球队对比、AI 深度分析和可视化 HTML 报告,但此入口还额外暴露了 draft 和 leaders 两类能力。它们虽仍属 NBA 数据查询范畴,但并未体现在 manifest 描述中,属于描述与实际功能范围不完全一致。

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The module description is written entirely in Chinese and presents the skill as Chinese-language by default, with no indication that users may choose another language or that the locale is region-specific. Under the policy for natural-language violations, forcing a specific language without opt-in should be flagged.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.