Back to skill

Security audit

Ai Course Agent

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it advertises, but it handles reusable credentials and paid billing in ways users should review before installing.

Install only if you are comfortable providing Edustem credentials to the configured endpoint and accepting paid SkillPay usage. Before production use, require a stable verified Edustem domain, rotate/remove the embedded SkillPay key, add explicit user confirmation before charges, validate configuration before billing, and separate mocked tests from live billing/API tests.

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 (3)

other

Error
Location
src/edustem-api.ts:79
Finding

Edustem Account Credentials Transmitted to a Hardcoded Ephemeral Tunnel

Content
View full analysis
{ try { const form = new FormData(); form.append("username", username); form.append("password", password); const response = await axios.post( `${API_BASE_URL}/login/`, form, { headers: form.getHeaders(), }, ); if (response.data.status !== 200) { throw new Error(`Login failed with status ${response.data.status}`); } return response.data.data.token; } catch (error) { throw handleError("Login failed", error); } } ``` The transmitted credentials originate from environment variables: ```typescript export function getEdustemConfig(): EdustemConfig { const username = process.env.EDUSTEM_USERNAME; const password = process.env.EDUSTEM_PASSWORD; if (!username || !password) { throw new Error( "Missing Edustem credentials. Set EDUSTEM_USERNAME and EDUSTEM_PASSWORD environment variables.", ); } return { username, password }; } ``` ### Technical Analysis The Skill reads a reusable Edustem username and password from secret environment variables and submits both to a hardcoded `ngrok-free.app` endpoint. Although HTTPS protects the request in transit, it does not establish that the endpoint operator is Edustem or that the transient tunnel is an authorized credential recipient. An ngrok hostname is generally controlled through a tunnel account and may be temporary, reassigned, comp ...[truncated 1818 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/skillpay.ts:42
Finding

Production SkillPay API Secret Embedded in Distributed Source Code

Content
View full analysis
{ const { apiKey } = getBillingConfig(); return { 'X-API-Key': apiKey, 'Content-Type': 'application/json', }; } ``` ### Technical Analysis The package embeds a live-looking SkillPay API key and Skill ID directly in source code. Every user who downloads the package can inspect and extract these values. The comment stating that the secret must not be exposed does not provide protection because JavaScript and TypeScript packages cannot securely conceal credentials distributed to clients. The key is attached as `X-API-Key` to charge, balance, and payment-link requests. If SkillPay authorizes these operations solely through this key, an attacker can invoke the API independently of the Skill and impersonate the author-controlled billing integration. This is a direct violation of secret-management principles: credentials must not be committed to source control or shipped in client-side artifacts. ### Attack Path 1. An attacker downloads the Skill package or accesses its repository. 2. The attacker opens `src/skillpay.ts`. 3. The attacker extracts the hardcoded API key and Skill ID. 4. The attacker sends direct HTTP requests to the SkillPay billing API with the stolen `X-API-Key`. 5. Depen ...[truncated 825 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/agent.ts:54
Finding

Users Are Charged Before Configuration Validation and Successful Course Delivery

Content
View full analysis
Remediation
View remediation
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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (46)

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 · README.md (reported line 218)May include surrounding context.

md
- [ ] Implement retry logic with exponential backoff
- [ ] Support more subjects and locales
- [ ] Add structured logging
- [ ] Move credentials to .env file
- [ ] Add input validation and sanitization

## Tech Stack

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding

The documentation promises NLP detection, external course creation, course-link generation, and billing, but the reported implementation apparently does not provide those features. Security-wise, this kind of mismatch is risky because it undermines auditability and can conceal placeholders, stubs, or substituted logic that behaves differently in production.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documentation promises NLP detection, external course creation, course-link generation, and billing, but the reported implementation apparently does not provide those features. Security-wise, this kind of mismatch is risky because it undermines auditability and can conceal placeholders, stubs, or substituted logic that behaves differently in production.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding

The documentation promises NLP detection, external course creation, course-link generation, and billing, but the reported implementation apparently does not provide those features. Security-wise, this kind of mismatch is risky because it undermines auditability and can conceal placeholders, stubs, or substituted logic that behaves differently in production.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.5 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
95% confidence
Finding

axios is a direct production dependency and this skill’s purpose explicitly involves outbound API calls, so HTTP client flaws are relevant. If any of the listed advisories affecting redirects, proxy handling, SSRF, prototype pollution gadgets, or credential leakage are reachable, an attacker could influence requests to internal or unintended hosts, leak secrets, or tamper with responses.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: brace-expansion==1.1.12 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: flatted==3.3.3 — 2 advisory(ies): CVE-2026-32141 (flatted vulnerable to unbounded recursion DoS in parse() revive phase); CVE-2026-33228 (Prototype Pollution via parse() in NodeJS flatted)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
83% confidence
Finding

form-data is a direct production dependency, and the cited CRLF injection issue can matter if multipart field names or filenames are constructed from untrusted input. In that case, an attacker may be able to alter multipart boundaries or inject additional headers/parts, potentially confusing downstream services or enabling request smuggling-like effects at the application layer.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: js-yaml==4.1.1 — 4 advisory(ies): CVE-2026-84375 (js-yaml: maxTotalMergeKeys does not limit CPU use for empty merge sources); CVE-2026-59869 (js-yaml: YAML merge-key chains can force quadratic CPU consumption); GHSA-5p4m-2wfm-xmqj (JS-YAML: Quadratic CPU consumption in !!omap resolution (3.x and 4.x) — CVE-2026) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: minimatch==3.1.2 — 3 advisory(ies): CVE-2026-27904 (minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regu); CVE-2026-26996 (minimatch has a ReDoS via repeated wildcards with non-matching literal in patter); CVE-2026-27903 (minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adja)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.5 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
97% confidence
Finding

The skill declares axios with a broad range that can resolve to a version identified by the scanner as vulnerable, including SSRF- and request-handling-related advisories. This is especially relevant because the skill's stated purpose is to make outbound API requests to Edustem, so flaws in HTTP client proxy handling, header processing, or prototype-pollution-related gadgets could materially affect request security and potentially leak credentials or reach unintended hosts.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
95% confidence
Finding

The flagged form-data version has a CRLF injection advisory, which can be dangerous when multipart field names or filenames incorporate untrusted input. Given this skill likely interacts with an external API and may build multipart requests, an attacker-controlled field component could potentially manipulate request structure or headers, causing request smuggling or injection effects against upstream services.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The file specifies a mandatory Chinese teacher_notes format and presents the user input pattern exclusively in Chinese, including examples, with no indication that users may choose another language. This creates a natural-language locale constraint that is neither optional nor clearly justified as a region-specific skill.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README explicitly states that SkillPay billing credentials are hardcoded in the skill. Embedding billing or API credentials in code is a real security weakness because anyone with source access, logs, bundles, or accidental disclosures may recover them and abuse payment functions, impersonate the skill, or redirect billing operations. In this context, the capability is especially sensitive because it controls charging users and transferring value to the author's account.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill declares access to secrets and implicitly requires outbound network access, but it does not declare any explicit tool scope or permission boundaries. That makes the skill harder to audit and increases the chance that a host or user enables broader capabilities than intended, especially since it uses external authentication and billing-related flows.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

A broad trigger description without tight activation boundaries can cause the skill to activate on ordinary conversation and send unintended content into its external workflow. In this skill, that risk is amplified because activation may lead to billing and transmission of user-provided educational requests to third-party services.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The description states that the skill generates courses from natural-language requests in Chinese, which imposes a language constraint. Because the file does not present this as an optional user choice or explain a necessary region-specific limitation, it appears to force a specific language in a way that conflicts with the stated policy.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill does not clearly warn users that their requests will be transmitted to an external API provider. This is a privacy and consent issue, especially since user messages may contain educational, personal, or institutional information and are combined with authenticated third-party account access.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Everyday Chinese phrases as triggers, without constraints or exclusions, increase the chance of accidental invocation. Because this skill can charge tokens and submit data externally, accidental triggering can create unwanted costs and unintended disclosure of user input.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This file contains user-facing messages in Chinese, and the parser only recognizes Chinese-language request patterns and subjects. That effectively forces a specific language/locale without user opt-in, which matches the policy-violation criteria for language or locale restrictions.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The examples and regex patterns only support Chinese phrasing such as '年级' and a fixed list of Chinese subject names. This is a natural-language policy issue because the skill enforces a single language/locale behavior rather than offering choice or clearly documented limitation.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The manifest describes a skill that generates courses from Chinese requests via the Edustem API and uses SkillPay for billing, but it does not mention accessing host environment variables for secrets. Reading process environment for credentials is a sensitive capability that is not clearly justified by the stated purpose as presented in the manifest.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The login function sends raw username and password credentials to a third-party remote API endpoint, and this file provides no user-facing disclosure, consent flow, or indication of how those credentials are sourced or protected. In an agent skill context, this is risky because users may not expect the skill to collect and forward credentials to an externally hosted service, especially one exposed through an ngrok domain, which increases trust and phishing concerns.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Line L05 says the skill 'Supports natural language input in Chinese,' which imposes a language constraint in natural-language documentation. The file does not indicate that users may choose another language or that the Chinese-only scope is required for a documented region-specific reason.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
85% confidence
Finding

The module automatically interprets user messages and triggers course generation with billing side effects, without any explicit confirmation, authorization check, or anti-abuse guard in this layer. In this skill context, autonomous execution is more dangerous because the action consumes tokens and may let accidental, spoofed, or prompt-injected text trigger paid operations on behalf of a user.

Content

Scanner excerpt · src/integration.ts (reported line 5)May include surrounding context.

ts
* Integration with OpenClaw Main Session
 *
 * This module detects course generation requests from user input
 * and automatically executes the course generation flow.
 */

import { generateCourse, parseCourseRequest } from "./agent";

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
src/skillpay.ts:39