Back to skill

Security audit

Learning Planner

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed local learning-planner skill that stores user learning data on disk, with some install and usability cautions but no evidence of malicious behavior.

Install only if you are comfortable with a local CLI storing learning goals, notes, cards, sessions, and progress in a database under your home config directory. Prefer installing in a virtual environment, review dependency versions, and be careful with delete commands because the inspected data-layer functions do not show confirmation prompts.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
setup.py:10
Finding

Installation Uses Mutable, Unverified Third-Party Dependencies

Content
View full analysis

Vulnerability Details

File Location: setup.py:10-13
Additional Location: package.json:9-12
Vulnerability Type: Supply-chain exposure through unpinned dependencies and an automatic installation lifecycle
Risk Level: Medium

Vulnerable Code

setup.py:10-13:

python
install_requires=[
    "click>=8.0.0",
    "rich>=13.0.0",
],

package.json:9-12:

json
"scripts": {
  "test": "python3 src/learning_cli.py --help",
  "install": "pip install -e ."
},

Technical Analysis

The project specifies mutable dependency ranges rather than exact, reviewed versions and does not provide a lock file or cryptographic package hashes. Therefore, pip install -e . resolves whichever future versions satisfy the declared constraints from the user's configured package index.

In addition, the npm install lifecycle automatically invokes pip. A user running npm install may consequently trigger Python dependency resolution and package installation without separately reviewing or authorizing that step.

This does not establish that the currently named dependencies are malicious. The risk is that the effective installation payload can change after this project has been reviewed. A compromised upstream release, package-index account, mirror, or dependency-resolution environment could introduce attacker-controlled installation or runtime code.

Attack Path

  1. An attacker compromises an upstream dependency release, its publisher account, or a package index or mirror used by the victim.
  2. The attacker publishes a version of click or rich that satisfies the project's open-ended minimum-version constraint.
  3. A user follows the documented pip install -e . procedure or runs npm install, which invokes that command through the install lifecycle.
  4. Pip resolves and downloads the compromised version because no exact version or expected hash is enforced.
  5. Malicious packa ...[truncated 728 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin each direct dependency to an exact, reviewed version rather than using an unrestricted minimum version.
  2. Generate a lock or constraints file that also fixes transitive dependency versions.
  3. Record cryptographic hashes and install with pip install --require-hashes in reproducible deployment workflows.
  4. Use an approved package index or internal mirror and monitor upstream packages for compromise and security advisories.
  5. Remove the npm install lifecycle hook unless automatic Python installation is essential. Prefer a clearly documented, explicit setup command.
  6. Run installation as an unprivileged user inside an isolated virtual environment.
  7. Add automated dependency review and vulnerability scanning to the release process, updating pins only after validation.
Vulnerability Patterns
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (14)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

All user-facing documentation in this file, including the title, description, and command commentary, is written in Chinese with no indication that other languages are supported. Under the stated policy, forcing a specific language without opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
# Learning Planner

Personal learning management system that helps set learning goals, create plans, track progress, and provides spaced repetition review features.

## Features

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · SKILL_EN.md (reported line 29)May include surrounding context.

Learning Goals

bash
# Create a learning goal
learning goal create "Python Programming" --description "Master Python programming language" --deadline 2024-12-31

# Create sub-goals (knowledge breakdown)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
82% confidence
Finding

The manifest description says "Use when: (1) setting learning goals ..." but does not define specific trigger phrases, scope limits, or exclusion conditions. In a manifest file, this broad natural-language activation guidance can overlap with many ordinary planning or productivity requests and may cause unintended invocation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The delete_card function irreversibly removes a card record from storage, but the function contains no confirmation prompt, logging, or explanatory warning beyond a terse docstring. For a destructive operation, this file provides no visible disclosure to help a caller understand the impact before or when it occurs.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This code file contains user-facing natural-language text exclusively in Chinese, including the module description and function docstrings, with no indication that the skill is region-specific or that users can opt into this locale. Under the language/locale policy, forcing a specific language without user choice or documented justification is a policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This code uses Chinese-only natural-language strings throughout docstrings and user-facing console output, such as labels, statuses, and headings. Because the skill forces a specific language without any visible user opt-in or locale selection, it matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

This markdown file includes operational commands such as database initialization and repeated create/update actions for goals, cards, sessions, and reports, which imply writing persistent user data. The description explains functionality but does not warn users that running these commands will create and modify local stored learning data.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The package description is entirely in Chinese, which suggests a language-specific user experience without indicating any option for users to choose another language. Under the stated policy, forcing a specific language without opt-in can be a natural-language policy violation unless the locale constraint is clearly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The only natural-language text in this file is the module docstring '数据库模块', which specifies content in Chinese with no indication that language selection is optional or region-specific. Under the locale policy, forcing a specific language without opt-in can be a policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

Docstrings and explanatory text throughout the file are written only in Chinese, which can amount to a forced language/locale choice under the stated policy when no user choice or justification is provided. There is no indication that this skill is region-specific or that users can opt into this locale.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The natural-language strings in this file are entirely Chinese, including the module description and function docstrings, with no indication that the skill is region-specific or that users may choose another language. Under the stated policy, forcing a specific language without opt-in is a natural-language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The file contains a natural-language docstring of "工具模块" with no accompanying multilingual option or documented reason for restricting language. Under the policy, forcing a specific language without user choice can be a locale/language policy violation.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.