Back to skill

Security audit

meta-academic-tutor

Security checks for vulnerabilities and agentic risk

Overview

This tutoring skill is not clearly malware, but it needs Review because it stores user-derived data and tells agents to rewrite its own instructions without clear controls.

Install only if you are comfortable with a tutoring skill keeping local profile/preferences and with its current self-evolution instructions. It should be revised to remove SKILL.md self-modification, isolate per-user data, add consent/deletion controls, narrow persisted fields, and clarify language/locale handling before broad use.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • 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
  • 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 (2)

T02 · Agent Memory Poisoning

Error
Location
SKILL.md:167
Finding

Persistent Agent Memory Poisoning Through Unvalidated Learning Records and Self-Modification Instructions

Content
View full analysis
1 else True rec = (sys.argv[2] if len(sys.argv) > 2 else "") print(json.dumps(record(ok, rec), ensure_ascii=False)) ``` The relevant Skill instructions state that: - `learned_patterns.json` stores operation statistics, error patterns, user preferences, and improvement suggestions. - Important user preferences are to be written to that file and adopted on later invocations. - After three accumulated errors, learned experience is to be written back into `SKILL.md`. ### Technical Analysis The `record()` function accepts an unrestricted string in `note` and appends it directly to persistent JSON storage. It applies no schema validation, length restriction, content classification, user scoping, or distinction between descriptive data and executable behavioral instructions. This would be ordinary unsafe persistence if the values were only displayed as data. However, the surrounding Skill instructions explicitly require later executions to apply stored preferences and direct the Agent to promote accumulated experience into the governing `SKILL.md`. This creates a trust-boundary violation: text originating in a user interaction can move from un ...[truncated 1744 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/learner.py:5
Finding

Overbroad Profile Access and Plaintext Preference Storage in a Shared Skill Directory

Content
View full analysis
1 else True rec = (sys.argv[2] if len(sys.argv) > 2 else "") print(json.dumps(record(ok, rec), ensure_ascii=False)) ``` The associated Skill instructions require the Agent to read `profile.json` before every response and specify that user preferences are stored in `learned_patterns.json` for later reuse. ### Technical Analysis The Skill requires profile access for every response, regardless of whether the current tutoring request needs historical personalization. This violates data-minimization and least-privilege principles by making access to the complete profile a mandatory default rather than a request-specific operation. The learner stores free-form preferences and notes as plaintext in `scripts/learned_patterns.json`, which is located in the Skill installation directory. The implementation provides no authenticated user namespace, access-control hardening, retention policy, deletion mechanism, consent record, or sensitive-field filtering. Because the storage path is global to the installed script rather than derived from a user-specific identity, every invocation of that installation addre ...[truncated 1243 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The skill claims broad self-verification, reflection, super-agent orchestration, and reliability properties that are not substantiated by the described implementation, while also omitting clear disclosure of persistent file I/O. This can cause unsafe trust decisions by users or orchestrators, who may route sensitive tutoring tasks and profile data to a component whose real behavior and safeguards are materially different from its claims.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill assumes Chinese-language behavior and hardcodes China-specific crisis resources without checking user locale or consent. In safety-critical situations, giving region-mismatched crisis guidance can delay access to appropriate emergency support, and language forcing may cause misunderstanding of instructions or boundaries.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill explicitly instructs writing learned experience back into its own SKILL.md, meaning operational use can mutate the skill's governing instructions over time. Self-modifying policy files are dangerous because they enable prompt drift, persistence of harmful behaviors, and tampering with future safety constraints without a controlled review process.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The skill documents persistent local writes via learner/profile/session files but declares no explicit tool scope or permissions boundary. That omission weakens least-privilege controls and can let a host agent invoke file-writing behavior without clear operator awareness or policy gating.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The skill directs cross-session retention of user profile, coursework, paper progress, and preferences without clear minimization, retention limits, or consent flow. Persistent educational profiles can reveal sensitive identity and institutional context, making them valuable if accessed by other skills, users, or processes on the host.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The usage section says to directly call the skill for tasks in the entire academic-tutor domain, but it does not define concrete trigger phrases, boundaries, or negative examples. For a markdown skill file, this broad activation scope can overlap with many ordinary education-related requests and make it unclear when this specific skill should or should not activate.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
71% confidence
Finding

NEVER 8 states the skill is entirely local, forbidding external API calls and network-dependent libraries. But the description also says it plugs into super-agent orchestration and a meta-evolver sense/plan/record loop, which presents an intent-level contradiction unless those integrations are explicitly local-only; as written, the documentation conveys two conflicting operational models.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

An academic-tutor skill is extended with a generic self-evolution subsystem that records arbitrary capabilities, failures, and preferences unrelated to tutoring. This creates function creep: a narrowly trusted educational skill becomes a general-purpose persistence component, increasing the chance of collecting or reusing data outside the user's expected context.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The learner loop persistently stores usage history, failures, preferences, and insights in learned_patterns.json, expanding the amount of user-derived behavioral data kept across sessions. Without strict boundaries, this can become a shadow profile that is reused in unintended contexts or exposed through local file access.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The only natural-language description in the file is a Chinese docstring, which forces a specific language for understanding the skill's purpose. The policy requires avoiding fixed language constraints unless the user is given a choice or the locale restriction is explicitly justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file contains all user-facing natural-language content in Chinese, and there is no indication that the user opted into that language or that the skill is region-specific. Under the policy, forcing a specific language without opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code writes operational results and notes to a persistent JSON file, which affects local user data. While the module docstring describes the learning purpose, there is no confirmation prompt, visible log/print before writing, or inline warning near the write operation itself, so the persistence behavior may not be apparent when the function is invoked programmatically.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.