Back to skill

Security audit

meeting-to-kanban

Security checks for vulnerabilities and agentic risk

Overview

This skill is a straightforward local meeting-notes-to-Kanban helper with a small CSV export script, though exported CSVs should be treated carefully when opened in spreadsheet software.

Install only if you are comfortable with a local Python helper that reads task JSON and writes CSV output. Treat meeting content and generated CSVs as untrusted when they come from other people, and avoid opening exported CSVs in spreadsheet apps unless formula-prefixed values have been sanitized.

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/tasks_to_kanban.py:14
Finding
CSV Formula Injection in Kanban Export## Vulnerability Details **File Location**: `scripts/tasks_to_kanban.py`, lines 14–15 **Vulnerability Type**: CSV formula injection **Risk Level**: Medium ### Vulnerable Code ```python for t in tasks: w.writerow({k: t.get(k, "") for k in fields}) ``` ### Technical Analysis The script copies task values from a user-supplied JSON document directly into CSV cells without neutralizing spreadsheet formula prefixes. Values whose first non-whitespace character is `=`, `+`, `-`, or `@` may be interpreted as formulas when the resulting CSV file is opened in spreadsheet software. CSV quoting does not prevent this behavior because spreadsheet applications can evaluate formula syntax inside correctly quoted fields. An attacker-controlled meeting transcript or task document could therefore introduce a value such as: ```text =HYPERLINK("https://attacker.example","Open task details") ``` The script would preserve that value in the generated CSV. Exploitability and exact behavior depend on the spreadsheet application and its security settings. ### Attack Path 1. An attacker supplies meeting content or task data containing a formula-prefixed field. 2. The content is converted into a JSON task whose `title`, `owner`, `due`, `priority`, `status`, or `notes` field contains the payload. 3. The script loads the attacker-influenced JSON file. 4. Lines 14–15 write the field into the CSV without sanitization. 5. A recipient opens the generated CSV in spreadsheet software. 6. The spreadsheet interprets the field as a formula or presents attacker-controlled formula output. 7. Depending on application protections and user interaction, the formula may expose deceptive links, trigger external resource requests, or invoke dangerous legacy spreadsheet functionality. ### Impact Assessment The script itself does not gain additional operating-system privileges and does not execute the payload during CSV generation. The impact occurs in the context of the user who later opens the C ...[truncated 557 chars]
Remediation
## Remediation Suggestions Sanitize every text value before passing it to `csv.DictWriter`. If the first non-whitespace character is `=`, `+`, `-`, or `@`, prefix the value with an apostrophe or otherwise encode it according to the requirements of the target spreadsheet application. For example: ```python def sanitize_csv_cell(value): if value is None: return "" value = str(value) if value.lstrip().startswith(("=", "+", "-", "@")): return "'" + value return value for t in tasks: w.writerow({ k: sanitize_csv_cell(t.get(k, "")) for k in fields }) ``` Additional hardening should include: 1. Validate that the parsed JSON root is a list and that every task is an object. 2. Convert non-string field values explicitly rather than relying on implicit CSV serialization. 3. Document that exported files may contain untrusted meeting content. 4. Add automated regression tests covering formula-prefixed values, including values with leading spaces, tabs, and line breaks. 5. Test generated files with the spreadsheet applications expected to consume them, because formula-neutralization behavior can vary by application.
Vulnerability Patterns
  • 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
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (8)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill description promises transformation of unstructured meeting notes into a Kanban board, but the detected implementation only converts already-structured JSON tasks to CSV. This mismatch can mislead users and orchestrators into trusting the skill to parse sensitive meeting content correctly, causing silent data loss, omitted blockers, or incorrect action tracking in operational workflows.

Vague Triggers

Medium
Confidence
89% confidence
Finding
The trigger phrase "给我做项目任务板" is broad and could match many ordinary project-management requests unrelated to this specific skill. The README provides example triggers but does not include exclusion conditions or constraints that clarify when this skill should or should not activate.

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill advertises use of a local script and generation of CSV/Markdown artifacts, but it does not declare any explicit tool scope such as file read/write permissions. That gap weakens least-privilege controls and makes it harder for a host agent or reviewer to constrain what the skill may access or modify if the bundled script is invoked.

Vague Triggers

Medium
Confidence
87% confidence
Finding
The trigger phrase "给我做项目任务板" is generic and could match common everyday requests for making a project task board, not specifically converting meeting notes or transcripts into a Kanban board. The file does not provide exclusion conditions or negative examples to narrow when this skill should activate versus other planning or PM-related skills.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The trigger phrase "给我做项目任务板" is generic and could match many ordinary project-management requests unrelated to this specific meeting-to-kanban skill. The file does not provide exclusion conditions or constraints clarifying that the trigger is only for transforming meeting notes or transcripts into a kanban board.

Natural-Language Policy Violations

Low
Confidence
76% confidence
Finding
The skill documentation presents key usage sections and some trigger phrases in Chinese while not stating whether users may interact in other languages or choose their preferred locale. This can amount to an implicit language constraint without opt-in, especially for activation guidance.

Natural-Language Policy Violations

Low
Confidence
75% confidence
Finding
The trigger list mixes languages and includes Chinese-specific invocations, but the document does not clarify language selection behavior or whether users may interact in their preferred language. This can create an implicit locale expectation without explicit opt-in or documented choice.

Natural-Language Policy Violations

Low
Confidence
86% confidence
Finding
This markdown file presents all operational instructions in Chinese, but does not state that the skill is Chinese-only, region-specific, or that the user can choose another language. Under the policy rule, forcing a specific language without opt-in can be a natural-language policy violation.

Static analysis

No suspicious patterns detected.