Back to skill

Security audit

Finance Reporter Publish

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to do the advertised finance reporting, but its dependency metadata can cause unsafe or unintended package installation.

Install only after reviewing or fixing the dependency setup: avoid running npm install for this package as written, pin the Python requests dependency in a Python-native file, and enable cron or DingTalk/WeChat delivery only after confirming the destination and schedule.

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
package.json:32
Finding

Dependency Ecosystem Confusion and Unpinned Python Dependency

Content
View full analysis

Vulnerability Details

File Location: package.json:32-34; supporting installation instruction at SKILL.md:117-120
Vulnerability Type: Dependency ecosystem confusion and non-reproducible dependency installation
Risk Level: Medium

Vulnerable Code

package.json:32-34:

json
"dependencies": {
  "requests": "^2.28.0"
}

SKILL.md:117-120:

bash
### Installation Dependencies
```bash
pip3 install requests
text

### Technical Analysis

The executable imports the Python `requests` library, but the project declares `requests` under the npm `dependencies` field. npm and Python Package Index dependencies are unrelated ecosystems; therefore, an npm installation resolves an npm package named `requests`, not the Python library used by `tools/finance_data.py`.

This mismatch can cause package tooling to download and execute an unintended component. If the resolved npm package or one of its transitive dependencies contains lifecycle scripts, those scripts may execute during `npm install` with the privileges of the user or automation account performing the installation.

The documented Python installation also uses `pip3 install requests` without an exact version, lock file, or cryptographic hashes. Consequently, installations are not reproducible and may retrieve a different release than the version reviewed by the project maintainer.

### Attack Path

1. A user, CI workflow, or Skill installation platform processes `package.json` and runs `npm install`.
2. npm interprets `"requests": "^2.28.0"` as an npm package requirement rather than a Python dependency.
3. npm downloads the matching package and its transitive dependencies from the configured npm registry.
4. Any permitted dependency lifecycle scripts execute under the installer account.
5. A compromised or malicious dependency could access files, environment variables, network resources, and other capabilities available to that accou
...[truncated 1236 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the npm dependency because the executable uses Python rather than Node.js:

    json
    "dependencies": {}
    

    If Node.js is not required at all, remove package.json or retain it only as metadata without npm dependencies or installation hooks.

  2. Declare the Python dependency in a Python-native dependency file, such as requirements.txt or pyproject.toml.

  3. Pin the dependency to an exact, reviewed version rather than using an unconstrained installation command:

    text
    requests==<reviewed-version>
    
  4. Generate and verify cryptographic hashes for the package and its transitive dependencies. For example, use a locked requirements file and install with:

    bash
    python3 -m pip install --require-hashes -r requirements.lock
    
  5. Commit the lock file to source control and update it through a controlled dependency-review process.

  6. Use an isolated virtual environment and avoid installing dependencies as root or into the system Python environment.

  7. In CI, restrict package installation network access, use a trusted internal package mirror where appropriate, disable unnecessary npm lifecycle scripts, and grant installation jobs only the minimum required credentials.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill documentation is written in Chinese throughout, and there is no indication that users can choose another language or that the skill is intentionally limited to a Chinese-speaking or region-specific audience. This creates a natural-language policy concern because it effectively imposes a language/locale requirement without opt-in or justification.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill metadata declares required binaries and describes network-backed data retrieval and outbound push delivery, but it does not define an explicit permission or allowed-tools scope. That creates an authorization gap where network access is implied rather than transparently constrained, increasing the chance of over-broad execution or unexpected external communication.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill explicitly supports scheduled pushes to DingTalk/WeChat but does not clearly warn users that it can automatically send outbound messages and transmit data on a schedule. This can lead to unintended disclosure, spam, or surprise external communications, especially when run unattended via cron.

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 includes user-facing natural language that forces a specific language/locale experience via the module description and later report strings, with no opt-in or alternative language path. The policy explicitly flags language or locale constraints when the skill does not offer user choice or justify the restriction as region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The natural-language description forces a specific language presentation for the skill metadata and user-facing documentation. Under the policy, language constraints should either be optional for the user or explicitly justified as region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The package description is written only in Chinese, which may impose a language choice on users without offering an alternative or opt-in. The policy calls for flagging language or locale constraints when they are forced rather than explicitly selectable or clearly justified.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 33)May include surrounding context.

json
"python": ">=3.8"
  },
  "dependencies": {
    "requests": "^2.28.0"
  }
}