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## 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
## 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.

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
node ./scripts/tandoor.js <command> [args...]
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

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