Back to skill

Security audit

Language Tutor Pro

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent local language tutor, but it automatically retains full learning conversations and profile data with limited user controls, and its setup script has a real path-handling code-injection risk.

Review this before installing if you do not want full lesson transcripts and learning profile details stored locally. Keep the skill data directory private, avoid putting sensitive personal details into practice sessions, and install it only in a normal trusted path such as the documented OpenClaw skills folder until setup.sh is fixed to pass paths safely to Python.

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

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/setup.sh:38
Finding

Python Code Injection Through an Attacker-Controlled Installation Path

Content
View full analysis
/dev/null || echo "") TARGET=$(python3 -c "import json; print(json.load(open('$CONFIG'))['target_language'])" 2>/dev/null || echo "") LEVEL=$(python3 -c "import json; print(json.load(open('$CONFIG'))['current_level'])" 2>/dev/null || echo "") ``` The same unsafe pattern also appears when optional configuration fields are read at lines 63–69. ### Technical Analysis The script places the value of `$CONFIG` directly inside Python source code passed to `python3 -c`. Although the shell expands the variable inside a double-quoted argument, the resulting path is enclosed only by Python single quotes. A single quote and valid Python syntax in the Skill installation path can therefore terminate the Python string and introduce additional statements. Shell quoting does not prevent this issue because the injection occurs when Python parses the already-expanded source string, not while the shell parses the command. An attacker who controls the directory in which the project is placed could use a path component conceptually shaped like: ```text x')));__import__('os').system('ATTACKER_COMMAND');# ``` When incorporated into the generated Python source, this can close the `open`, `json.load`, and `print` calls, execute an injected statement, and comment out the remainder of the source line. Exploitation requires the victim to run `scripts/setup.sh` from an attacker-crafted installation path. The ordinary documented installation path does not contain the necessary characters, but the script neither validates nor safely passes its location. ### Attack Path 1. An attacker creates or distributes the Skill inside a directory whose name contains a single ...[truncated 1054 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (14)

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
85% confidence
Finding

Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.

Content

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

md
Never lecture on culture. Drop it in as a one-line aside:

Ssd 3

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The post-session protocol requires saving full conversation transcripts after every session, which mandates retention of all user-provided text regardless of sensitivity. This is especially risky in a conversational tutor because users may reveal personal history, health, travel plans, or other sensitive details during open-ended practice, making complete transcript logging a high-value privacy target.

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 · SETUP-PROMPT.md (reported line 24)May include surrounding context.

~/.openclaw/workspace/.agents/skills/language-tutor-pro/

text

If that folder doesn't exist yet, create it. The whole folder goes in — don't just copy individual files.

---

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The guide explicitly states that every session is saved and that progress can be exported or shared, but it does not clearly disclose the privacy implications of storing conversation-derived learning data locally. This can expose sensitive personal information, study history, and exported summaries to other local users, backups, sync services, or unintended recipients.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The overview explicitly frames the skill as using persistent memory across every session, and the data model includes conversation history and learner-state retention. Because tutoring conversations can naturally contain personal, behavioral, or sensitive information, broad default retention creates unnecessary exposure if data is accessed, mishandled, or reused beyond user expectations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill specifies persistent storage of learner profiles, progress, and full conversation history, but it does not require clear notice, consent, retention limits, or guidance about sensitive content. In a tutoring context, users may disclose personal details over time, so silent long-term storage increases privacy and data exposure risk.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The onboarding section directs the skill to collect and persist personal profile information in natural-language interaction without any minimization, sensitivity screening, or consent checkpoint. Over time, this can build a detailed learner profile that exceeds what is strictly necessary for language practice and raises privacy and profiling concerns.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The first-session flow asks for personal profile details such as native language, goals, interests, and preferences, then instructs saving them without first warning the user what will be persisted. This creates a privacy risk because users may reasonably treat the exchange as ephemeral while the skill is designed to retain the information across sessions.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The file specifies 'Language: Spanish' and immediately begins the tutoring interaction in Spanish, with no indication that the user selected or opted into that language. This is a natural-language policy concern because it imposes a specific language/locale on the user rather than offering a choice or documenting that the skill is region/language-specific.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script writes a dashboard export containing learning history and profile fields such as native language, sessions, streaks, and recent activity to dashboard-export.json. Although it logs that an export is occurring, there is no disclosure that the file contains potentially sensitive personal learning data or privacy implications of storing it on disk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

This JSON setting hard-codes the skill's native language to English, which can constitute a language/locale policy issue when no user opt-in or justification is present. The file also includes other locale preferences, but there is no indication that these are optional or user-selected.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

This markdown example explicitly sets the session language to Spanish and the rest of the file assumes that language throughout. Under the policy rule for natural-language constraints, forcing a specific language without indicating user selection or opt-in can be a locale/language policy issue.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

The file explicitly sets 'Language: German', and the rest of the lesson proceeds in German without any indication that the learner can opt into another language or that the skill is intentionally region- or language-specific by policy. This is a natural-language locale constraint that can violate the requirement to avoid forcing a specific language without user opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script instructs the user to start the skill with the fixed English phrase "Tell your agent "Let's practice $TARGET"". This is a natural-language policy concern because it prescribes a specific language for interaction without indicating alternatives or user choice.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.