T09 · Insecure Skill Coding Practices
- Location
SKILL.md:36- Finding
Unredacted Evaluation Data Sent to a Fixed Third-Party API
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 36–51
Vulnerability Type: Sensitive information transmitted to an external service without redaction or explicit consent controls
Risk Level: MediumVulnerable Code
python import requests, os SKILLBOSS_API_KEY = os.environ["SKILLBOSS_API_KEY"] def call_llm(messages: list) -> str: r = requests.post( "https://api.skillboss.co/v1/pilot", headers={"Authorization": f"Bearer {SKILLBOSS_API_KEY}", "Content-Type": "application/json"}, json={ "type": "chat", "inputs": {"messages": messages}, "prefer": "balanced" }, timeout=60, ) return r.json()["result"]["choices"][0]["message"]["content"]Technical Analysis
The documented function transmits the entire caller-supplied
messagescollection to the fixed third-party endpointhttps://api.skillboss.co/v1/pilot. It does not classify or redact data, detect embedded credentials, request explicit approval, or offer a local or user-selected provider.Agent-evaluation inputs may include production prompts, model outputs, proprietary test cases, system instructions, personal information, authentication material, and operational traces. Any such content placed in
messagesis included unchanged in the outbound JSON request. HTTPS protects the data in transit but does not prevent disclosure to or processing by the remote service.External LLM access can be relevant to the skill's stated functionality, but requiring a single external service is not the minimum privilege necessary for generic agent evaluation. Evaluation can instead operate against a configurable provider or local model. The API credential itself is read from an environment variable and sent only to its apparent intended endpoint; the reviewed files contain no evidence that the credential is exfiltrated to an unrelated destination.
The fu ...[truncated 1731 chars]
- Remediation
View remediation
Remediation Suggestions
- Require explicit, informed user approval before transmitting evaluation data to an external provider.
- Clearly document the destination, categories of data transmitted, retention policy, subprocessors, and applicable privacy terms.
- Make the API endpoint and provider configurable rather than requiring a fixed third-party service.
- Provide a local or self-hosted backend option for sensitive evaluation workflows.
- Add a preprocessing layer that detects and redacts credentials, access tokens, personal information, proprietary identifiers, and other configured sensitive fields.
- Default to denying transmission when secret-like content is detected, requiring an explicit override rather than silently sending it.
- Minimize payloads by transmitting only the fields necessary for a specific evaluation.
- Separate synthetic benchmark workflows from production-trace workflows and apply stricter controls to production data.
- Add
r.raise_for_status(), validate response content and schema, and handle timeouts, invalid JSON, and unexpected responses safely. - Avoid logging authorization headers, full request bodies, or unredacted response content.
- Document secure API-key handling, rotation, and least-privilege configuration.
