Back to skill

Security audit

English Learning Coach

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent English coach, but it silently keeps detailed local learning records and reuses unsanitized learner text later, so users should review it before installing.

Install only if you are comfortable with the skill saving local records of your practice text, mistakes, scores, vocabulary, CEFR estimates, and quiz history. Avoid practicing with sensitive personal or workplace content unless storage is clarified. A safer version should ask before recording, show where data is stored, provide view/export/delete controls, set retention expectations, and sanitize stored Markdown before using it in later reviews.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T02 · Agent Memory Poisoning

Warning
Location
scripts/learning_store.py:315
Finding

Persistent Prompt Injection Through the Error Book

Content
View full analysis
None: if normalized_verdict(event.get("verdict")) != "corrected": return errors = event.get("errors") or [] if not errors: return lines = [f"\n### Correction {timestamp}\n", f"- Original: {event.get('input', '')}\n"] if event.get("correction"): lines.append(f"- Correction: {event['correction']}\n") for error in errors: if not isinstance(error, dict): continue category = error.get("category", "unknown") span = error.get("span", "") fix = error.get("fix", "") note = error.get("note", "") lines.append(f"- [{category}] {span} -> {fix}. {note}\n") with (data_dir / "error-book.md").open("a", encoding="utf-8") as fh: fh.writelines(lines) ``` The persisted file is later designated as an input source: ```markdown ### `/review` Pick 3-5 recurring error patterns from `error-book.md` and recent events. Give short examples and one tiny practice task. ``` ### Technical Analysis The `append_error_book` function interpolates multiple untrusted event fields directly into an agent-readable Markdown document: - `input` - `correction` - `category` - `span` - `fix` - `note` The implementation performs no schema validation, newline filtering, Markdown escaping, instruction-content neutralization, or meaningful length restriction before persistence. An attacker can therefore place line breaks, headings, quoted instructions, or other prompt-like content into these fields and alter the apparent structure of `error-book.md`. This becomes an agent memory poisoning issue because `SKILL.md` explicitly in ...[truncated 2435 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (8)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill explicitly says to Record learning data silently and to avoid showing persistence notes, which directs hidden collection of user language data. Silent retention of user inputs, errors, and inferred proficiency is dangerous because users may reveal sensitive personal, educational, or workplace information during conversation without knowing it is being stored.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The specified data files (events.jsonl, profile.json, vocab.json, error-book.md, checkpoints.json) contain detailed longitudinal learner records, including raw inputs, corrections, scores, vocabulary, and CEFR estimates, yet no clear user-facing privacy warning or consent flow is required. This creates a meaningful privacy risk because the stored corpus can reveal identity clues, interests, schedules, and educational profiling over time.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill describes use of environment variables and persistent file reads/writes (<skill-root>/data, ENGLISH_LEARNING_COACH_DATA_DIR, scripts/learning_store.py) but declares no tool scope or permission boundary. That mismatch can let a host agent invoke filesystem capabilities without clear least-privilege constraints, increasing the chance of unintended data access or persistence beyond what users expect.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The trigger language is very broad (whenever the user wants English conversation practice, asks to chat in English while being corrected only when needed), which can cause the skill to activate for ordinary English chat or correction requests unexpectedly. In context, unintended invocation matters because the skill also changes response behavior and records learner data, so over-triggering expands privacy and usability risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The instruction says 'For Chinese setup questions or management commands, answer in Chinese,' which imposes a specific response language rather than offering a user choice. This is a natural-language locale policy issue because the skill mandates Chinese output in some cases without documenting opt-in or allowing another preferred language.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The required correction block fixes the 'Reason' field as a 'short Chinese explanation,' forcing a specific explanation language for all users. This violates the language-choice expectation unless the skill explicitly limits itself to Chinese-speaking learners or lets users opt into Chinese explanations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The manifest describes and instructs the skill to operate specifically in English conversation mode and to keep responses in English by default. This is a natural-language locale policy constraint without any explicit user choice or opt-in mechanism documented in the file.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The module docstring describes this as a store for the "English Learning Coach" skill, and the implementation further hard-codes English-focused data structures and descriptions. Under the policy rule, forcing a specific language or locale without explicit user choice or documented regional justification is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.