Back to skill

Security audit

Voice Memo Sync

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly aligned with voice memo transcription, but it has broad access to private recordings, personal context, Apple Notes/Reminders, and contains exploitable script patterns that warrant review before installation.

Review before installing. Use this only if you are comfortable with private recordings being copied into OpenClaw memory and summarized into Apple Notes/Reminders. Avoid untrusted JSON/CSV filenames, note titles/bodies, transcript text, and remote URLs until the script injection issues are fixed. Keep heartbeat auto-sync disabled unless you explicitly want recurring processing, and prefer a configuration that requires confirmation before reading personal memory files or writing to iCloud-backed apps.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (6)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/process.sh:203
Finding

Arbitrary Python Code Execution Through Crafted JSON or CSV Filenames

Content
View full analysis
20: print(f'{k}: {v}') else: extract_text(v, depth+1) elif isinstance(obj, list): for item in obj: extract_text(item, depth+1) extract_text(data) " } process_csv() { local file="$1" log "处理CSV文件..." # 转为可读格式 python3 -c " import csv with open('$file', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: for k, v in row.items(): if v and len(str(v)) > 10: print(f'{k}: {v}') print('---') " } ``` ### Technical Analysis The user-controlled file path is interpolated directly into source code passed to `python3 -c`. Shell quoting around `"$file"` does not protect the Python program because the path is inserted inside a Python single-quoted string. A filename containing a single quote can terminate the `open()` argument and inject arbitrary Python statements. The injected statements execute with the same user account and filesystem permissions as the Skill process. Both the JSON and CSV handlers are affected. ### Attack Path 1. An attacker creates or supplies a JSON or CSV file whose path contains Python syntax, including a single quote. 2. The file extension causes `detect_type()` to select `json` or `csv`. 3. `process_json()` or `process_csv()` inserts the path into the `python3 -c` program. 4. The ...[truncated 891 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/create-apple-note.sh:10
Finding

AppleScript Injection in Apple Notes Creation

Content
View full analysis
$FOLDER" ``` ### Technical Analysis The script dynamically constructs AppleScript source using shell-controlled values. `FOLDER` is inserted without any escaping. `TITLE` and `BODY` only have double quotes prefixed with a backslash. This is not a safe AppleScript serialization mechanism and does not reliably handle backslashes, line breaks, control characters, or combinations that alter AppleScript parsing. Because the heredoc delimiter is unquoted, shell expansion occurs before the resulting source is passed to `osascript`. An attacker who controls the folder, title, or body can attempt to terminate the intended string and inject AppleScript statements. AppleScript can invoke shell commands through `do shell script`, making this a potential local code-execution vulnerability rather than only a Notes-formatting issue. ### Attack Path 1. An attacker supplies a crafted folder argument, title, or note body. 2. The script performs no escaping on the folder and incomplete escaping on the title and body. 3. The crafted value is expanded directly into the heredoc. 4. `osascript` parses the resulting attacker-influenced source ...[truncated 875 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
scripts/monitor-transcription.sh:13
Finding

Path Traversal and Predictable Temporary-File Operations Through Output Name

Content
View full analysis
"$PID_FILE" ``` ```bash wait "$WHISPER_PID" EXIT_CODE=$? rm -f "$PID_FILE" if [ $EXIT_CODE -eq 0 ]; then OUTPUT_TXT=$(find "$DATA_DIR/transcripts" -name "$(basename "${AUDIO_FILE%.*}").txt" -newer "$LOG_FILE" 2>/dev/null | head -1) if [ -n "$OUTPUT_TXT" ] && [ -f "$OUTPUT_TXT" ]; then if [ "$OUTPUT_TXT" != "$OUTPUT_FILE" ]; then mv "$OUTPUT_TXT" "$OUTPUT_FILE" log "Renamed to: $OUTPUT_FILE" fi fi fi ``` ### Technical Analysis The optional `OUTPUT_NAME` argument is used in log, PID, and transcript paths without validation. It may contain path separators or traversal components such as `../`. This permits intended paths to escape the log, transcript, or `/tmp` locations. The predictable PID filename under `/tmp` also creates a symlink attack surface. If another local process creates a matching symlink before execution, the `echo` redirection can overwrite the symlink target. The subsequent `rm -f` and transcript `mv` operations further act on attacker-influenced paths. The quoting prevents shell word splitting, but it does not prevent filesystem path traversal or symlink resolution. ### Attack Path Path-traversal scenario: 1. An attacker invokes the monitor with a crafted second argument containing traversal sequences. 2. `OUTPUT_FILE`, `LOG_FILE`, or `PID_FILE` resolves outside its intended directory. 3. Whisper output, logs, PID data, or the final `mv` operation writes to the ...[truncated 918 chars]
Remediation
View remediation
&2 exit 1 ;; esac ``` 3. Canonicalize destination paths and verify they remain under the expected log or transcript directory. 4. Replace predictable PID paths with `mktemp`: ```bash PID_FILE=$(mktemp "${TMPDIR:-/tmp}/voice-memo-whisper.XXXXXX") chmod 600 "$PID_FILE" ``` 5. Refuse to overwrite existing transcript files unless explicitly requested. 6. Check destinations with `lstat` or equivalent logic and reject symbolic links. 7. Add cleanup traps so temporary files are safely removed on normal exit and interruption. ]]>

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
SKILL.md:204
Finding

Broad Access to Persistent Agent Profile and Memory Data

Content
View full analysis
Remediation
View remediation

T06 · System Persistence

Warning
Location
scripts/install.sh:20
Finding

Persistent Daily Processing Through HEARTBEAT.md Modification

Content
View full analysis
> "$HEARTBEAT_FILE" << 'HEARTBEAT' # ============================================ # Voice Memo Sync Auto-Sync # ============================================ Task: Voice Memo Daily Sync - Time: 08:00 daily - Action: Sync and process new voice memos - Steps: 1. Scan Voice Memos directory for new .qta/.m4a files 2. Extract Apple native transcripts 3. Process with LLM (summarize, extract key points) 4. Sync to Apple Notes "Voice Memos" folder 5. Create Reminders for TODOs 6. Update INDEX.md - Config: config/voice-memo-sync.yaml - Output: memory/voice-memos/ Checklist: [ ] New voice memos since last sync? [ ] Process each new recording [ ] Update INDEX.md with results HEARTBEAT } ``` ```bash if [ "$WITH_HEARTBEAT" = true ]; then echo "⏰ Configuring heartbeat auto-sync..." add_heartbeat_task elif [ -t 0 ]; then echo "⏰ Enable daily auto-sync via heartbeat?" echo " New voice memos will be automatically synced at 08:00 daily." read -p " Enable? [y/N] " -n 1 -r echo "" if [[ $REPLY =~ ^[Yy]$ ]]; then add_heartbeat_task fi fi ``` ### Technical Analysis The installer can append persistent instructions to the workspace's `HEARTBEAT.md`. Those instructions request daily scanning and processing of private recordings, LLM analysis, Apple Notes synchronization, Reminder creation, and index modification. The behavior is opt-in through `--with-heartbeat` or an interactive prompt, so it is not covert installation. Nevertheless, it i ...[truncated 1138 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/process.sh:76
Finding

Unverified Model Download and Unpinned Third-Party Dependencies

Content
View full analysis
/dev/null fi ``` ```yaml - id: whisper-cpp kind: brew formula: whisper-cpp bins: ["whisper-cli"] - id: whisper kind: brew formula: openai-whisper bins: ["whisper"] - id: yt-dlp kind: brew formula: yt-dlp bins: ["yt-dlp"] ``` The documentation additionally recommends third-party tap dependencies without pinned versions: ```bash brew install steipete/tap/remindctl brew install steipete/tap/summarize ``` ### Technical Analysis The Whisper model is downloaded from the mutable `main` branch and stored under a trusted cache filename without checksum or signature verification. The effective artifact can therefore change after the Skill has been reviewed. The Homebrew formulas and third-party tap tools are also not version-pinned. Although no malicious dependency was identified during the audit, this design weakens reproducibility and expands exposure to upstream compromise, account takeover, repository mutation, or a compromised package release. The downloaded model is data rather than directly executed code. However, it is parsed by a native transcription executable, so a maliciously modified model could exploit parser vulnerabilities or alter transcription behavior. ### Attack Path 1. The expected Whisper model does not exist in the local cache. 2. The Skill downloads the current artifact referenced by the upstream `main` branch. 3. No digest, signature, size, or immutable revision is checked. 4. A compromised or unexpectedly changed artifact is accepted as trusted. 5. `whisper-c ...[truncated 824 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (40)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description focuses on media ingestion and processing: syncing voice memos, transcribing audio/video, and intelligently organizing recordings and URLs. The actual code chunk instead automates Apple Notes by creating a folder and note in the user's iCloud Notes account with provided HTML content. This is a materially different primary behavior from the declared purpose, and the code does not itself handle transcription, sync, or audio/video/URL analysis. While note creation could be a downstream organizational step in a larger workflow, this chunk introduces an undeclared capability—direct Apple Notes/iCloud automation—and lacks the core declared behaviors.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description promises a broader workflow: sync, transcribe, and intelligently organize voice memos, audio/video files, and URLs. The code only reads a local file, parses QuickTime/Apple Voice Memos metadata, finds embedded JSON transcript data, and prints extracted text or JSON with optional timestamps. It has no network access or synchronization behavior, no speech-to-text transcription, no organization features, and no URL ingestion. This is a material description-behavior mismatch, with the implementation being much narrower and different in primary purpose.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
87% confidence
Finding

The code chunk only implements transcription orchestration/monitoring for an existing local audio file using Whisper. It does not sync content from any source, does not process URLs, and does not perform any meaningful organization beyond saving the transcript to a dated filename in a transcripts directory. While transcription is consistent with part of the description, the declared purpose substantially overstates the implemented capabilities in this code chunk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README emphasizes automatic syncing back to Apple Notes and Reminders but does not prominently warn that the skill can create or modify user data in those apps. This can lead to unexpected writes of potentially sensitive transcript content or unwanted reminder creation, especially when processing recordings from multiple devices via iCloud.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
84% confidence
Finding

The skill explicitly stores processed content, transcripts, and sync records in a persistent local memory directory and also syncs outputs into Apple Notes/Reminders. Persistent storage of transcribed voice content and extracted action items can expose sensitive personal or meeting data beyond the original recording lifecycle, increasing confidentiality and privacy risk.

Content

Scanner excerpt · README.md (reported line 23)May include surrounding context.

md
- 🎬 **YouTube/Bilibili Support** — Download and transcribe video content
- 📄 **Multi-format Input** — Support .m4a, .mp3, .mp4, .txt, .md, .doc, .docx, .json, .csv
- 🧠 **Smart Summarization** — LLM-powered analysis with personalized insights
- 📝 **Apple Notes Sync** — Auto-create structured notes with #tags
- ⏰ **Reminders Integration** — Extract TODOs and create reminders automatically
- 🔒 **Privacy First** — All processing happens locally by default

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The README says 'Just tell your OpenClaw agent' and gives triggers like 'Sync my voice memos' and 'Transcribe and summarize this audio' without defining boundaries, exclusions, or a constrained invocation context. These phrases are generic enough that they could match ordinary user requests and cause unintended activation of the skill.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill description emphasizes convenience and Apple ecosystem syncing, but does not prominently warn early on that it may automatically write derived content into Apple Notes, create Reminders tasks, and persist transcripts under local memory storage. Because voice memos and meeting recordings often contain sensitive personal or business information, insufficient disclosure increases the risk of unintentional data propagation and retention.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger phrases are broad and natural-language based, such as syncing voice memos or processing a recording/video, without clearly stating scope limits, confirmation requirements, or what side effects will occur. In an agent context, this can cause unintended execution on sensitive files or URLs and trigger transcription, note creation, reminder creation, and local persistence without sufficiently specific user intent.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README states that no data is sent to external servers by default unless the user explicitly configures an external API, but the documented workflow includes fetching YouTube/Bilibili URLs using network tools such as yt-dlp and summarize. Even if transcription is local, retrieving remote media necessarily causes external network transmission, which can mislead users about privacy and data exposure.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill clearly instructs use of shell commands, file reads, installers, and local automation, but it declares no explicit tool scope or permissions. That creates an authorization ambiguity where an agent may execute broad filesystem and shell operations without the user being clearly warned about the capability boundary.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill accepts URLs and may fetch remote content with yt-dlp or summarize, but the description does not clearly warn about network access or downloads. Users may assume passive processing when the skill can actually contact external services and pull in third-party content.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The privacy claims say processing is local by default, but the pipeline also prioritizes summarize for YouTube URLs and mentions API fallback, which may send data or retrieve remote content. This contradiction can mislead users into sharing sensitive media or transcripts under a false assumption of local-only handling.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The documented workflow makes Apple Notes creation mandatory and also creates Reminders tasks, which are side effects beyond the stated sync/transcription role. Mandatory cross-application writes can expose processed content on other devices/accounts and cause actions the user did not specifically authorize for each run.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill instructs the agent to read broad personal context files such as USER.md, SOUL.md, and MEMORY.md to enrich outputs, even though that is not necessary for basic transcription or sync. This expands data access beyond least privilege and can pull unrelated sensitive personal information into processing and generated notes.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill description does not clearly warn that personal profile and memory files will be read and used in analysis. Missing disclosure undermines informed consent and increases the chance that unrelated sensitive information is incorporated into outputs visible in Notes or other synced locations.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The instructions encourage the agent to blend transcript content with USER.md, SOUL.md, and MEMORY.md to produce personalized notes and analysis. This creates a natural-language data leakage path where sensitive personal details can be copied, inferred, or exposed in generated artifacts such as Apple Notes, indexes, transcripts, or reminders.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The deep-processing workflow explicitly tells the agent to combine transcript material with user context files during summarization and reflection. In this skill context, that is especially risky because the results are then persisted to local memory stores and synced into Apple Notes, increasing the blast radius of any leaked personal context.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The example Whisper command hard-codes --language zh, which imposes a specific language setting. The file does not explain that this skill is intentionally Chinese-only or offer language selection, so it appears to violate the language/locale choice policy.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The architecture explicitly states that transcript content will be analyzed in the context of USER.md and MEMORY.md, which can contain sensitive personal data, but it does not document any user-facing notice, consent step, or minimization control. Even if processing is local-first, combining private recordings with long-lived personal context increases privacy exposure and can leak more information than the user expects if a non-local model or logs are later introduced.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown example presents the generated note content exclusively in Chinese, including headings, summary, recommendations, and transcript. Because the file demonstrates the skill's output format without indicating that language is user-selectable or region-specific, it suggests a forced locale behavior that may violate language-choice policy.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The file's title, usage instructions, privacy notice, and all user-facing text are presented only in Chinese. This imposes a specific language on users without opt-in or justification, which matches the language/locale policy violation criteria.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The manifest says the skill syncs, transcribes, and organizes voice memos and related inputs, but does not mention syncing content into Apple Notes. Writing processed content into a Notes folder is a distinct application integration that materially expands the behavior users would expect from the description alone.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The manifest scope is limited to voice memo sync, transcription, and organization. The generated default config explicitly enables creating Reminders items, which is a separate task-management capability not described in the skill description and goes beyond an obvious implementation detail of organizing memos.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The installer executes AppleScript to modify the user’s Notes account by creating an iCloud folder as a side effect of installation. Even if aligned with the feature set, changing user cloud-backed application state during install without explicit opt-in is risky because it performs an external action beyond local file setup and may surprise users or violate least-privilege expectations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script modifies Apple Notes and can append tasks to HEARTBEAT.md, but these side effects are not prominently disclosed before execution begins. Silent or weakly disclosed state changes reduce informed consent and make it easier for users to install software that alters cloud data or automation behavior they did not expect.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.