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

Content
View full analysis

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
View 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
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Execute functions by importing from `scripts/src/index.ts`:

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Execute functions by importing from `scripts/src/index.ts`:

Missing User Warnings

High
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Tool Parameter Abuse

High
Category
Tool Misuse
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.

Content

Scanner excerpt · references/api-reference.md (reported line 102)May include surrounding context.

const result = await createEndpoint('/receipts/2026');

text

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

Delete an endpoint and all associated files.

Tool Parameter Abuse

High
Category
Tool Misuse
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.

Content

Scanner excerpt · references/api-reference.md (reported line 169)May include surrounding context.

md
## Items

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

Delete a single item from an endpoint by its 8-character ID.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/src/index.ts (reported line 8)May include surrounding context.

ts
// 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";

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/src/index.ts (reported line 16)May include surrounding context.

ts
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);
}

Undeclared Tool Scope

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.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · scripts/package.json (reported line 12)May include surrounding context.

json
"start": "tsx src/index.ts"
  },
  "dependencies": {
    "dotenv": "^16.3.1"
  },
  "devDependencies": {
    "@types/node": "^20.10.0",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · scripts/package.json (reported line 15)May include surrounding context.

json
"dotenv": "^16.3.1"
  },
  "devDependencies": {
    "@types/node": "^20.10.0",
    "tsx": "^4.7.0",
    "typescript": "^5.3.2"
  },

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · scripts/package.json (reported line 16)May include surrounding context.

json
},
  "devDependencies": {
    "@types/node": "^20.10.0",
    "tsx": "^4.7.0",
    "typescript": "^5.3.2"
  },
  "keywords": [

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · scripts/package.json (reported line 17)May include surrounding context.

json
"devDependencies": {
    "@types/node": "^20.10.0",
    "tsx": "^4.7.0",
    "typescript": "^5.3.2"
  },
  "keywords": [
    "endpoints",

Missing User Warnings

Low
Category
Not specified by scanner
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.

Content

No source excerpt is available for this finding.

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