Back to skill

Security audit

SupportForge

Security checks for vulnerabilities and agentic risk

Overview

SupportForge is mostly a coherent support-API skill, but it sends customer data and credentials to an external service with weak disclosure and unsafe credential handling.

Review this before installing. Only use it if you trust the SupportForge/Voss endpoint, understand that support content and email addresses leave your environment, avoid setting SUPPORTFORGE_API_URL to untrusted hosts, and do not use the email auto-signup path where logs or agent transcripts may capture the generated API key.

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/forge-client.sh:3
Finding

Configurable API Endpoint Can Exfiltrate Credentials and Support Data

Content
View full analysis

Vulnerability Details

File Location: scripts/forge-client.sh, lines 3 and 15–16
Vulnerability Type: Unvalidated destination for authenticated API requests
Risk Level: High

Vulnerable Code

bash
API_BASE="${SUPPORTFORGE_API_URL:-https://anton.vosscg.com}"
bash
case "$ACTION" in
  create) curl -sf -X POST "$API_BASE/v1/tickets/create" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;;
  search) curl -sf -X POST "$API_BASE/v1/kb/search" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;;
  health) curl -sf "$API_BASE/v1/health" ;;
  *) echo "SupportForge: create '<json>' | search '<json>' | health" ;;
esac

Technical Analysis

The script accepts SUPPORTFORGE_API_URL as the API base URL without validating its scheme, hostname, port, or ownership. The create and search operations then send the SupportForge bearer token and user-supplied JSON body to that destination.

An attacker who can influence the process environment does not need to execute injected shell commands. Setting the environment variable to an attacker-controlled HTTP or HTTPS service is sufficient to redirect legitimate-looking API requests. The absence of HTTPS enforcement also permits configuration of a plaintext HTTP endpoint, exposing credentials and data to network interception.

Attack Path

  1. The attacker gains the ability to define or modify environment variables used when the script runs, such as through CI configuration, a wrapper process, deployment settings, or a compromised shell environment.
  2. The attacker sets SUPPORTFORGE_API_URL to an endpoint under their control, for example https://attacker.example.
  3. A user or agent invokes:
    bash
    ./scripts/forge-client.sh create '{"subject":"Login issue","message":"Sensitive support content"}'
    
    or:
    bash
    ./scripts/forge-client.sh search '{"query":"confidential topic"}'
    
  4. The script s ...[truncated 669 chars]
Remediation
View remediation

Remediation Suggestions

  • Remove the SUPPORTFORGE_API_URL override if custom endpoints are not a required feature.
  • If configurability is required, parse and validate the URL before sending credentials.
  • Require the https scheme and reject plaintext HTTP.
  • Enforce an explicit allowlist of trusted hostnames, expected ports, and approved path prefixes.
  • Reject URLs containing embedded user information, fragments, unexpected ports, or malformed hostnames.
  • Prevent authorization headers from being forwarded across redirects. Keep redirects disabled, or explicitly constrain them to the same trusted origin.
  • Separate development and production configuration so test endpoints cannot receive production credentials.
  • Apply least privilege and rotation to SupportForge API keys to reduce the impact of disclosure.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/forge-client.sh:7
Finding

Newly Issued API Key Is Printed in Plaintext

Content
View full analysis

Vulnerability Details

File Location: scripts/forge-client.sh, lines 7–9
Vulnerability Type: Plaintext secret exposure through stderr
Risk Level: Medium

Vulnerable Code

bash
RESP=$(curl -sf -X POST "$API_BASE/v1/keys" -H "Content-Type: application/json" -d "{\"email\": \"$EMAIL\"}")
API_KEY=$(echo "$RESP" | grep -o '"api_key":"[^"]*"' | cut -d'"' -f4)
[ -n "$API_KEY" ] && echo "✅ Free key: $API_KEY" >&2 || { echo "❌ Signup failed" >&2; exit 1; }

Technical Analysis

After email-based registration, the script extracts the complete API key and writes it to standard error. Standard error is not a secure secret channel: terminals, agent execution traces, CI systems, centralized log collectors, shell wrappers, and process supervisors commonly capture it.

The disclosure occurs during intended use and does not require command injection or elevated local privileges. Anyone with access to retained output can obtain the credential.

Attack Path

  1. A user runs the client with SUPPORTFORGE_EMAIL set and without an existing SUPPORTFORGE_API_KEY.
  2. The remote service returns a newly issued API key.
  3. The script emits the full key to stderr:
    text
    Free key: <complete-secret>
    
  4. The execution environment captures stderr in a terminal transcript, agent trace, CI artifact, or centralized log.
  5. An attacker or unauthorized operator with access to that output retrieves the key.
  6. The attacker uses the key to perform API operations allowed by the credential until it is revoked or expires.

Impact Assessment

The exposed credential can enable unauthorized use of the associated SupportForge account or tenant within the key's permissions. Potential effects include unauthorized ticket creation, knowledge-base searches, service quota consumption, and access to any additional API operations granted to the key. This finding does not establish local host compromise or privilege escalation.

Remediation
View remediation

Remediation Suggestions

  • Do not print the complete API key to stdout or stderr.
  • Emit only a generic success message, such as API key created successfully.
  • If key identification is operationally necessary, display only a short, non-sensitive suffix.
  • Deliver or persist the key through an approved secret-management mechanism with restrictive access controls.
  • Ensure CI systems and agent frameworks redact known secret patterns from logs as defense in depth.
  • Restrict access to existing execution logs and remove historical records containing exposed keys.
  • Revoke and rotate any keys that may already have appeared in captured output.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (9)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The documented behavior does not fully match the actual actions: it includes API-key/signup generation via email submission to /v1/keys while omitting that from the declared purpose, and claims routing/auto-reply capabilities not evidenced in the file. This mismatch is dangerous because it can trigger unexpected external account creation or data transmission under a broader support-automation label, reducing user awareness and informed consent.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill includes shell-based network actions but does not declare any tool scope or allowed-tools restrictions. That makes the runtime capabilities under-specified and can permit broader-than-expected command execution or external requests, increasing the chance of misuse or accidental data exposure.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The activation text is broad enough to match many generic support-related requests, which can cause the skill to be invoked in situations where users did not intend to use a third-party support API. In this context, overbroad triggering is risky because the skill can send support content and potentially personal data to an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The documentation does not warn that support messages, ticket content, and email addresses may be transmitted to external SupportForge endpoints. This is dangerous because users may share sensitive customer data or personal identifiers without realizing it leaves the local environment and is processed by a third party.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
90% confidence
Finding

The skill instructs posting an email address to an external endpoint to generate an API key, which is a real external transmission of user data. In a customer-support skill, this is more sensitive because setup may occur automatically and can bootstrap further outbound actions using generated credentials.

Content

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

Set SUPPORTFORGE_API_KEY or SUPPORTFORGE_EMAIL for auto-signup (free, no credit card).

bash
curl -X POST https://anton.vosscg.com/v1/keys -H 'Content-Type: application/json' -d '{"email":"you@example.com"}'

Usage

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script silently provisions an API key by sending a user-supplied email address to an external service, even though the declared skill scope is customer support operations rather than account registration or credential issuance. This expands the skill’s capabilities beyond what a user may reasonably expect and can cause unintended data disclosure and account creation on a third-party system.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

This line transmits the user’s email address to an external endpoint to obtain credentials, creating a privacy and trust risk. The danger is increased because the default API base points to a non-obviously official domain, so sensitive data is sent off-host without strong assurance that the destination matches the expected vendor.

Content

Scanner excerpt · scripts/forge-client.sh (reported line 7)May include surrounding context.

sh
API_KEY="${SUPPORTFORGE_API_KEY:-}"
EMAIL="${SUPPORTFORGE_EMAIL:-}"
if [ -z "$API_KEY" ] && [ -n "$EMAIL" ]; then
  RESP=$(curl -sf -X POST "$API_BASE/v1/keys" -H "Content-Type: application/json" -d "{\"email\": \"$EMAIL\"}")
  API_KEY=$(echo "$RESP" | grep -o '"api_key":"[^"]*"' | cut -d'"' -f4)
  [ -n "$API_KEY" ] && echo "✅ Free key: $API_KEY" >&2 || { echo "❌ Signup failed" >&2; exit 1; }
fi

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script prints the newly generated API key directly to stderr, which can expose the credential in terminal logs, CI logs, agent transcripts, or other observability systems. Anyone with access to those logs could reuse the key to interact with the SupportForge API as the victim.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The script sends arbitrary user-provided JSON and an API bearer token to external ticketing and knowledge-base endpoints. External transmission is expected for this skill category, but it still creates a real security risk because support payloads often contain sensitive customer data, and the script provides no validation, warning, redaction, or destination trust controls.

Content

Scanner excerpt · scripts/forge-client.sh (reported line 14)May include surrounding context.

sh
[ -z "$API_KEY" ] && { echo "❌ Set SUPPORTFORGE_API_KEY or SUPPORTFORGE_EMAIL" >&2; exit 1; }
ACTION="${1:-help}"; shift || true
case "$ACTION" in
  create) curl -sf -X POST "$API_BASE/v1/tickets/create" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;;
  search) curl -sf -X POST "$API_BASE/v1/kb/search" -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" -d "$1" ;;
  health) curl -sf "$API_BASE/v1/health" ;;
  *) echo "SupportForge: create '<json>' | search '<json>' | health" ;;

Static analysis

No suspicious patterns detected.