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## 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
## 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
Content
1. Запусти скрипт проверки. Скрипт находится рядом с этим SKILL.md:

```bash
node "$(dirname "$(find ~/.claude/skills -name 'check-light.js' -path '*dtek-light*' | head -1)")/check-light.js"
```

2. Скрипт вернет JSON с полем `status`. Интерпретируй результат:
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.

Vague Triggers

Medium
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.

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.

Skill Enumeration

Medium
Category
Agent Snooping
Content
1. Запусти скрипт проверки. Скрипт находится рядом с этим SKILL.md:

```bash
node "$(dirname "$(find ~/.claude/skills -name 'check-light.js' -path '*dtek-light*' | head -1)")/check-light.js"
```

2. Скрипт вернет JSON с полем `status`. Интерпретируй результат:
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.

Natural-Language Policy Violations

Medium
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.

Natural-Language Policy Violations

Medium
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.

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.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"setup": "npx playwright install chromium"
  },
  "dependencies": {
    "playwright": "^1.50.0"
  }
}
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.

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.

Static analysis

No suspicious patterns detected.