Back to skill

Security audit

Meeting Assistant

Security checks for vulnerabilities and agentic risk

Overview

This Chinese meeting-assistant skill is purpose-aligned and local-only, but users should understand that meeting content may be saved as plaintext JSON.

Install only if you are comfortable with meeting details being saved locally in plaintext JSON. Avoid using it for highly confidential meetings unless storage permissions, retention, and deletion practices are acceptable in your environment.

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
meeting_assistant.py:96
Finding

Plaintext Persistence of Potentially Sensitive Meeting Data

Content
View full analysis

Vulnerability Details

File Location: meeting_assistant.py:96-99 and meeting_assistant.py:145-163
Vulnerability Type: Sensitive data stored in plaintext without explicit access controls
Risk Level: Medium

Vulnerable Code

python
def save_json(filepath, data):
    """Save JSON data."""
    with open(filepath, "w", encoding="utf-8") as f:
        json.dump(data, f, ensure_ascii=False, indent=2)
python
meeting = {
    "id": generate_meeting_id(),
    "title": title,
    "date": datetime.now().strftime("%Y-%m-%d %H:%M"),
    "host": host,
    "location": location,
    "attendees": attendees or parsed.get("attendees", []),
    "absent": parsed.get("absent", []),
    "agenda": parsed.get("agenda", []),
    "discussion": parsed.get("discussion", ""),
    "decisions": parsed.get("decisions", []),
    "action_items": parsed.get("action_items", []),
    "next_meeting": parsed.get("next_meeting", {}),
    "created": datetime.now().isoformat()
}

data["meetings"].append(meeting)
save_json(MEETINGS_FILE, data)

Technical Analysis

The application persistently stores meeting participants, locations, discussion content, decisions, and action items in meetings.json using ordinary plaintext JSON serialization. The write operation does not explicitly apply owner-only file permissions, encrypt sensitive fields, implement retention limits, or obtain confirmation before persistence.

Consequently, effective protection depends entirely on the process environment and its default filesystem umask. On a shared or incorrectly configured system, another local user or process may be able to read confidential meeting records. The repository also contains a populated meetings.json, demonstrating that generated records can remain in the project directory and potentially be copied, archived, or committed inadvertently.

No evidence of remote exfiltration, command execution, privile ...[truncated 1389 chars]

Remediation
View remediation

Remediation Suggestions

  1. Create storage files with owner-only permissions such as 0600, and ensure the containing directory is restricted to the owning user.
  2. Verify and correct permissions when opening an existing data file rather than relying on the environment's default umask.
  3. Store sensitive records in an operating-system-protected application data directory instead of alongside source code.
  4. Use platform-backed encryption or an authenticated encryption scheme for sensitive meeting content, with keys kept outside the project directory.
  5. Inform users clearly that submitted content will be stored persistently and obtain confirmation before saving confidential minutes.
  6. Implement configurable retention periods and secure deletion controls.
  7. Add meetings.json and other generated data files to .gitignore to reduce accidental source-control disclosure.
  8. Consider atomic writes through a securely created temporary file followed by replacement to prevent partial files and reduce unsafe file-handling behavior.
Vulnerability Patterns
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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 (9)

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The invocation examples are generic natural-language phrases such as '整理会议纪要' and '提取待办事项', which can easily overlap with ordinary user requests in a chat environment. This can cause accidental skill activation or ambiguous routing, leading the assistant to invoke the skill when the user did not explicitly intend to use it.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger section lists generic phrases such as '待办事项、行动计划' and '安排会议、日程' plus broad scenarios like '用户需要整理会议纪要'. These are common intents in ordinary conversation, and the file does not provide constraints, explicit invocation boundaries, or negative examples to clarify when this skill should or should not activate.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill explicitly stores meeting records in a local JSON file, including attendees, notes, and action items, but does not disclose retention, access controls, or consent considerations for potentially sensitive business information. This creates a real privacy and data-handling risk because users may provide confidential meeting content without realizing it will persist on disk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

Natural-language strings, command triggers, templates, and outputs throughout the file are written in Chinese, and the routing logic depends on Chinese trigger phrases such as '安排会议' and '整理会议'. There is no indication that users may opt into another language or that the locale limitation is explicitly documented as a justified regional constraint.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill persists meeting notes, attendee names, action items, and related metadata to local JSON files without any notice, consent flow, retention policy, or access controls. In a meeting assistant context, this can expose sensitive business or personal information to other local users, backups, logs, or unintended operators, especially because users may assume they are only receiving transient formatting help.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The default help output advertises '创建会议' and '待办列表' capabilities, implying the assistant can schedule meetings from a natural-language request and view a todo list. In practice, the '安排会议/创建会议' branch only returns a prompt asking for information without creating anything (L428-L438), and there is no implementation for a todo list view at all—'待办/任务' only extracts action items from provided text (L542-L553).

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The natural-language instructions and usage examples are written entirely in Chinese, which can imply a fixed language requirement for interacting with the skill. There is no statement that users may choose another language or that the Chinese-only presentation is intentional for a region-specific audience.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file's headings, trigger rules, functionality, and example dialogue are all presented in Chinese, which effectively imposes a language choice on users. There is no statement offering multilingual support, user opt-in, or a documented reason that the skill is intentionally restricted to a Chinese-language context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

This JSON file contains user-facing meeting content entirely in Chinese, including the title, attendee labels, and agenda items. Because the file provides no indication that Chinese is optional, user-selected, or justified by a region-specific constraint, it may violate language/locale policy requirements.

Content

No source excerpt is available for this finding.