Back to skill

Security audit

Butler

Security checks across malware telemetry and agentic risk

Overview

This skill is a disclosed local budgeting and GPU accounting tool with sensitive optional features that require explicit setup or invocation.

Install from a reviewed commit or local clone rather than a floating npx/GitHub command. Use a dedicated private BUTLER_ROOT, keep the dashboard on loopback, do not run it as root, and enable transcript scanning, local process inspection, or SSH collection only for machines and data you control.

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
README.md:9
Finding
Unpinned npm Package and Mutable Repository Used in Installation Command## Vulnerability Details **File Location**: `README.md:9` **Vulnerability Type**: Unpinned third-party dependency and mutable remote source **Risk Level**: Medium **Vulnerable Code**: ```sh With the skills CLI: `npx skills add https://github.com/AntreasAntoniou/butler-agent-skill --skill butler`. This installer requires Node/network access; inspect the repository before installing. ``` ### Technical Analysis The documented installation command invokes `npx skills` without specifying an exact package version. If the package is not already installed locally, `npx` may retrieve and execute the package version currently resolved by the npm registry. The GitHub repository is also referenced without an immutable commit identifier or verified release artifact. Consequently, the effective installation code can change after this Skill version has been audited. Advising users to inspect the repository does not ensure that the npm package or repository revision executed during installation is identical to the reviewed version. This is a supply-chain weakness rather than evidence that the current bundled source is malicious. No malicious dependency, external payload, or compromise was identified in the audited artifact. ### Attack Path 1. An attacker compromises the npm package, maintainer account, registry publication process, GitHub account, or repository default branch. 2. The attacker publishes or commits a modified installer or Skill payload. 3. A user follows the documented unpinned `npx skills add` command. 4. `npx` resolves and executes the mutable package version, which retrieves the mutable repository revision. 5. The compromised installer or retrieved code executes or is installed with the invoking user's permissions. ### Impact Assessment A compromised installer could execute arbitrary code with the privileges of the user running `npx`. This could permit access to user-readable files, modification of the user's Ski ...[truncated 371 chars]
Remediation
## Remediation Suggestions 1. Pin the npm CLI package to an exact reviewed version, for example `npx skills@X.Y.Z`, and avoid floating tags such as `latest`. 2. Pin the GitHub source to an immutable, reviewed commit or cryptographically signed release rather than the repository's mutable default branch. 3. Publish SHA-256 checksums for release archives and instruct users to verify them before installation. 4. Prefer a package-lock-backed local installation or another mechanism that verifies dependency integrity before execution. 5. Provide a non-executing manual installation option that downloads a fixed release artifact for inspection before any scripts run. 6. Document the exact npm package version, repository commit, expected hashes, and signature-verification procedure used for each Skill release.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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 (5)

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill text directs use of local scripts, state changes, dashboard access, and optional SSH/process inspection, which imply meaningful capabilities such as shell, file I/O, environment access, and possibly network use. Because no permissions are explicitly declared, a user or platform cannot accurately assess or constrain what the skill may do, increasing the risk of unintended file modification, data exposure, or local command execution.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
The skill description emphasizes local budgeting and dashboarding, but the collect path reaches out to remote machines over SSH and stores returned data locally. This expands the trust boundary and data-access scope beyond a local-only budgeting tool, increasing the chance of unintended remote data access or execution against misconfigured hosts.

Context-Inappropriate Capability

High
Confidence
93% confidence
Finding
The REMOTE_COLLECTOR feature sends executable Python over SSH and runs it on remote systems, which is remote code execution capability. Even if intended for inventory collection, embedding an RCE path in a budgeting tool materially increases blast radius if configuration is abused, the wrong host is targeted, or users do not realize code will run remotely.

Context-Inappropriate Capability

Medium
Confidence
87% confidence
Finding
The panel can enumerate local running Claude processes, TTYs, uptime, and operator metadata from `FLEET.md`, which reveals information about other local sessions unrelated to the core budgeting function. In a multi-user or shared workstation context, this creates unnecessary local surveillance and information disclosure risk, especially because mission descriptions may contain sensitive project details.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
At the call site, the tool silently transmits locally derived configuration values and retrieves usage data from another machine without an immediate warning or interactive acknowledgement. In the context of a tool marketed as local budgeting, that lack of disclosure can lead operators to expose metadata or run remote actions they did not expect.

VirusTotal

64/64 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

Detected: suspicious.dynamic_code_execution

Dynamic code execution detected.

Critical
Code
suspicious.dynamic_code_execution
Location
tests/test_runtime.py:73