Back to skill

Security audit

Tandoor Recipe

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to do the advertised Tandoor recipe tasks, but it needs review because it can send the user's Tandoor API token over a non-HTTPS URL.

Before installing, confirm TANDOOR_URL uses HTTPS except for tightly controlled local testing, use the narrowest Tandoor API token available, and understand the skill can create recipes, add meal-plan entries, and modify or delete shopping-list items when invoked.

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/api.js:14
Finding

Bearer Token and Private Tandoor Data May Be Transmitted Over Plaintext HTTP

Content
View full analysis

Vulnerability Details

File Location: scripts/api.js, lines 14–54
Vulnerability Type: Insecure transmission of sensitive information
Risk Level: High

Vulnerable Code

js
function getConfig() {
    const url = process.env.TANDOOR_URL;
    const token = process.env.TANDOOR_API_TOKEN;
    const additionalHeadersRaw = process.env.TANDOOR_ADDITIONAL_HEADERS;
    if (!url) {
        throw new Error('TANDOOR_URL environment variable is not set');
    }
    if (!token) {
        throw new Error('TANDOOR_API_TOKEN environment variable is not set');
    }
    let additionalHeaders;
    if (additionalHeadersRaw) {
        try {
            additionalHeaders = JSON.parse(additionalHeadersRaw);
        }
        catch {
            throw new Error('TANDOOR_ADDITIONAL_HEADERS must be valid JSON');
        }
    }
    return { url, token, additionalHeaders };
}

export async function apiRequest(endpoint, schema, options = {}) {
    const { url: TANDOOR_URL, token: TANDOOR_API_TOKEN, additionalHeaders: envHeaders } = getConfig();
    const { method = 'GET', body, headers: optionHeaders } = options;
    const url = new URL(endpoint, TANDOOR_URL);
    const headers = {
        'Authorization': `Bearer ${TANDOOR_API_TOKEN}`,
        'Accept': 'application/json',
        ...envHeaders,
        ...optionHeaders,
    };
    if (body) {
        headers['Content-Type'] = 'application/json';
    }
    const response = await fetch(url.toString(), {
        method,
        headers,
        body: body ? JSON.stringify(body) : undefined,
    });

The same behavior is repeated in apiRequestRaw at lines 69–86.

Technical Analysis

TANDOOR_URL is obtained from the environment and used without validating its URL scheme. The request helpers always attach TANDOOR_API_TOKEN as a bearer credential, including when the configured URL uses plaintext http:.

Bearer t ...[truncated 1895 chars]

Remediation
View remediation

Remediation Suggestions

  1. Parse and validate TANDOOR_URL when loading configuration, and reject every protocol except https: by default.

    js
    const parsedUrl = new URL(url);
    if (parsedUrl.protocol !== 'https:') {
        throw new Error('TANDOOR_URL must use HTTPS');
    }
    
  2. If plaintext HTTP is required for local development, allow it only through an explicit opt-in and restrict it to loopback hosts such as 127.0.0.1, ::1, or localhost. Do not permit general private-network HTTP merely because an address appears internal.

  3. Normalize and retain the validated URL object rather than reparsing an unvalidated environment string for every request.

  4. Ensure redirects cannot disclose credentials to an unintended origin. Prefer disabling automatic redirects or validating the destination origin before resending authenticated requests.

  5. Document HTTPS as a mandatory production requirement in SKILL.md and references/API.md.

  6. Use a narrowly scoped Tandoor token where supported, rotate any token that may have been used over HTTP, and avoid granting administrative permissions that the Skill does not require.

Vulnerability Patterns
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • 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
Findings (48)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises substantial Tandoor Recipe Manager functionality, but the supplied code does not implement any observable behavior at all. Since the actual code chunk is effectively empty and does not demonstrate the declared primary purpose, this is a material description-behavior mismatch.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
node ./scripts/tandoor.js <command> [args...]

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/api.js:14