Back to skill

Security audit

Ml Roadmap

Security checks for vulnerabilities and agentic risk

Overview

This skill is a local ML-roadmap note tracker with disclosed plain-text storage, but users should treat saved and exported entries as potentially sensitive.

Install only if you are comfortable with your ML notes and drafts being saved as plain-text files under ~/.local/share/ml-roadmap/. Avoid entering secrets or confidential material, be careful opening CSV exports in spreadsheet software, and manually delete the data directory if you want to remove saved history.

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/script.sh:74
Finding

CSV Formula Injection in Exported Roadmap Data

Content
View full analysis

Vulnerability Details

File Location: scripts/script.sh, lines 74–79
Vulnerability Type: CSV formula injection caused by unsafe serialization of user-controlled data
Risk Level: Medium

Vulnerable Code

bash
csv)
    echo "type,time,value" > "$out"
    for f in "$DATA_DIR"/*.log; do
        [ -f "$f" ] || continue
        local name=$(basename "$f" .log)
        while IFS='|' read -r ts val; do echo "$name,$ts,$val" >> "$out"; done < "$f"
    done
    ;;

Technical Analysis

The value field originates from command-line input and is persisted in a log without validation. During CSV export, the script writes this user-controlled value directly into a CSV row without applying CSV quoting, escaping embedded delimiters, or neutralizing spreadsheet formula prefixes.

Spreadsheet applications may interpret cells beginning with characters such as =, +, -, or @ as formulas. Consequently, an attacker who can persuade a user to save crafted content can cause the subsequent CSV export to contain an executable spreadsheet formula rather than inert text.

The lack of CSV quoting also allows commas, quotation marks, and line breaks in an entry to alter the exported row or create additional cells and records, making it easier to position malicious formula content.

Attack Path

  1. An attacker supplies or recommends a crafted roadmap entry beginning with a spreadsheet formula marker, for example a value beginning with =.
  2. The victim invokes a content command such as ml-roadmap draft with that value.
  3. The script stores the attacker-controlled value in a log under ~/.local/share/ml-roadmap/.
  4. The victim runs ml-roadmap export csv.
  5. Lines 74–79 copy the value into export.csv without safe CSV encoding or formula neutralization.
  6. The victim opens the exported file in a spreadsheet application.
  7. If that application evaluates formulas from imported CSV files, the in ...[truncated 672 chars]
Remediation
View remediation

Remediation Suggestions

  • Replace manual comma concatenation with a standards-compliant CSV encoder.
  • Quote every field and escape embedded quotation marks by doubling them according to RFC 4180.
  • Preserve embedded commas and line breaks as quoted field content rather than allowing them to create new cells or rows.
  • Neutralize fields whose first non-whitespace character is =, +, -, or @. A common defensive approach is to prefix such values with an apostrophe, subject to the requirements of the target spreadsheet applications.
  • Apply neutralization to every exported field that can be influenced by external or stored data, not only the value field.
  • Add tests covering formula prefixes, commas, quotation marks, carriage returns, and line feeds.
  • Document that exported files contain user-provided content and should be treated as untrusted when opened in spreadsheet software.
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description suggests an informational or educational machine learning roadmap about ML concepts, Python, data, and data science. The code does not provide ML roadmap content or concept navigation functionality. Instead, it is a generic local content toolkit/CLI for recording text entries under various content-production labels and managing those logs with export, search, status, and statistics features. This is a materially different primary purpose and includes undeclared data storage and export capabilities, so the description does not accurately represent the code's behavior.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The implemented behavior is a generic content logging and drafting toolkit rather than a machine-learning-roadmap skill as described. This mismatch is security-relevant because users may disclose information under a misleading trust context, and the script then stores and manages that content persistently.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The inline comments explicitly describe the script as a content tool/toolkit, contradicting the declared machine learning roadmap identity. This inconsistency strengthens the conclusion that the package is misrepresented, which can mislead users about purpose and data handling.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The script creates a persistent data directory and logs activity/history even though the skill is presented as a machine learning roadmap. Undisclosed persistence increases privacy risk because users may enter sensitive notes expecting transient educational assistance, while the tool silently retains them.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The tool accumulates all submitted content and exposes commands to search, display, and export that history, effectively turning the skill into a local data repository. In the context of a misleadingly labeled educational skill, this broad data retention and retrieval capability increases the chance of unintended disclosure of sensitive user content.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

User-provided content is written verbatim to persistent local log files without any notice, consent, retention policy, or sanitization. This is dangerous because users may enter confidential drafts or personal data that remain accessible on disk and can later be searched, displayed, or exported.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill explicitly stores arbitrary user input persistently under a local directory and supports exporting that data, but it does not warn users that sensitive notes, schedules, prompts, or other personal content may remain on disk. This can lead to unintentional privacy exposure on shared systems, backups, or when exported files are handled insecurely.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.