T05 · Unauthorized Access and Privilege Escalation
- Location
pipeline-mcp.yaml:27- Finding
Unauthenticated Network-Exposed OpenAI Inference Endpoint
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This summarization skill is mostly coherent, but its MCP server exposes an unauthenticated OpenAI-backed endpoint on all network interfaces and its privacy wording understates what leaves the machine.
Review before installing. Use the local Ollama backend for sensitive text, or ensure users understand that OpenAI mode sends submitted text and authentication material to OpenAI. If using MCP mode, bind the service to 127.0.0.1, add authentication before exposing it beyond the local machine, and monitor API usage or spending limits.
pipeline-mcp.yaml:27Unauthenticated Network-Exposed OpenAI Inference Endpoint
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Start the skill server
PORT=8080 expanso-edge run pipeline-mcp.yaml &
# Call from curl (or OpenClaw MCP)
curl -X POST http://localhost:8080/summarize \
-H "Content-Type: application/json" \
-d '{"text": "Your long article or document text here..."}'
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
For MCP mode, make sure you're sending JSON with a text field:
curl -X POST http://localhost:8080/summarize \
-H "Content-Type: application/json" \
-d '{"text": "Your text here"}'
The pipeline sends raw stdin content directly to an external AI service, which can expose sensitive user data if operators assume processing is local or do not realize third-party transmission occurs. The surrounding comments emphasize local API key handling, which may reduce attention to the more important privacy risk: the input text itself leaves the machine.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# # Start the server
# PORT=8080 expanso-edge run pipeline-mcp.yaml
#
# # Call from curl
# curl -X POST http://localhost:8080/summarize \
# -H "Content-Type: application/json" \
# -d '{"text": "Your long text here..."}'
The pipeline enables an HTTP server and binds it to 0.0.0.0, exposing the summarization endpoint on all network interfaces without any authentication or access control. In MCP/local-agent contexts this increases the attack surface because any reachable host could submit arbitrary text for processing, consume resources, and potentially cause sensitive local data to be proxied to the external model if another local component feeds it in.
The HTTP listener is broadly exposed and the file does not define any invocation-scope constraints beyond accepting POST requests to /summarize. That means any network-reachable caller can invoke the skill, which is risky for an agent-side service intended to run on a user's machine and can lead to abuse, denial of service, or unauthorized use of local credentials-backed functionality.
The skill sends user-provided text directly to the OpenAI API, which is an external transmission of potentially sensitive content, yet the file lacks an explicit user-facing warning or consent mechanism at the point of use. In an MCP setting running on a local machine, users may incorrectly assume data stays entirely local because the service itself is local, making inadvertent disclosure more likely.
The manifest claims API keys are 'never transmitted,' but the skill explicitly defines a remote OpenAI backend that necessarily sends the API key to a third-party service for authentication. This is a misleading security/privacy claim that can cause users to trust the skill with sensitive data under false assumptions.
The manifest highlights local credential storage but omits that the optional remote backend sends user-provided text to an external provider. This omission can mislead users into submitting sensitive or regulated content without understanding that remote processing occurs.
Lines L11-L12 make a strong behavioral claim that the OPENAI_API_KEY is 'never transmitted to Expanso Cloud or logged anywhere.' The code does resolve the key locally at L49, but nothing in this file proves or enforces the 'never logged anywhere' guarantee; that claim depends on runtime behavior outside the shown code. This is best treated as documentation overstating what the file itself guarantees.
This manifest says only "Summarize text into 3-5 bullet points using AI," which describes capability but does not define when the skill should activate or what trigger phrases should or should not invoke it. In a manifest file, that lack of trigger specificity can lead to unintended invocation overlap with generic summarization requests.
No suspicious patterns detected.