Back to skill

Security audit

SpielerPlus Scraper

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed SpielerPlus/TeamPlus scraper that uses provided account credentials to fetch team data, with privacy and dependency-hygiene caveats but no evidence of hidden or malicious behavior.

Install only if you are authorized to access the SpielerPlus/TeamPlus account and team data involved. Treat the credentials and scraped outputs as sensitive, avoid committing .env files, avoid dumping full financial or absence data into shared logs, and consider pinning dependencies or using a reviewed lockfile before running it in shared or production environments.

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
examples/example-docker.md:7
Finding
Mutable and Unlocked Third-Party Dependencies Permit Supply-Chain Substitution<![CDATA[ ## Vulnerability Details **File Location**: `examples/example-docker.md:7-9`; supporting dependency declarations at `package.json:38-43` and installation instructions at `SKILL.md:41-43` **Vulnerability Type**: Supply-chain exposure through unpinned dependencies **Risk Level**: Medium ### Vulnerable Code `examples/example-docker.md:7-9`: ```dockerfile RUN npm install playwright && npx playwright install chromium COPY . . RUN npm install ``` `package.json:38-43`: ```json "dependencies": { "playwright": "^1.40.0", "dotenv": "^16.0.0" }, "devDependencies": { "standard-version": "^9.5.0" } ``` `SKILL.md:41-43`: ```bash # Install dependencies npm install ``` ### Technical Analysis The project does not include a package lockfile, while its declared dependencies use mutable caret ranges. Consequently, `npm install` can resolve package versions that differ from those reviewed during this audit. The Docker example introduces additional exposure by installing `playwright` without any version constraint and then invoking its CLI through `npx`. This makes the effective build dependent on the state of the package registry at build time. Installation lifecycle scripts and executed package CLIs can run arbitrary code during the image build. The application later loads `playwright` and `dotenv` in the same process that holds `SPIELERPLUS_EMAIL` and `SPIELERPLUS_PASSWORD`. If a resolved dependency were compromised, malicious runtime code could read those credentials and access the authenticated browser session. No evidence indicates that the currently named packages are malicious. The vulnerability is the absence of reproducible dependency resolution and the execution of mutable third-party code. ### Attack Path 1. An attacker compromises a permitted future release of a dependency, its publishing account, or the relevant package-distribution channel. 2. A user follows the documented Docker or Skill installation procedure. 3. `npm install playwrigh ...[truncated 1455 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Generate and commit a reviewed `package-lock.json`. 2. Replace deployment and container-build uses of `npm install` with `npm ci` so installation fails if dependency metadata and the lockfile disagree. 3. Pin direct dependencies to exact reviewed versions instead of mutable caret ranges: ```json "playwright": "1.40.0", "dotenv": "16.0.0" ``` 4. Remove the separate unversioned installation from the Docker example. Install from the lockfile and invoke the project-local binary: ```dockerfile COPY package.json package-lock.json ./ RUN npm ci --omit=dev RUN ./node_modules/.bin/playwright install chromium COPY . . ``` 5. Pin the Docker base image by immutable digest rather than relying only on `node:20-alpine`. 6. Review dependency changes before updating the lockfile and use automated vulnerability and provenance checks in CI. 7. Run build and runtime stages as non-root users with minimal filesystem and network permissions. 8. Avoid exposing credentials during image creation. Supply them only at runtime through a protected secret-management mechanism. 9. Consider allowing outbound runtime traffic only to required SpielerPlus endpoints, reducing the exfiltration capability of a compromised dependency. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • 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 (33)

Credential Access

High
Category
Privilege Escalation
Content
```bash
npm install
cp .env.example .env
# Edit .env with your credentials
npm run teams
```
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
```bash
npm install
cp .env.example .env
# Edit .env with your credentials
npm run teams
```
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
```bash
npm install
cp .env.example .env
# Edit .env with your credentials
npm run teams
```
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
```bash
npm install
cp .env.example .env
# Edit .env with your credentials
npm run teams
```
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
### Required Setup

1. **npm Token** (GitLab CI/CD Variable: `NPM_TOKEN`)
   - https://www.npmjs.com → Profile → Access Tokens → Create Automation Token

2. **ClawHub** (optional, automatic)
   - Uses `clawdhub` in CI
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Ae1

High
Category
analysis-evasion
Content
const SpielerPlusScraper = require('./src/index.js');
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding
The skill uses 'env' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Scope Creep

High
Confidence
97% confidence
Finding
The file calls require('dotenv').config() and reads process.env despite the manifest declaring only network permission. In a constrained agent platform, undeclared local environment access can expose unrelated secrets from the host runtime and expands the trust boundary beyond what users expect from a network-only scraping skill.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The README explicitly promotes extraction of team members, absences, finances, participation statistics, and profile data, all of which may contain personal or financial information, but gives no meaningful privacy, consent, retention, or sharing guidance. In a scraping tool with network access, this omission increases the likelihood of unauthorized collection, overexposure, or mishandling of sensitive team data.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The README instructs users to place account credentials in a `.env` file or export them as environment variables without warning about secret hygiene such as excluding `.env` from version control, avoiding credential reuse, and protecting local/CI environments. Because the skill accesses a real third-party account, weak guidance here can lead to credential leakage and subsequent account compromise.

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.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The documentation instructs users to provide live account credentials and describes access to potentially sensitive team data such as members, absences, finances, roles, and profiles, but it does not warn about privacy, least-privilege use, or secure credential handling. This increases the chance that users expose personal or financial data without understanding the sensitivity or validating how the scraper stores, transmits, or outputs that information.

Rp1

Medium
Category
MCP Rug Pull
Confidence
90% confidence
Finding
The Docker example runs `npx playwright install chromium` without pinning the Playwright package version, which can cause non-reproducible builds and expose users to unexpected upstream changes or a compromised dependency release at build time. In a network-enabled scraping skill that relies on browser automation, this increases supply-chain risk because the container fetches code during build from the public registry.

Rp1

Medium
Category
MCP Rug Pull
Confidence
75% confidence
Finding
Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The example instructs users to pass account credentials via environment variables without any warning about secure handling, shell history exposure, CI/CD logging, or safer alternatives. In the context of a scraper for a team-management platform, these credentials likely grant access to personal and organizational data, so careless handling could lead to account compromise or privacy exposure.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The example retrieves and prints potentially sensitive team data including members, finances, participation, and profile details directly to stdout. In real environments, console output may be captured by logs, CI systems, terminals, or shared shells, causing unintended disclosure of personal or financial information.

Vague Triggers

Medium
Confidence
81% confidence
Finding
This is a manifest file, so vague-trigger review applies. The description says 'Generic SpielerPlus/TeamPlus scraper for team management data,' which is broad and does not define when the skill should or should not be invoked, increasing the risk of matching loosely related requests about team data.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
For markdown files and code files, missing-warning findings should cover behaviors affecting privacy or user data; this manifest description indicates scraping team management data, which commonly includes personal, schedule, attendance, or financial information. The package metadata provides no disclosure about handling sensitive data, authentication, or privacy implications.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
This code exposes potentially sensitive organizational data such as team members, absences, finances, participation, roles, and profile details directly to stdout and via JSON output. Although the operations are part of the scraper's purpose, the CLI provides no warning that personal or financial data may be displayed or exported, which is a missing disclosure for safety-sensitive data handling.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The manifest describes a network scraper for the SpielerPlus/TeamPlus platform, but the code also loads a local .env file and reads process environment variables for secrets. Accessing local configuration/secrets is a separate capability from scraping and is not declared in the skill purpose or permissions.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The code reads login credentials from environment variables and then uses them to authenticate to an external service, but there is no confirmation prompt, user-facing log, or warning to disclose that account credentials will be used for automated access. Because this skill also navigates authenticated pages and extracts team data, users are not clearly informed in-code about the privacy-sensitive nature of the operation.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill enumerates and extracts sensitive organizational data including members, absences, finances, participation, roles, and team profile information. In an agent setting, bulk collection of personal and financial team data without scoped consent, minimization, or access controls increases the risk of privacy violations and over-collection well beyond a narrowly tailored scraping function.

Missing User Warnings

Low
Confidence
81% confidence
Finding
This markdown file instructs the user to copy an environment file and edit it with credentials, but it provides no warning about protecting secrets, avoiding commits, or the fact that the skill will use sensitive account data. Because markdown files should disclose behaviors affecting privacy or sensitive data, this is a missing warning.

Lp4

Low
Category
MCP Least Privilege
Confidence
65% confidence
Finding
Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.

Missing User Warnings

Low
Confidence
83% confidence
Finding
The code accesses `SPIELERPLUS_EMAIL` and `SPIELERPLUS_PASSWORD`, which are sensitive credentials, but provides no user-facing disclosure about credential usage or handling. Comments only note initialization and optional team selection, not that authentication secrets are being consumed.

Static analysis

No suspicious patterns detected.