Back to skill

Security audit

Endpoints

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to be a real Endpoints.work document-management helper, but it can upload local documents and delete remote data without strong confirmation or destination safeguards.

Install only if you trust the Endpoints.work account and API key being used. Treat file scanning as uploading the chosen file to the service, verify ENDPOINTS_API_URL is exactly the intended HTTPS host, and require explicit confirmation with exact endpoint paths or item IDs before any delete operation.

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/src/index.ts:10
Finding
Unvalidated API Base URL Can Disclose the Bearer Credential and Uploaded Data## Vulnerability Details **File Location**: `scripts/src/index.ts`, lines 10–13 and 74–90 **Vulnerability Type**: Unvalidated destination for authenticated HTTP requests **Risk Level**: High ### Vulnerable Code ```typescript config({ path: join(__dirname, "../../.env") }); // Configuration const API_URL = process.env.ENDPOINTS_API_URL || "https://endpoints.work"; const API_KEY = process.env.ENDPOINTS_API_KEY; ``` ```typescript async function apiRequest<T>( path: string, options: RequestInit = {} ): Promise<T> { const url = `${API_URL}${path}`; const headers: Record<string, string> = { Authorization: `Bearer ${API_KEY}`, ...((options.headers as Record<string, string>) || {}), }; // Don't set Content-Type for FormData (browser sets it with boundary) if (!(options.body instanceof FormData)) { headers["Content-Type"] = "application/json"; } const response = await fetch(url, { ...options, headers, }); ``` ### Technical Analysis The application reads `ENDPOINTS_API_URL` from the local `.env` file and uses it directly to construct every API request. No validation restricts the URL to HTTPS, the expected `endpoints.work` host, an approved port, or another explicit allowlist. The same request function unconditionally attaches `ENDPOINTS_API_KEY` as a bearer credential. Consequently, any party capable of altering the environment configuration can redirect authenticated requests to an attacker-controlled endpoint. If an `http://` URL is accepted, the credential and request data may also be transmitted without transport encryption. This affects all operations using `apiRequest()`. Scanning operations present additional exposure because their multipart request bodies can contain user-provided text or complete local document contents. ### Attack Path 1. An attacker, compromised installation process, or malicious local configuration modifies the project `.env` file or otherwise controls `ENDPOINTS_API ...[truncated 1324 chars]
Remediation
## Remediation Suggestions 1. Remove support for an arbitrary production API origin where possible and use a fixed constant such as `https://endpoints.work`. 2. If configurability is required, parse the value with `new URL()` and enforce: - `https:` exclusively. - An explicit hostname allowlist. - Approved ports only. - No embedded username or password. - No unexpected path, query string, or fragment. 3. Attach the `Authorization` header only after confirming that the final request destination is trusted. 4. Disable automatic redirects for authenticated requests, or manually process redirects and revalidate every target before resending credentials. 5. Fail closed when URL validation fails; do not fall back to an untrusted destination. 6. Protect `.env` with restrictive filesystem permissions, exclude it from version control, and document that configuration integrity is security-sensitive. 7. Rotate the API key if there is any indication that requests were previously sent to an unintended host. 8. Add automated tests covering HTTP URLs, lookalike domains, subdomain confusion, embedded credentials, nonstandard ports, and cross-origin redirects.
Vulnerability Patterns
  • 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
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (21)

Ae1

High
Category
analysis-evasion
Content
Execute functions by importing from `scripts/src/index.ts`:
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
Execute functions by importing from `scripts/src/index.ts`:
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Missing User Warnings

High
Confidence
97% confidence
Finding
The skill exposes destructive deletion operations in its interface description but does not warn that these actions are irreversible or require confirmation. Because the skill manages remote document data via authenticated API requests, lack of warnings and guardrails materially increases the risk of accidental or prompt-induced deletion of user data.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
const result = await createEndpoint('/receipts/2026');
```

### DELETE /api/endpoints/{category}/{slug}

Delete an endpoint and all associated files.
Confidence
93% confidence
Finding
The documented delete endpoint enables irreversible removal of endpoints and all associated files, and the skill context encourages agent-driven API use from natural-language requests. Without explicit safeguards such as confirmation requirements, scoped authorization guidance, or validation constraints, an agent can be induced to perform destructive actions through prompt manipulation or ambiguous user instructions.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
## Items

### DELETE /api/items/{itemId}

Delete a single item from an endpoint by its 8-character ID.
Confidence
92% confidence
Finding
Deleting items by a short 8-character ID is a destructive capability that can be abused by an agent if untrusted input is passed directly into the tool. In this skill context, where agents may inspect metadata and then act on user instructions, the lack of documented confirmation and guardrails increases the risk of prompt-driven unauthorized or mistaken deletion.

Credential Access

High
Category
Privilege Escalation
Content
// Load environment variables
const __dirname = dirname(fileURLToPath(import.meta.url));
config({ path: join(__dirname, "../../.env") });

// Configuration
const API_URL = process.env.ENDPOINTS_API_URL || "https://endpoints.work";
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
if (!API_KEY) {
  console.error("Error: ENDPOINTS_API_KEY not set");
  console.error("Set it in .env file: ENDPOINTS_API_KEY=ep_your_key_here");
  process.exit(1);
}
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill documents use of environment variables and outbound network access to a third-party API, but it does not declare any explicit tool scope such as permissions or allowed-tools. That increases the chance the agent can invoke code or networked actions without clear sandboxing or review boundaries, which is especially relevant because the skill can perform state-changing API calls including deletion.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The skill description contains broad trigger phrases like scanning documents, uploading files, listing endpoints, and managing metadata that could match many ordinary user requests. Over-broad activation can cause the agent to select this networked, stateful skill in situations where the user did not intend external transmission of content or use of a privileged API-backed integration.

Vague Triggers

Medium
Confidence
96% confidence
Finding
The quick-start table maps vague commands like 'Delete the old endpoint' and 'Remove that item' directly to destructive functions without requiring unambiguous identifiers or confirmation. In an agent setting, ambiguous deletion intents can be misresolved to the wrong resource and lead to irreversible data loss through authenticated API calls.

Rp1

Medium
Category
MCP Rug Pull
Confidence
84% confidence
Finding
The documentation tells users to run the skill with `npx tsx`, which fetches and executes a package version that is not pinned in the command itself. This creates a supply-chain risk because execution behavior can change over time or be influenced by a compromised upstream package/version resolution path.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
This markdown file documents `DELETE /api/endpoints/{category}/{slug}` and shows example deletion usage, but it does not warn that the action deletes an endpoint and all associated files irreversibly. For markdown files, destructive behaviors that could affect user data should include an explicit warning about data loss or irreversibility.

Missing User Warnings

Medium
Confidence
87% confidence
Finding
The scan API accepts uploaded files and text content for AI extraction, which implies user data is transmitted and processed, yet the markdown does not include any privacy or sensitive-data warning. For markdown files, behaviors affecting privacy should be disclosed so users know not to send confidential material unintentionally.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The file documents `DELETE /api/items/{itemId}` as deleting a single item, but it does not include any caution that this removes user data and may be irreversible. Markdown documentation for data-affecting operations should clearly disclose deletion risk so users understand the impact before invoking it.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The deleteEndpoint function performs a destructive remote delete operation with no built-in confirmation, preview, or safeguard. In an automated agent setting, this increases the chance of accidental or prompt-induced deletion of endpoints and associated files.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The scanFile function reads an arbitrary local file and uploads its contents to a remote API endpoint. In an agent/skill context, this is a real data-exfiltration risk because sensitive local files could be transmitted off-host without an explicit consent/confirmation step at the point of use.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"start": "tsx src/index.ts"
  },
  "dependencies": {
    "dotenv": "^16.3.1"
  },
  "devDependencies": {
    "@types/node": "^20.10.0",
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"dotenv": "^16.3.1"
  },
  "devDependencies": {
    "@types/node": "^20.10.0",
    "tsx": "^4.7.0",
    "typescript": "^5.3.2"
  },
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
},
  "devDependencies": {
    "@types/node": "^20.10.0",
    "tsx": "^4.7.0",
    "typescript": "^5.3.2"
  },
  "keywords": [
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"devDependencies": {
    "@types/node": "^20.10.0",
    "tsx": "^4.7.0",
    "typescript": "^5.3.2"
  },
  "keywords": [
    "endpoints",
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Missing User Warnings

Low
Confidence
86% confidence
Finding
The scanText function sends provided text to a remote API for AI extraction without any user-facing disclosure in the function itself. In this skill's context, that means potentially sensitive text may leave the local environment unexpectedly.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/src/index.ts:11