Back to skill

Security audit

bool-cli

Security checks for vulnerabilities and agentic risk

Overview

This skill is for a real deployment workflow, but it normalizes broad recursive uploads and confirmation-skipped deletion, which users should review carefully before installing.

Install only if you trust the bool-cli npm package and are comfortable with a global CLI. Before deploying or using shipit, deploy from a clean build/output directory or review .boolignore and exclusions so secrets are not uploaded. Require explicit confirmation and verify the slug before any bool bools delete command, despite the skill's -y guidance. Keep ~/.config/bool-cli/config.json and .bool/config private, and ensure .bool/ is ignored by version control.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (2)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:21
Finding

Unpinned Global Installation of a Third-Party npm Package

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 21-25 and 35
Vulnerability Type: Unpinned third-party dependency installed globally
Risk Level: Medium

Complete Code Snippet

yaml
install:
  - id: npm
    kind: npm
    package: bool-cli
    global: true
    bins: ["bool"]
    label: "Install bool-cli (npm)"
markdown
1. **Install**: `npm install -g bool-cli`

Technical Analysis

The Skill directs users or agents to install bool-cli globally using only its mutable npm package name. It does not pin a reviewed version, specify an integrity digest, provide a lockfile, or disable npm lifecycle scripts.

npm installation can execute package lifecycle scripts, while a global installation exposes the resulting executable throughout the user's environment. Consequently, the effective code installed by this Skill can change after the Skill has been audited. If the npm package, publisher account, or a future release is compromised, following these instructions could execute attacker-controlled code with the privileges of the user performing the installation.

No evidence in the audited file establishes that the current bool-cli package is malicious. The vulnerability is the unsafe, mutable dependency-installation practice and the associated supply-chain exposure.

Attack Path

  1. An attacker compromises the npm publisher account, package release process, or another component of the package's dependency chain.
  2. The attacker publishes a malicious version under the same bool-cli package name.
  3. An agent follows npm install -g bool-cli without selecting a previously reviewed version.
  4. npm resolves the mutable package name to the attacker-controlled release.
  5. Malicious package code may run through an installation lifecycle script or when the globally installed bool executable is invoked.
  6. The code executes with the installing user's privileges and can access ...[truncated 689 chars]
Remediation
View remediation

Remediation Suggestions

  • Pin bool-cli to a specific, reviewed version rather than resolving the latest mutable release.
  • Verify the package using a trusted integrity digest and retain a lockfile or equivalent reproducible-installation record.
  • Prefer a project-local installation over a global installation to reduce scope and prevent unintended executable replacement.
  • Run the CLI with npx --ignore-existing or an equivalent controlled mechanism only after verifying the exact package version and integrity.
  • Disable npm lifecycle scripts with --ignore-scripts where the package can function without them.
  • Verify package provenance, publisher identity, release signatures, and repository correspondence before installation.
  • Execute the package in a restricted environment with minimal filesystem, credential, and network access.

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:186
Finding

Recursive Deployment Can Upload Unexcluded Sensitive Files

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 186-195
Vulnerability Type: Overly broad recursive file upload with insufficient default exclusions
Risk Level: High

Complete Code Snippet

markdown
## Deploy Behavior

- `bool deploy` recursively reads the directory and uploads all text files
- **Auto-create Bool**: If no slug is provided (and no `.bool/config` exists), a new Bool is created automatically, named after the directory
- **Live URL**: The live deployment URL is displayed in the output after successful deployment
- **Binary files** (images, PDFs, archives, fonts, etc.) are automatically skipped
- **Default excludes**: `.git`, `node_modules`, `__pycache__`, `.DS_Store`, `.bool`
- **Custom excludes**: Use `--exclude <pattern>` (repeatable) for additional patterns
- **`.boolignore`**: If a `.boolignore` file exists in the deploy directory, it is respected (gitignore syntax)
- File paths in the payload are **relative** to the deploy directory

Technical Analysis

The documented deployment behavior recursively reads and uploads every text file beneath the selected directory unless a file matches a limited exclusion list. The default exclusions do not cover common sensitive files such as .env, .env.local, private keys, cloud-provider credentials, SSH configuration, package-manager credentials, database exports, local application configuration, or secret-manager exports.

Filtering by text-versus-binary format is not a security boundary because credentials, tokens, source code, private keys, and configuration secrets are commonly stored as text. Custom exclusions and .boolignore are optional, so safe behavior depends on users anticipating every sensitive file before deployment.

Deployments also have a live URL, and the Skill supports public and unlisted visibility. Therefore, an unintentionally uploaded secret may be transferred to Bool.com and could become accessible ...[truncated 1778 chars]

Remediation
View remediation

Remediation Suggestions

  • Replace recursive allow-by-default collection with a default-deny policy that uploads only explicitly selected build artifacts.
  • Display the complete file manifest before transmission and require explicit confirmation for files outside expected deployment directories.
  • Add default exclusions for .env, .env.*, *.pem, *.key, *.p12, *.pfx, credentials.json, service-account files, .npmrc, .pypirc, .netrc, .ssh/, .aws/, .azure/, .config/gcloud/, database dumps, and backup files.
  • Run secret scanning against the upload manifest and block deployment when likely credentials or private keys are detected.
  • Recommend deploying a clean build-output directory rather than a repository root or home directory.
  • Default new deployments to private visibility and require explicit authorization before changing them to public or unlisted.
  • Clearly warn that .boolignore must be reviewed before every deployment and provide a secure template.
  • Support a dry-run mode that reports included and excluded files without uploading anything.
  • Document immediate credential revocation and rotation procedures for accidental deployments.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (4)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly instructs agents to use -y with a destructive delete operation, removing an interactive safety check without requiring any compensating confirmation step. In an agent context, this increases the chance of accidental or unauthorized remote resource deletion, especially if the slug is inferred from prior context or local config.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
89% confidence
Finding

The documentation normalizes autonomous execution of a destructive command by instructing agents to 'always use -y to skip prompt' for deletion. In security terms, this weakens human oversight for irreversible actions and makes accidental or context-manipulated deletions more likely in automated workflows.

Content

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

md
bool bools create <name>       # Create a new Bool
bool bools info [slug]         # Show Bool details + latest version info
bool bools update [slug] --name "New Name" --description "desc" --visibility public
bool bools delete [slug] -y    # Delete a Bool (always use -y to skip prompt)
bool bools open [slug]         # Open Bool in browser
bool bools visibility [slug]         # Show current visibility
bool bools visibility [slug] --set private    # Change visibility

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The deploy workflow describes convenience behavior but does not prominently warn that local directory contents are uploaded to a third-party remote service. In an agent setting, this can lead to unintended exfiltration of sensitive source files, configs, or proprietary content if the selected directory or exclusions are wrong.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The shipit workflow encourages anonymous publishing without a strong warning that it remotely publishes project contents and stores a reusable local secret in .bool/config. This combination can expose private code or data and leave behind credentials that enable later updates to the published site.

Content

No source excerpt is available for this finding.