Back to skill

Security audit

DTEK Light

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly does the advertised power-outage check, but it locates executable code by searching the agent's skills directory and uses mutable Playwright install steps, so it should be reviewed before installation.

Install only if you are comfortable with a skill that runs local JavaScript and uses a browser to query DTEK for the disclosed address. Prefer a revised version that invokes its bundled script by a fixed relative path, pins Playwright with a lockfile, and avoids broad trigger phrases.

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:10
Finding

Mutable Playwright Dependency and Executable Installation Tooling

Content
View full analysis

Vulnerability Details

File Location: package.json:10-12; related installation instructions in SKILL.md:17-22
Vulnerability Type: Supply-chain exposure through an unpinned executable dependency
Risk Level: Medium

Vulnerable Code

package.json:10-12:

json
"dependencies": {
  "playwright": "^1.50.0"
}

SKILL.md:17-22:

bash
npm install playwright
npx playwright install chromium

Technical Analysis

The dependency declaration uses the caret range ^1.50.0, allowing npm to resolve later compatible Playwright releases instead of requiring one specifically reviewed version. The documented npm install playwright command is even less restrictive because it requests the current package release without specifying a version.

The following npx playwright install chromium command executes Playwright's installation tooling and downloads a browser artifact. Without a committed lockfile and a workflow that enforces it, the package code and browser artifact installed at a later date may differ from those present during this audit.

This is a supply-chain hardening deficiency rather than evidence that the current Playwright package is malicious. Exploitation requires compromise or malicious modification of an upstream package, registry response, dependency resolution path, or associated browser-distribution infrastructure.

Attack Path

  1. An attacker compromises an allowed future Playwright release, its dependency chain, the package registry delivery path, or related artifact infrastructure.
  2. A user follows the documented instruction npm install playwright, or installs dependencies from package.json without an enforced lockfile.
  3. npm resolves and installs mutable package content that was not the version reviewed with this project.
  4. The user runs npx playwright install chromium, causing package-provided tooling to execute and retrieve a browser artifact.
  5. Compro ...[truncated 692 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin Playwright to an exact reviewed version rather than a caret range:

    json
    "dependencies": {
      "playwright": "1.50.0"
    }
    
  2. Generate, review, and commit package-lock.json, including its integrity metadata.

  3. In automated and documented installation workflows, use:

    bash
    npm ci
    npx --no-install playwright install chromium
    

    npm ci enforces the committed dependency graph, while --no-install prevents npx from silently downloading another package when the local executable is unavailable.

  4. Replace the unversioned instruction npm install playwright with installation from the reviewed lockfile.

  5. Use a trusted npm registry, retain TLS verification, and monitor Playwright and transitive dependencies for advisories or unexpected ownership and release changes.

  6. Perform installation and browser execution as an unprivileged user in an isolated environment where feasible.

  7. Review lockfile changes and browser artifact updates before accepting dependency upgrades.

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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (9)

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
99% confidence
Finding

The command searches ~/.claude/skills to locate and execute check-light.js, giving the skill access to the agent's configuration/skill directory rather than using a fixed local path. This creates a dangerous trust boundary violation: an attacker who can place or influence files under that directory could cause arbitrary code execution, and the directory enumeration itself exposes sensitive local agent structure.

Content

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

  1. Запусти скрипт проверки. Скрипт находится рядом с этим SKILL.md:
bash
node "$(dirname "$(find ~/.claude/skills -name 'check-light.js' -path '*dtek-light*' | head -1)")/check-light.js"
  1. Скрипт вернет JSON с полем status. Интерпретируй результат:

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The listed invocation phrases include very generic everyday questions such as "что по свету?", "есть свет?", and "когда включат свет?" without additional scope constraints. Because the skill is tied to one specific address, these broad phrases could cause unintended activation when a user is asking generally about electricity rather than this exact location.

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.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
98% confidence
Finding

Using find ~/.claude/skills enumerates the agent's installed skills and filesystem layout, which unnecessarily discloses local environment metadata and expands the attack surface. In this context, enumeration is coupled with selecting the first matching script for execution, making the behavior more dangerous because discovery directly feeds into code execution.

Content

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

  1. Запусти скрипт проверки. Скрипт находится рядом с этим SKILL.md:
bash
node "$(dirname "$(find ~/.claude/skills -name 'check-light.js' -path '*dtek-light*' | head -1)")/check-light.js"
  1. Скрипт вернет JSON с полем status. Интерпретируй результат:

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The instructions prescribe exact response text in Russian for all outcomes, but the skill does not ask for or honor the user's language preference. This is a natural-language policy concern because it forces a specific language rather than offering a choice or matching the user's locale explicitly.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code explicitly sets the Playwright browser context locale to "uk-UA", which enforces a specific language/locale behavior. The file does not offer user opt-in or a configurable locale, and no region-specific compliance justification is documented here.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The setup script invokes npx playwright install chromium without pinning the package version in the command, which allows npx to resolve and execute whatever Playwright release is selected at install time. In a supply-chain or registry compromise scenario, this can lead to execution of unintended code during setup, and this skill is more exposed because the command is designed to download and install external browser binaries.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The dependency playwright is declared with a caret range (^1.50.0), so installs may pull newer minor/patch releases than the one reviewed. This weakens reproducibility and increases supply-chain risk, especially for a package that executes browser automation and participates in downloading browser binaries during setup.

Content

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

json
"setup": "npx playwright install chromium"
  },
  "dependencies": {
    "playwright": "^1.50.0"
  }
}

Unverifiable Dependency: playwright has 1 known advisory(ies) (CVE-2025-59288 (Playwright downloads and installs browsers without verifying the authenticity of)), 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

The manifest uses an unpinned Playwright version while the package family has a known advisory related to downloading/installing browsers without authenticity verification. Because the exact installed version is not fixed, consumers cannot determine whether they are exposed, and this is particularly relevant here because the skill's setup explicitly performs a browser download.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.