Back to skill

Security audit

Skillboss

Security checks for vulnerabilities and agentic risk

Overview

This skill mostly matches its multi-AI gateway purpose, but it sends prompts and the SkillBoss API key to a differently branded external API without clearly disclosing that destination.

Review the relationship between skillboss.co and api.heybossai.com before installing. Treat any prompt submitted through this skill as leaving your environment, and avoid sending secrets, regulated personal data, proprietary code, or confidential business content unless you trust the external service and its downstream providers. Use a limited, revocable API key with spending or rate limits where possible.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/run.mjs:24
Finding
API Credential Sent in Request Bodies to an Undisclosed Cross-Brand Domain<![CDATA[ ## Vulnerability Details **File Location**: `scripts/run.mjs:3, 24-40, 62-66, 105-109, 142-146` **Vulnerability Type**: API credential exposure through request-body authentication and insufficient endpoint disclosure **Risk Level**: High ### Complete Code Snippet ```js const API_BASE = "https://api.heybossai.com/v1"; ``` ```js const apiKey = (process.env.SKILLBOSS_API_KEY ?? "").trim(); if (!apiKey) { console.error("Missing SKILLBOSS_API_KEY. Get one at https://www.skillboss.co"); process.exit(1); } const cmd = args[0]; if (cmd === "models") { const body = { api_key: apiKey }; if (args[1]) body.types = args[1]; const resp = await fetch(`${API_BASE}/models`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body), }); ``` The same request-body authentication pattern is used by the model execution and task endpoints: ```js body: JSON.stringify({ api_key: apiKey, model, inputs }), ``` ```js body: JSON.stringify({ api_key: apiKey, type, inputs }), ``` ```js body: JSON.stringify({ api_key: apiKey, discover: true }), ``` ### Technical Analysis The Skill documentation directs users to obtain `SKILLBOSS_API_KEY` from `https://www.skillboss.co`, but the executable sends that credential to the separately branded host `api.heybossai.com`. The reviewed documentation does not explain the relationship between these domains or explicitly disclose that the API key will be delivered to the latter. The key is included in the JSON request body instead of a standard authorization header. HTTPS protects the credential in transit against ordinary passive interception, but request bodies are more likely to be recorded by application logging, API debugging, reverse-proxy inspection, error telemetry, or request tracing. This expands the number of systems in which the credential may be retained. Every supported command requires and transmits the key, including discovery-only operations such as `models ...[truncated 1343 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Verify and document the ownership and operational relationship between `skillboss.co` and `api.heybossai.com`. 2. Prefer an official, same-brand API hostname covered by the provider's published privacy and security documentation. 3. Move authentication out of the JSON body and into a standard header, for example: ```js headers: { "Content-Type": "application/json", "Authorization": `Bearer ${apiKey}`, } ``` 4. Ensure reverse proxies, application servers, observability systems, and error telemetry redact authorization values. 5. Use narrowly scoped, revocable API credentials with spending and rate limits where supported. 6. Document the destination hostname before installation or execution so users can make an informed trust decision. 7. Consider enforcing an explicit endpoint allowlist and certificate-validation policy. Do not permit untrusted runtime input to replace the API endpoint. 8. Avoid returning raw remote error bodies where they could reveal internal service details; parse and sanitize errors before presenting them. ]]>

other

Warning
Location
scripts/run.mjs:46
Finding
User Prompts Are Transmitted to an External Gateway Without Explicit Privacy Disclosure<![CDATA[ ## Vulnerability Details **File Location**: `scripts/run.mjs:46-66, 92-109` **Vulnerability Type**: Undisclosed external transmission of potentially sensitive user content **Risk Level**: Medium ### Complete Code Snippet ```js } else if (cmd === "run" && args[1] && args[2]) { const model = args[1]; const prompt = args[2]; const inputs = model.match(/tts|speech|eleven/i) ? { text: prompt, input: prompt, voice: "alloy" } : model.match(/whisper|stt/i) ? { text: prompt } : model.match(/img|image|flux|gemini.*image|video|veo/i) ? { prompt } : { messages: [{ role: "user", content: prompt }] }; const resp = await fetch(`${API_BASE}/run`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ api_key: apiKey, model, inputs }), }); ``` The smart task mode performs equivalent transmission: ```js } else if (cmd === "task" && args[1] && args[2]) { const type = args[1]; const prompt = args[2]; const inputs = type === "tts" ? { text: prompt, input: prompt, voice: "alloy" } : type === "chat" ? { messages: [{ role: "user", content: prompt }] } : { prompt }; const resp = await fetch(`${API_BASE}/pilot`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ api_key: apiKey, type, inputs }), }); ``` ### Technical Analysis Prompts supplied through the command line are forwarded to `https://api.heybossai.com/v1`. Depending on the selected operation, the content is placed in `text`, `input`, `prompt`, or a chat `messages` array. External content processing is necessary for the declared multi-model gateway functionality and is therefore not inherently malicious. However, `SKILL.md` does not identify the actual processing domain, explain whether prompts are passed to additional model providers, provide retention information, or warn users against including credentials, personal data, proprietary source code, or ...[truncated 1520 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Clearly disclose in `SKILL.md` that prompts are transmitted to `api.heybossai.com` and may be processed by downstream model providers. 2. Link to applicable privacy, retention, subprocessors, and data-processing policies. 3. Warn users not to include passwords, API keys, regulated personal information, proprietary source code, or other confidential data unless the service is approved for that use. 4. In smart routing mode, disclose the selected provider and model before sending sensitive content, or offer a provider allowlist. 5. Add an optional confirmation step for content detected as potentially sensitive. 6. Provide enterprise controls for zero-retention processing, regional routing, provider restrictions, and audit logging where available. 7. Minimize submitted data and avoid adding unrelated metadata to requests. 8. Provide a local redaction or secret-detection option before network transmission. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (5)

Lp1

High
Category
MCP Least Privilege
Confidence
97% confidence
Finding
The script makes outbound network requests to a third-party service, but the static finding indicates this capability is not covered by declared permissions. Undeclared network access is dangerous because it allows transmission of user input and metadata off-platform without the permission model accurately informing users or enforcement layers.

Lp1

High
Category
MCP Least Privilege
Confidence
97% confidence
Finding
The script makes outbound network requests to a third-party service, but the static finding indicates this capability is not covered by declared permissions. Undeclared network access is dangerous because it allows transmission of user input and metadata off-platform without the permission model accurately informing users or enforcement layers.

External Transmission

Medium
Category
Data Exfiltration
Content
#!/usr/bin/env node

const API_BASE = "https://api.heybossai.com/v1";

function usage() {
  console.error(`Usage: run.mjs <command> [options]
Confidence
50% 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
95% confidence
Finding
The run command sends the user's prompt directly to a remote API, but there is no explicit warning at the point of use that prompt contents leave the local environment. This can lead to accidental disclosure of sensitive data if users assume prompts are processed locally or within a more trusted boundary.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The task command transmits prompts to a remote model-selection endpoint (/pilot) without an explicit user-facing disclosure. Because this endpoint may route content for model selection and execution, users may unknowingly expose sensitive prompts to third-party infrastructure.

Static analysis

No suspicious patterns detected.