Back to skill

Security audit

openlesson

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a legitimate openLesson tutoring API integration, but it needs review because it teaches unsafe shell command patterns and under-scopes audio privacy and scheduling behavior.

Install only if you intend to give this skill an openLesson API key and send learning topics, session data, and audio recordings to openLesson. Avoid using the documented bash -c variable pattern with user-provided values, and do not allow calendar/reminder actions or audio recording/upload unless the user has explicitly approved them.

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

Error
Location
skill.md:54
Finding

Command Injection Through User-Controlled Topic Interpolation

Content
View full analysis
Remediation
View remediation
&2 exit 1 fi jq -n \ --arg topic "$TOPIC" \ --argjson days "$DAYS" \ '{topic: $topic, days: $days}' | curl --fail-with-body \ -X POST 'https://www.openlesson.academy/api/agent/plan' \ -H "Authorization: Bearer $OPENLESSON_API_KEY" \ -H 'Content-Type: application/json' \ --data-binary @- ``` Additional hardening measures: 1. Validate `DAYS` against the API's accepted numeric range before serialization. 2. Invoke `curl` directly rather than through a nested shell. 3. Keep the API key in the environment or a protected credential store; do not embed it in a generated command string. 4. Avoid verbose tracing such as `set -x` while handling authorization headers. 5. Use `curl --fail-with-body` and check its exit status so API failures are not silently treated as successful operations. 6. Update every command example in the Skill to use structured serialization consistently. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (11)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill states that no calendar access or technical reminder integration is needed, but later instructs the agent to create calendar events or reminders for all sessions. This contradiction can cause an agent to overstep granted permissions, misrepresent capabilities to the user, or attempt unauthorized scheduling behavior.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · skill.md (reported line 49)May include surrounding context.

Basic POST with JSON body

bash
bash -c 'printf "{\"topic\":\"Quantum Computing\",\"days\":60}" | curl -X POST "https://www.openlesson.academy/api/agent/plan" -H "Authorization: Bearer $OPENLESSON_API_KEY" -H "Content-Type: application/json" --data-binary @-'

With variables

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · skill.md (reported line 57)May include surrounding context.

bash
TOPIC="Quantum Computing"
DAYS=60
bash -c "printf '{\"topic\":\"$TOPIC\",\"days\":$DAYS}' | curl -X POST 'https://www.openlesson.academy/api/agent/plan' -H 'Authorization: Bearer $OPENLESSON_API_KEY' -H 'Content-Type: application/json' --data-binary @-"

Start session

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · skill.md (reported line 63)May include surrounding context.

Start session

bash
bash -c 'printf "{\"plan_node_id\":\"NODE_UUID\",\"problem\":\"Explain neural networks\"}" | curl -X POST "https://www.openlesson.academy/api/agent/session/start" -H "Authorization: Bearer $OPENLESSON_API_KEY" -H "Content-Type: application/json" --data-binary @-'

Analyze audio

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

This curl example uploads user audio to the external analyze endpoint. The security concern is not the network request itself but that sensitive voice data is transmitted off-platform without accompanying consent, privacy, or handling safeguards in the skill instructions.

Content

Scanner excerpt · skill.md (reported line 69)May include surrounding context.

Analyze audio

bash
bash -c 'printf "{\"session_id\":\"SESSION_UUID\",\"audio_base64\":\"BASE64_DATA\",\"audio_format\":\"webm\"}" | curl -X POST "https://www.openlesson.academy/api/agent/session/analyze" -H "Authorization: Bearer $OPENLESSON_API_KEY" -H "Content-Type: application/json" --data-binary @-'

Endpoints

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill directs the agent to capture, encode, and send user audio to an external service, and the API response may include transcripts, but it provides no explicit privacy notice, consent requirement, retention notice, or data-handling guidance. Because audio can contain sensitive personal information and biometric characteristics, silent transmission to a third party creates a meaningful privacy and compliance risk.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · skill.md (reported line 237)May include surrounding context.

md
HEADERS = {"Authorization": f"Bearer {API_KEY}"}

# Step 1: Generate a learning plan (optional: specify days)
plan_response = requests.post(
    f"{BASE_URL}/api/agent/plan",
    json={
        "topic": "Quantum Computing",

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · skill.md (reported line 249)May include surrounding context.

md
# Step 2: Start a session for the first node
first_node = next(n for n in plan["nodes"] if n["is_start"])
session_response = requests.post(
    f"{BASE_URL}/api/agent/session/start",
    json={"plan_node_id": first_node["id"], "problem": first_node["title"]},
    headers=HEADERS

External Transmission

Medium
Category
Data Exfiltration
Confidence
92% confidence
Finding

This example sends base64-encoded user audio to an external API for analysis. Because audio may contain sensitive personal content and can be converted into transcripts by the service, this transmission becomes privacy-relevant and more dangerous in the absence of explicit consent and disclosure requirements.

Content

Scanner excerpt · skill.md (reported line 262)May include surrounding context.

md
with open("audio.webm", "rb") as f:
    audio_base64 = base64.b64encode(f.read()).decode()

analyze_response = requests.post(
    f"{BASE_URL}/api/agent/session/analyze",
    json={
        "session_id": session["sessionId"],

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · skill.md (reported line 291)May include surrounding context.

md
3. **Chunk audio**: Send 30-60 second chunks for analysis
4. **Follow up**: If `requiresFollowUp` is true, ask the follow-up question and record response
5. **Track gap scores**: Use gap score to determine when user has mastered a concept
6. **Use bash -c for curl**: When running API calls in shell scripts, use the `bash -c 'printf "..." | curl ... --data-binary @-'` pattern to avoid JSON escaping issues
7. **Schedule all sessions**: When you generate a learning plan, it is important to schedule all the sessions suggested in the plan for your human. Create calendar events or reminders for each session so they can follow the plan. **Always remind your human when a session is due** - don't wait for them to ask.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The skill requires the OPENLESSON_API_KEY credential and instructs agents to use it in Authorization headers, but the markdown does not include a user-facing warning that the skill depends on a secret API credential. For markdown skills, credential-dependent external actions should be disclosed when they can affect user privacy or account access.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.