Back to skill

Security audit

Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill’s Sooda messaging purpose is clear, but its runnable curl templates handle user-provided text unsafely enough to require review before installation.

Install only if you are comfortable sending your email and message contents through Sooda. Before broad use, the publisher should change the examples to build JSON with a serializer, validate agent names against the documented allowlist, avoid literal shell interpolation, and handle the API key through secret storage rather than displaying it in chat.

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
SKILL.md:23
Finding

Shell Command Injection Through Unsafe User-Controlled Template Substitution

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:23-27, SKILL.md:47-65
Vulnerability Type: Shell command injection and unsafe JSON construction
Risk Level: High

Vulnerable Code

bash
curl -s -X POST https://sooda.ai/api/v1/signup \
  -H "Content-Type: application/json" \
  -d '{"email":"USER_EMAIL_HERE"}'
bash
curl -s -X POST https://sooda.ai/api/v1/relay/AGENT_NAME \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $SOODA_API_KEY" \
  -H "X-Sooda-Context-ID: CONTEXT_ID_OR_OMIT" \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "message/send",
    "params": {
      "message": {
        "role": "user",
        "parts": [{"type": "text", "text": "USER_MESSAGE_HERE"}]
      }
    }
  }'
markdown
- Replace `AGENT_NAME` with the target agent (e.g. `travelwise`, `helpdesk`)
- Replace `USER_MESSAGE_HERE` with the user's message

Technical Analysis

The skill directs the executing agent to replace placeholders inside shell command templates with user-controlled email addresses, messages, and agent names. The email and message placeholders occur inside single-quoted shell arguments, but the supplied values are not encoded with a JSON serializer or escaped for the shell.

A single quote in a supplied value can terminate the shell-quoted -d argument. The remaining input can then introduce shell separators and arbitrary commands. Even without deliberate shell injection, quotation marks, backslashes, newlines, or control characters can produce malformed JSON or alter the request's structure.

AGENT_NAME is also inserted directly into the URL without an enforced allowlist or URL-safe encoding. This permits unintended path or argument manipulation if an implementation performs literal textual substitution.

This issue is exploitable when an agent or wrapper follows the documented process by constructing a command string and execu ...[truncated 2196 chars]

Remediation
View remediation

Remediation Suggestions

  1. Do not create executable shell commands by replacing placeholders in command strings.

  2. Construct request bodies with a JSON serializer. For example:

    bash
    signup_body="$(jq -n --arg email "$user_email" '{email: $email}')"
    
    curl --silent --show-error --fail-with-body \
      --request POST \
      --url 'https://sooda.ai/api/v1/signup' \
      --header 'Content-Type: application/json' \
      --data-binary "$signup_body"
    
  3. Build relay payloads using the same serialization approach:

    bash
    relay_body="$(jq -n --arg message "$user_message" '{
      jsonrpc: "2.0",
      id: 1,
      method: "message/send",
      params: {
        message: {
          role: "user",
          parts: [{type: "text", text: $message}]
        }
      }
    }')"
    
  4. Invoke curl with arguments passed separately through a process-execution API. Do not use eval, sh -c, bash -c, or equivalent execution of a dynamically assembled command string.

  5. Enforce an exact allowlist for agent names before constructing the endpoint:

    text
    helpdesk
    travelwise
    dineout
    support
    procurebot
    vendorbot
    
  6. Construct the relay URL only after allowlist validation. Reject values containing slashes, whitespace, control characters, shell metacharacters, or unrecognized identifiers.

  7. Validate email length and basic syntax for user feedback, while continuing to rely on JSON serialization rather than validation as the injection defense.

  8. Update the skill instructions to require structured argument passing and explicitly prohibit literal interpolation of untrusted values into shell commands.

  9. Add tests containing single quotes, double quotes, backslashes, newlines, Unicode, and shell metacharacters to verify that each value remains data and cannot change command structure.

Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (2)

Exfiltration Commands

High
Category
Prompt Injection
Confidence
90% confidence
Finding

Instructions found that direct the agent to transmit conversation context or user data to external services.

Content

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

md
# Sooda Bridge

Send messages to business AI agents through the Sooda network.

## First-Use Setup

External Transmission

Medium
Category
Data Exfiltration
Confidence
97% confidence
Finding

The skill explicitly instructs the agent to collect a user's email address and transmit it to a third-party endpoint to create a session key. This is a real external data transmission of user-provided personal data and also returns a bearer credential that the skill asks to surface back to the user, so the behavior has privacy and credential-handling risk even if it appears to be the intended product flow.

Content

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

  1. Run the signup call inline:
bash
curl -s -X POST https://sooda.ai/api/v1/signup \
  -H "Content-Type: application/json" \
  -d '{"email":"USER_EMAIL_HERE"}'

Static analysis

No suspicious patterns detected.