Back to skill

Security audit

Vestaboard

Security checks for vulnerabilities and agentic risk

Overview

The skill appears intended for Vestaboard control, but it needs review because it can post to a physical board, upload arbitrary local JSON files, and forward credentials to a configurable API endpoint.

Install only if you trust the runtime environment and understand that write commands can immediately change a Vestaboard display. Keep tokens scoped and private, avoid setting VESTABOARD_API_BASE unless you fully control the endpoint, and use write-layout only with known layout files from the skill directory until path and layout validation are added.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/vb.js:5
Finding
Unrestricted API Endpoint Override Can Expose Vestaboard Credentials## Vulnerability Details **File Location**: `scripts/vb.js:5`, `scripts/vb.js:72-115` **Vulnerability Type**: Arbitrary credential forwarding through an unvalidated API endpoint **Risk Level**: High ### Vulnerable Code ```js const API_BASE = (process.env.VESTABOARD_API_BASE || 'https://cloud.vestaboard.com/').replace(/\/+$/, '/'); ``` ```js async function vbRead() { const headers = authHeaders(); if (!headers) throw new Error('Missing VESTABOARD_TOKEN (preferred) or VESTABOARD_RW_KEY (legacy)'); const res = await request(API_BASE, { method: 'GET', headers: { ...headers, 'Content-Type': 'application/json' } }); const body = await res.body.text(); if (res.statusCode >= 400) throw new Error(`HTTP ${res.statusCode}: ${body}`); process.stdout.write(body + (body.endsWith('\n') ? '' : '\n')); } async function vbWriteText(text) { const headers = authHeaders(); if (!headers) throw new Error('Missing VESTABOARD_TOKEN (preferred) or VESTABOARD_RW_KEY (legacy)'); const lines = wrapToLines(text); const payload = JSON.stringify({ text: linesToText(lines) }); const res = await request(API_BASE, { method: 'POST', headers: { ...headers, 'Content-Type': 'application/json' }, body: payload }); const body = await res.body.text(); if (res.statusCode >= 400) throw new Error(`HTTP ${res.statusCode}: ${body}`); process.stdout.write(body + (body.endsWith('\n') ? '' : '\n')); } async function vbWriteLayout(path) { const headers = authHeaders(); if (!headers) throw new Error('Missing VESTABOARD_TOKEN (preferred) or VESTABOARD_RW_KEY (legacy)'); const raw = readFileSync(path, 'utf8'); const layout = JSON.parse(raw); const payload = JSON.stringify(layout); const res = await request(API_BASE, { method: 'POST', headers: { ...headers, 'Content-Type': 'application/json' }, body: payload ...[truncated 2326 chars]
Remediation
## Remediation Suggestions 1. Remove `VESTABOARD_API_BASE` configurability unless custom endpoints are an explicit operational requirement. 2. If endpoint selection is required, parse the value with `new URL()` and require the `https:` protocol. 3. Allowlist only documented Vestaboard hosts, such as the official Cloud API host and any explicitly supported legacy host. 4. Reject URLs containing embedded user information, unexpected ports, fragments, or unapproved hostnames. 5. Disable or strictly validate redirects so authentication headers cannot be forwarded to another origin. 6. Keep cloud and legacy endpoint selection explicit and bind each authentication-header type to its intended trusted hostname. 7. Fail closed when endpoint validation fails, before constructing or transmitting authentication headers. 8. Validate layout input as exactly six arrays of twenty-two permitted integer character codes before transmission. This does not resolve credential forwarding, but it limits malformed or unintended data disclosure. 9. Add automated tests confirming that HTTP URLs, unknown hosts, alternate ports, and redirect-based origin changes are rejected.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (18)

Known Vulnerable Dependency: undici==7.20.0 — 16 advisory(ies): CVE-2026-1525 (Undici has an HTTP Request/Response Smuggling issue); CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-1527 (Undici has CRLF Injection in undici via `upgrade` option) +13 more

High
Category
Supply Chain
Confidence
97% confidence
Finding
The lockfile pins undici to 7.20.0, and the supplied advisories indicate this version is affected by multiple known vulnerabilities including request/response smuggling, response queue poisoning, and CRLF injection. Because this skill performs outbound HTTP communication to the Vestaboard Cloud API, a vulnerable HTTP client library directly affects the trust boundary for network requests and could enable request manipulation, response confusion, or header injection in certain deployment and proxy scenarios.

Known Vulnerable Dependency: undici==7.20.0 — 16 advisory(ies): CVE-2026-1525 (Undici has an HTTP Request/Response Smuggling issue); CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-1527 (Undici has CRLF Injection in undici via `upgrade` option) +13 more

High
Category
Supply Chain
Confidence
88% confidence
Finding
The dependency range ^7.3.0 can resolve to undici 7.20.0, and the finding indicates that version carries multiple high-severity advisories including request/response smuggling, response queue poisoning, and CRLF injection. Because this skill is designed to interact with a cloud API over HTTP, using a vulnerable HTTP client is relevant to its normal operation and could expose requests, headers, or connection reuse behavior to exploitation under certain network or upstream conditions.

Lp3

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding
The skill explicitly relies on environment-provided secrets (`VESTABOARD_TOKEN` and optional `VESTABOARD_RW_KEY`) but does not declare any tool scope or permission boundary for environment access. In agent environments, undeclared env access can broaden the skill’s effective privileges, making it easier for the skill or adjacent code to read sensitive variables without clear operator approval or isolation.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,67,67],
  [67,66,66,66,69,69,66,66,69,69,66,66,69,69,66,66,69,69,66,66,66,67],
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,67,67],
  [67,66,66,66,69,69,66,66,69,69,66,66,69,69,66,66,69,69,66,66,66,67],
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,67,67],
  [67,66,66,66,69,69,66,66,69,69,66,66,69,69,66,66,69,69,66,66,66,67],
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,68],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66]
]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,68],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66]
]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,68],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66]
]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,68],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66]
]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,68],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66]
]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,68],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66]
]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,68],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66]
]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Context Window Stuffing

Medium
Category
Memory Poisoning
Content
[68,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,68],
  [67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67,67],
  [67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67,67,66,67],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66],
  [66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66,66]
]
Confidence
80% confidence
Finding
Skill attempts to fill the context window with filler content, displacing legitimate instructions and safety constraints. This can degrade agent performance or bypass safety boundaries.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The script sends arbitrary user-provided text directly to the Vestaboard Cloud API, causing an external side effect without any confirmation, policy check, or guardrail. In an agent setting, this can be abused through prompt injection or accidental invocation to display misleading, harassing, or unauthorized messages on a physical sign.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The write-layout command reads a local file and uploads its contents to the Vestaboard API without confirmation or restriction. In an agent environment, an attacker could trick the system into selecting a sensitive local file path, turning this into local file exfiltration to a third-party service, in addition to causing unauthorized board updates.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"lint": "node -c scripts/vb.js"
  },
  "dependencies": {
    "undici": "^7.3.0"
  }
}
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Natural-Language Policy Violations

Low
Confidence
76% confidence
Finding
Line L4 uses natural language to prescribe uppercase normalization as a recommended behavior. This can be a language/locale policy concern because it imposes a presentation convention without stating that users can opt in or override it.

Static analysis

No suspicious patterns detected.