Back to skill

Security audit

Bolt Sprint

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real Bolt sprint-management skill, but it gives an agent broad live write/delete access to Bolt data and sends API tokens to a user-configured URL with limited safety guardrails.

Install only if you trust the Bolt instance URL and the publisher. Use HTTPS for non-local Bolt servers, keep BOLT_API_TOKEN narrowly scoped and out of logs, avoid the unpinned npx install path unless you verify the package, and require explicit confirmation before deletes, sprint close, file deletion, or batch updates.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/bolt.sh:29
Finding
API token and project data can be transmitted over untrusted or plaintext HTTP endpoints<![CDATA[ ## Vulnerability Details **File Location**: `scripts/bolt.sh:29-70`; related insecure examples in `SKILL.md:21-30`, `README.md:57-61`, and `references/api-reference.md:3-5` **Vulnerability Type**: Unvalidated destination and insecure transport for sensitive API requests **Risk Level**: High ### Complete Code Snippet ```bash BASE="${BOLT_BASE_URL:?BOLT_BASE_URL is required}" BASE="${BASE%/}" # Strip trailing slash # Build auth header args AUTH_ARGS=() if [[ -n "${BOLT_API_TOKEN:-}" ]]; then AUTH_ARGS=(-H "x-bolt-token: $BOLT_API_TOKEN") fi # Wrapper: GET request bolt_get() { curl -sf \ "${AUTH_ARGS[@]}" \ "$BASE$1" } # Wrapper: POST request with JSON body bolt_post() { local path="$1" local body="${2:-{}}" local idem_key idem_key=$(cat /proc/sys/kernel/random/uuid 2>/dev/null || uuidgen 2>/dev/null || date +%s%N) curl -sf -X POST \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $idem_key" \ "${AUTH_ARGS[@]}" \ -d "$body" \ "$BASE$path" } # Wrapper: PATCH request with JSON body bolt_patch() { local path="$1" local body="$2" local idem_key idem_key=$(cat /proc/sys/kernel/random/uuid 2>/dev/null || uuidgen 2>/dev/null || date +%s%N) curl -sf -X PATCH \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $idem_key" \ "${AUTH_ARGS[@]}" \ -d "$body" \ "$BASE$path" } ``` The documentation explicitly recommends plaintext examples: ```bash export BOLT_BASE_URL="http://localhost:4000" export BOLT_API_TOKEN="your-token-here" ``` ### Technical Analysis `BOLT_BASE_URL` is accepted without parsing or validating its scheme, hostname, or trust boundary. When `BOLT_API_TOKEN` is present, the script forwards it in the `x-bolt-token` header to every constructed destination. Request bodies can additionally contain project details, story descriptions, notes, assignee identities, and agent activity. Network communication is necessary for the declared Bolt management functio ...[truncated 1544 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse `BOLT_BASE_URL` and require `https://` for all non-loopback destinations. 2. Permit plaintext HTTP only when the parsed host is exactly an approved loopback address such as `localhost`, `127.0.0.1`, or `[::1]`. 3. Reject malformed URLs, embedded credentials, unexpected schemes, and ambiguous host representations. 4. Add an optional explicit host allowlist for managed deployments. 5. Clearly document that `BOLT_BASE_URL` defines a trusted credential recipient and must not be derived from untrusted task content. 6. Recommend narrowly scoped, short-lived API tokens where supported. 7. Avoid exposing the token through command tracing or diagnostics, and ensure any future redirect support does not forward authentication to a different origin. 8. Replace remote plaintext examples with HTTPS examples while retaining a clearly labeled loopback-only development example. ]]>

T08 · Insecure Dependencies

Error
Location
README.md:43
Finding
Unpinned npx installation can execute registry-controlled third-party code<![CDATA[ ## Vulnerability Details **File Location**: `README.md:43-46` **Vulnerability Type**: Unpinned third-party package retrieval and execution **Risk Level**: High ### Complete Code Snippet ```markdown Or via `npx skills` (if published to the skills registry): ```bash npx skills install bolt-sprint ``` ``` ### Technical Analysis The installation command invokes the `skills` package through `npx` without an exact version or integrity constraint. If the package is absent locally, `npx` can retrieve executable package content from the configured package registry and run it under the current user account. The accompanying statement that the package should be used “if published” does not establish a verified package owner, version, or artifact digest. Consequently, the effective installation code can change after this Skill has been reviewed. This creates supply-chain exposure to package compromise, account takeover, dependency substitution, or an attacker claiming an expected but unpublished package name. The command is presented as an optional installation path and is not executed automatically by `scripts/bolt.sh`. Exploitation therefore requires a user to follow the documented command. ### Attack Path 1. An attacker publishes or compromises the registry package resolved by the unpinned `skills` name, or compromises one of its transitive dependencies. 2. A user follows the README and runs `npx skills install bolt-sprint`. 3. `npx` resolves and downloads the current registry-controlled package version. 4. Package lifecycle code or the invoked CLI executes with the user’s local permissions. 5. Malicious package code can access files and environment variables available to that user, including development credentials if present. ### Impact Assessment Successful exploitation provides arbitrary code execution with the privileges of the user running `npx`. This can expose source code, shell-accessible secrets, API tokens, SSH material, and local agent co ...[truncated 204 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the `npx` installation option until package ownership and publication status are verified. 2. Pin the installer to an exact reviewed version rather than resolving the latest available release. 3. Publish and verify package provenance, checksums, signatures, and registry ownership. 4. Lock and audit the installer’s transitive dependencies. 5. Prefer installation from the declared HTTPS repository at a reviewed commit hash or signed release tag. 6. Document how users can independently verify the downloaded artifact before execution. 7. Run third-party installation tools in a restricted environment without sensitive environment variables whenever practical. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/bolt.sh:116
Finding
Unescaped CLI arguments permit JSON request-body injection<![CDATA[ ## Vulnerability Details **File Location**: `scripts/bolt.sh:116-162` **Vulnerability Type**: Improper construction of JSON from untrusted arguments **Risk Level**: Medium ### Complete Code Snippet ```bash move) STORY_ID="${1:?Usage: bolt.sh move <storyId> <status>}" STATUS="${2:?Missing status: waiting|in_progress|completed}" bolt_post "/api/v1/stories/$STORY_ID/move" "{\"status\":\"$STATUS\"}" ;; note) STORY_ID="${1:?Usage: bolt.sh note <storyId> '<body>' [author] [kind]}" BODY="${2:?Missing note body}" AUTHOR="${3:-AI}" KIND="${4:-note}" bolt_post "/api/v1/stories/$STORY_ID/notes" \ "{\"body\":$(echo "$BODY" | jq -Rs .),\"author\":\"$AUTHOR\",\"kind\":\"$KIND\"}" ;; label-add) STORY_ID="${1:?Usage: bolt.sh label-add <storyId> <label>}" LABEL="${2:?Missing label}" bolt_post "/api/v1/stories/$STORY_ID/labels" "{\"label\":\"$LABEL\"}" ;; log-event) SESSION_ID="${1:?Usage: bolt.sh log-event <sessionId> '<message>' [type]}" MESSAGE="${2:?Missing message}" TYPE="${3:-action}" bolt_post "/api/v1/agent/sessions/$SESSION_ID/events" \ "{\"message\":$(echo "$MESSAGE" | jq -Rs .),\"type\":\"$TYPE\"}" ;; ``` ### Technical Analysis The note body and event message are encoded with `jq -Rs`, but `STATUS`, `AUTHOR`, `KIND`, `LABEL`, and `TYPE` are inserted directly between JSON quotation marks. A value containing a quotation mark, backslash, newline, or JSON delimiter can terminate the intended string and alter the resulting document. For example, a crafted value conceptually shaped like: ```text completed","unexpected":"attacker-controlled ``` changes the request from a single intended field into a JSON object containing an additional field. Depending on the endpoint’s schema enforcement and duplicate-key handling, this can create malformed requests, override intended values, or add attacker-selected properties. This flaw does not by itself produce shell-command execution because the interpolated data remains ...[truncated 1200 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Construct all JSON bodies with `jq -n` and `--arg` rather than string concatenation. For example: ```bash case "$STATUS" in waiting|in_progress|completed) ;; *) echo "Invalid status" >&2 exit 1 ;; esac payload=$(jq -n --arg status "$STATUS" '{status: $status}') bolt_post "/api/v1/stories/$STORY_ID/move" "$payload" ``` 2. Apply the same approach to notes, labels, and events: ```bash payload=$(jq -n \ --arg body "$BODY" \ --arg author "$AUTHOR" \ --arg kind "$KIND" \ '{body: $body, author: $author, kind: $kind}') ``` 3. Enforce allowlists for finite enumerations: - Status: `waiting`, `in_progress`, `completed` - Event type: `action`, `observation`, `thought`, `error` - Note kind: values explicitly supported by the Bolt API 4. Validate identifiers and labels against documented length and character constraints. 5. Add tests containing quotation marks, backslashes, newlines, Unicode, and JSON delimiters. 6. Retain strict server-side schema validation as a second defensive layer and reject unknown properties or ambiguous duplicate keys. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (19)

YARA rule 'agent_skill_mcp_tool_poisoning_metadata': MCP/tool metadata poisoning indicators in tool schemas or skill manifests [agent_skills]

High
Category
YARA Match
Content
# Bolt-skill

[![Agent Skill](https://img.shields.io/badge/agentskills.io-compatible-6366f1?style=flat-square&logo=data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik0xMiAyQTEwIDEwIDAgMCAwIDIgMTJhMTAgMTAgMCAwIDAgMTAgMTAgMTAgMTAgMCAwIDAgMTAtMTBBMTAgMTAgMCAwIDAgMTIgMm0wIDJhOCA4IDAgMCAxIDggOCA4IDggMCAwIDEtOCA4IDggOCAwIDAgMS04LTggOCA4IDAgMCAxIDgtOG0tMSA0djZsNS0zbC01LTN6Ii8+PC9zdmc+)](https://agentskills.io)
[![License: MIT](https://img.shields.io/badge/License-MIT-f59e0b?style=flat-square)](LICENSE)
[![Version](https://img.shields.io/badge/version-1.0.0-22c55e?style=flat-square)](SKILL.md)
[![Bolt API](https://img.shields.io/badge/Bolt-REST%20API-0ea5e
Confidence
80% confidence
Finding
YARA rule matched a hack tool or exploit indicator (offensive tools, reconnaissance, privilege escalation, or exploit frameworks).

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The code is broadly aligned with Bolt sprint/story management, including creating/updating stories, moving workflow state, getting digests, and logging agent activity. However, there is a notable declared-vs-actual mismatch: the description claims file attachment support, but no attachment-related endpoint or command exists in the code. The code also exposes some extra read/administrative capabilities—project/sprint/story listing, health checks, labels/notes, and audit log access—that are not mentioned in the description. The strongest mismatch is the missing declared attachment capability; the extra commands are secondary but still undeclared capabilities.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The markdown advertises capabilities such as creating, updating, deleting stories, uploading files, and running batch operations, but it does not warn users that these actions can modify or remove project data. Because this README is the user-facing skill description, it should disclose that the skill can perform write and delete actions against the Bolt system.

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.

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.

External Transmission

Medium
Category
Data Exfiltration
Content
**Batch-close multiple stories**
```bash
curl -s -X POST -H "Content-Type: application/json" \
  ${BOLT_API_TOKEN:+-H "x-bolt-token: $BOLT_API_TOKEN"} \
  -d '{"items":[{"id":"s1","status":"completed"},{"id":"s2","status":"completed"}]}' \
  "$BOLT_BASE_URL/api/v1/stories/batch/move"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
export BOLT_API_TOKEN="your-token-here"         # Optional: only needed if server was started with BOLT_API_TOKEN
```

The base curl pattern for authenticated requests:

```bash
curl -s \
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The documentation includes POST and PATCH examples that mutate remote project data but does not clearly warn users that these commands perform live write operations. In an agent setting, this increases the chance of unintended state changes, duplicate actions, or accidental workflow manipulation when examples are copied or executed automatically.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
This markdown API reference describes project deletion, including a `force=true` option that can remove projects even when related sprints or stories exist, but it provides no warning about data loss or irreversible effects. Under the markdown-file criteria, destructive behaviors that could affect user data should include an explicit warning.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The documentation states `DELETE /api/v1/stories/{id}` deletes a story, but it does not warn users that the action may permanently remove user data. For markdown skill documentation, destructive operations should be accompanied by clear cautions so users understand the impact before invoking them.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The API reference documents `DELETE /api/v1/files/{id}` without any caution that deleting a file can affect user data and system integrity by removing uploaded artifacts or their records. Markdown documentation for such behaviors should clearly disclose destructive consequences.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# 1. Verify connection
curl -s "$BOLT_BASE_URL/health"

# 2. List projects
curl -s \
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
These examples include sprint lifecycle operations such as creation, start, and close that go beyond the stated skill scope of managing stories and sprint workflows as described in the metadata. Undocumented write capabilities are risky because they let an agent perform irreversible or high-impact project-management actions that a user may not realize the skill can take.

External Transmission

Medium
Category
Data Exfiltration
Content
SPRINT_ID=$(echo $SPRINT | jq -r '.id')

# 2. Create stories for the sprint
curl -s -X POST \
  -H "Content-Type: application/json" \
  ${BOLT_API_TOKEN:+-H "x-bolt-token: $BOLT_API_TOKEN"} \
  -H "Idempotency-Key: $(uuidgen)" \
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The batch update examples demonstrate wide-impact state changes across multiple stories without a strong warning, approval step, or mandatory dry-run flow. In an agent setting, this increases the chance of accidental mass modification, causing broad workflow disruption, loss of planning integrity, or unauthorized reassignment/completion of work items.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The workflow documentation exposes access to an audit-log endpoint that is not described in the skill manifest, expanding the skill's effective capabilities beyond what a user or reviewer would expect. Hidden or undocumented read access is dangerous because an agent may retrieve sensitive operational history, actor activity, or metadata without explicit consent or review.

External Transmission

Medium
Category
Data Exfiltration
Content
local body="${2:-{}}"
  local idem_key
  idem_key=$(cat /proc/sys/kernel/random/uuid 2>/dev/null || uuidgen 2>/dev/null || date +%s%N)
  curl -sf -X POST \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: $idem_key" \
    "${AUTH_ARGS[@]}" \
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
local body="$2"
  local idem_key
  idem_key=$(cat /proc/sys/kernel/random/uuid 2>/dev/null || uuidgen 2>/dev/null || date +%s%N)
  curl -sf -X PATCH \
    -H "Content-Type: application/json" \
    -H "Idempotency-Key: $idem_key" \
    "${AUTH_ARGS[@]}" \
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Low
Confidence
78% confidence
Finding
The README instructs users to export `BOLT_API_TOKEN`, which is a credential, but it does not include any caution about protecting the token or avoiding exposure in shared shells/logs. For markdown files, credential-related behavior should be accompanied by a brief warning when it may affect privacy or system integrity.

Static analysis

No suspicious patterns detected.