Back to skill

Security audit

AI Project Learner

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed paid learning-planner skill, but its payment endpoint can trigger charges for any supplied user ID without clear authentication or per-use safeguards.

Review this skill before installing or invoking it. It clearly charges $0.01 USDT per call via SkillPay, but the charge endpoint should not be used until it requires verified user identity, explicit per-use consent, replay protection, and patched development dependencies.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/index.ts:9
Finding
Unauthenticated Caller Can Initiate Charges for Arbitrary User Identifiers<![CDATA[ ## Vulnerability Details **File Location**: `src/index.ts:9-24`, with the privileged outbound charge performed in `src/billing.ts:8-22` **Vulnerability Type**: Missing authentication and authorization on a billing operation **Risk Level**: High ### Vulnerable Code `src/index.ts:9-24`: ```ts async fetch(request: Request, env: Env): Promise<Response> { if (request.method !== "POST") { return Response.json({ error: "POST required" }, { status: 405 }); } const body = await request.json() as { user_id: string }; if (!body.user_id) { return Response.json({ error: "user_id required" }, { status: 400 }); } const billing = await chargeUser({ userId: body.user_id, apiKey: env.SKILLPAY_API_KEY, priceUsdt: 0.01, skillId: SKILL_ID, }); ``` `src/billing.ts:8-22`: ```ts try { const response = await fetchFn(SKILLPAY_API, { method: "POST", headers: { "Content-Type": "application/json", "X-API-Key": apiKey, }, body: JSON.stringify({ user_id: userId, skill_id: skillId, amount: priceUsdt, }), }); const data = await response.json(); return data as BillingResult; ``` ### Technical Analysis The public Cloudflare Worker accepts `user_id` directly from an unauthenticated request body and uses it to initiate a billing operation. It performs no caller authentication, authorization check, signed-request validation, or verification that the supplied identifier belongs to the requester. The Worker then elevates this untrusted input into a privileged request by authenticating to SkillPay with the server-side `SKILLPAY_API_KEY`. Consequently, possession of the Worker endpoint URL may be sufficient to request charges against arbitrary, guessed, or previously observed user identifiers. Checking only that `user_id` is non-empty does not establish ownership or authorization. The implementation also lacks replay protection, idempotency controls, and application-level rate limiting ...[truncated 2114 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. **Authenticate every caller** - Require a cryptographically verifiable session, token, or signed request before accepting a charge request. - Reject missing, expired, malformed, or incorrectly signed credentials. 2. **Derive the billing identity from verified credentials** - Do not trust `user_id` supplied in request JSON. - Resolve the SkillPay user identifier from the authenticated principal on the server. - If a client-provided identifier is unavoidable, verify that it is explicitly associated with the authenticated principal. 3. **Use signed, short-lived charge intents** - Create charge intents server-side with a fixed skill ID and amount. - Bind each intent to the authenticated user, expected operation, expiration time, and unique nonce. - Verify the signature and all bound attributes before charging. 4. **Prevent replay and duplicate billing** - Generate a unique idempotency key for each intended skill invocation. - Persist consumed nonces or transaction identifiers and reject reuse. - Forward an idempotency key to SkillPay if its API supports one. 5. **Require explicit authorization where appropriate** - Obtain clear user confirmation before performing a charge. - Ensure that payment URLs and retry flows cannot silently produce duplicate charges. 6. **Apply abuse controls** - Rate-limit by authenticated user, source address, and account. - Add thresholds and alerts for repeated failures, unusual identifiers, and burst charge activity. - Return HTTP `401` for unauthenticated callers and `403` for unauthorized billing identities. 7. **Validate input and responses** - Enforce a strict request schema, body-size limit, and valid identifier format. - Check `response.ok` and validate the SkillPay response against an explicit runtime schema. - Avoid returning unnecessary upstream error details to untrusted callers. 8. **Preserve secret isolation** - Continue st ...[truncated 497 chars]
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (30)

Known Vulnerable Dependency: vitest==3.2.4 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
96% confidence
Finding
vitest 3.2.4 is a real vulnerable dependency with reported arbitrary file read and possible execution exposure when UI/server features are enabled, plus the redirect-mock traversal issue. Although it is a dev dependency, this skill's context includes active AI project tooling where tests may run in CI or developer machines, so compromise of local files or execution in those environments is meaningful.

Known Vulnerable Dependency: vitest==3.2.4 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
98% confidence
Finding
The resolved dependency vitest==3.2.4 is flagged with critical advisories for arbitrary file read and possible code execution/path traversal in the UI/mocking components. Even though this is a devDependency, test tooling often runs locally and in CI with access to source code, secrets, environment variables, and build credentials, which makes compromise of the development pipeline particularly dangerous in this skill context.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill is presented as a learning-planner utility, yet it incorporates payment handling, API keys, account identifiers, and cryptocurrency-denominated charges. In this context, the mismatch increases danger because users seeking educational assistance would not reasonably expect financial processing or third-party billing data flows from the advertised functionality.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill is presented as a learning-planner utility, yet it incorporates payment handling, API keys, account identifiers, and cryptocurrency-denominated charges. In this context, the mismatch increases danger because users seeking educational assistance would not reasonably expect financial processing or third-party billing data flows from the advertised functionality.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill is presented as a learning-planner utility, yet it incorporates payment handling, API keys, account identifiers, and cryptocurrency-denominated charges. In this context, the mismatch increases danger because users seeking educational assistance would not reasonably expect financial processing or third-party billing data flows from the advertised functionality.

Known Vulnerable Dependency: nanoid==3.3.11 — 3 advisory(ies): CVE-2026-67214 (nanoid: non-secure generators can loop indefinitely with negative size); CVE-2026-67213 (nanoid: custom generators can loop indefinitely when size is zero); CVE-2026-73086 (nanoid: Integer Overflow or Wraparound)

High
Category
Supply Chain
Confidence
89% confidence
Finding
nanoid 3.3.11 is present transitively via postcss and is reported with denial-of-service and integer-handling flaws. This package-lock alone does not prove the vulnerable code paths are reachable with attacker-controlled size arguments, but the dependency version is genuinely affected and could cause hangs or instability if exposed through tooling inputs.

Known Vulnerable Dependency: picomatch==4.0.3 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
90% confidence
Finding
picomatch 4.0.3 is a real vulnerable dependency with reported ReDoS and glob parsing issues. In this project it is a development dependency used by build/test tooling, so the main risk is denial of service or incorrect matching when attacker-controlled glob patterns are processed during local or CI workflows.

Known Vulnerable Dependency: postcss==8.5.8 — 4 advisory(ies): CVE-2026-45623 (PostCSS: Arbitrary file read and information disclosure via attacker-controlled ); CVE-2026-69153 (PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappi); CVE-2026-41305 (PostCSS has XSS via Unescaped </style> in its CSS Stringify Output) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding
postcss 8.5.8 is listed with multiple advisories including file-read and output-encoding issues. Because this is in frontend tooling rather than application runtime, real-world exposure depends on processing attacker-controlled CSS/source maps or serving transformed output, but the dependency itself is legitimately outdated and risky.

Known Vulnerable Dependency: sharp==0.34.5 — 2 advisory(ies): GHSA-f88m-g3jw-g9cj (sharp inherited vulnerabilities in libvips: CVE-2026-33327, CVE-2026-33328, CVE-); GHSA-rgj7-g3m4-5g8c (sharp: Vulnerabilities in libheif: GHSA-g89c-p67h-r497 and GHSA-2jg2-4ch7-h545)

High
Category
Supply Chain
Confidence
84% confidence
Finding
sharp 0.34.5 pulls native image-processing components with known vulnerabilities in bundled libraries such as libvips/libheif. In this lockfile it is a transitive dev dependency of miniflare, so the practical risk is mainly when untrusted image data is handled during local development or testing.

Known Vulnerable Dependency: undici==7.18.2 — 16 advisory(ies): CVE-2026-1525 (Undici has an HTTP Request/Response Smuggling issue); CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-1527 (Undici has CRLF Injection in undici via `upgrade` option) +13 more

High
Category
Supply Chain
Confidence
92% confidence
Finding
undici 7.18.2 is a real affected dependency with numerous HTTP parsing, smuggling, and poisoning advisories. Since it is used by miniflare in a development server context, exposure is lower than an internet-facing production service, but compromise of local dev services, SSRF-like behavior, or request confusion remains plausible if the dev server is reachable or processes malicious traffic.

Known Vulnerable Dependency: vite==6.4.1 — 4 advisory(ies): CVE-2026-39365 (Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling); CVE-2026-53571 (vite: `server.fs.deny` bypass on Windows alternate paths); CVE-2026-39363 (Vite Vulnerable to Arbitrary File Read via Vite Dev Server WebSocket) +1 more

High
Category
Supply Chain
Confidence
94% confidence
Finding
vite 6.4.1 is a genuine vulnerable dependency with advisories for path traversal, arbitrary file read, and dev-server access control bypasses. This project uses Vite through Vitest and tooling, making the issue especially relevant in developer environments where the dev server or websocket endpoints might be exposed to untrusted local network users or CI contexts.

Known Vulnerable Dependency: ws==8.18.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
90% confidence
Finding
ws 8.18.0 is a legitimately affected websocket library with memory disclosure and memory exhaustion advisories. Here it is pulled in via miniflare, so the main concern is local or CI development services accepting hostile websocket traffic, potentially causing denial of service or limited information leakage.

Description-Behavior Mismatch

High
Confidence
98% confidence
Finding
The file implements a payment charge operation that is unrelated to the stated skill purpose of generating AI project learning dependency graphs. Hidden billing behavior in an unrelated skill is dangerous because it can cause unauthorized charges or covert monetization while users believe they are invoking only educational functionality.

Context-Inappropriate Capability

High
Confidence
97% confidence
Finding
This skill includes an external payment-processing call to a third-party billing endpoint without any justification from the skill's advertised function. In context, that mismatch strongly suggests deceptive or unauthorized data transfer and charging capability embedded in an otherwise unrelated skill.

Context-Inappropriate Capability

High
Confidence
96% confidence
Finding
A billing capability is introduced in a skill whose stated functionality does not require payment handling, creating an unjustified privileged action. In this context, the presence of charging logic is especially suspicious because it expands risk from simple misuse to unauthorized or deceptive financial transactions.

Description-Behavior Mismatch

High
Confidence
99% confidence
Finding
The skill’s declared purpose is to generate a concept dependency graph for AI projects, but the implementation performs only a billing action and returns a charged status. This mismatch is dangerous because it can be used to deceptively monetize users under false pretenses, especially in agent ecosystems where skills are invoked based on metadata and expected behavior.

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill requires network access to contact an external billing endpoint but does not declare any explicit tool scope or allowed-tools restrictions. This weakens least-privilege guarantees and makes the skill's external communications less transparent to reviewers and users, especially since it also handles payment-related data.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The skill instructs sending a user_id to an external billing endpoint without any privacy notice, minimization guidance, retention disclosure, or consent language. Even if the identifier seems simple, transmitting it to a third party can expose account linkage information and creates unnecessary privacy and compliance risk.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The function accepts and uses an API key in a sensitive header with no visible safeguards, warnings, or explanation of how this credential should be sourced and protected. This increases the risk of accidental key misuse, insecure handling by integrators, or hidden privileged actions under the guise of normal skill behavior.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The code transmits user and billing-related fields to a remote service with no visible disclosure, consent flow, or indication to callers that network payment activity will occur. Even over HTTPS, silently sending identity and charge information can violate user expectations, privacy requirements, and enable abuse if invoked unexpectedly.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The code initiates a charge immediately after receiving a POST with a user_id, with no confirmation, acknowledgement, or visible warning in this file. Even if billing were intended, charging without an explicit confirmation step increases the risk of accidental, unauthorized, or coerced payments.

Description-Behavior Mismatch

Medium
Confidence
92% confidence
Finding
The type definitions introduce billing and payment-related interfaces for a skill whose declared purpose is generating AI project learning dependency graphs. This mismatch is suspicious because it suggests hidden monetization or charging behavior outside the expected scope, increasing the risk of unauthorized billing flows or deceptive functionality in the wider skill implementation.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The presence of ChargeParams with fields such as userId, apiKey, priceUsdt, and skillId indicates charging capability that is not justified by the stated educational/graph-generation purpose. In context, this is dangerous because it can enable silent or misleading payment requests, expose sensitive API credentials, and create a larger attack surface than users would reasonably expect from this skill.

Missing User Warnings

Low
Confidence
91% confidence
Finding
The README states the skill costs $0.01 per call, but it does not clearly warn users at the point of use or installation that invoking the skill triggers a live paid billing event. This can lead to unintended charges, especially in agentic workflows where users may authorize a skill once and not realize repeated invocations incur costs.

Known Vulnerable Dependency: @vitest/mocker==3.2.4 — 1 advisory(ies): CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Low
Category
Supply Chain
Confidence
82% confidence
Finding
@vitest/mocker 3.2.4 is flagged for a path traversal/arbitrary file read issue in redirect mock handling. In this lockfile it is a dev/test dependency, so exploitability depends on running Vitest with attacker-controlled test or mock configuration, which reduces exposure but does not eliminate it.

Static analysis

No suspicious patterns detected.