Back to skill

Security audit

Obsidian Ontology Sync

Security checks for vulnerabilities and agentic risk

Overview

This skill appears intended for local Obsidian-to-ontology syncing, but it asks users to set up recurring background processing of sensitive personal and business notes with incomplete scoping and missing helper scripts.

Review this before installing. Use only with a vault you intend to have indexed into a local ontology, run the dry-run first, and avoid enabling cron until you have checked the exact source folders, output path, retention expectations, and how to disable the jobs. Be aware that bidirectional note updates are advertised but not actually present in the inspected files.

Vulnerability Patterns
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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)

T06 · System Persistence

Error
Location
SKILL.md:289
Finding
Recurring Cron Job Creates Cross-Session Persistence## Vulnerability Details **File Location**: `SKILL.md`, lines 289–297 **Vulnerability Type**: Scheduled task persistence **Risk Level**: High **Vulnerable Code:** ```bash # Add to OpenClaw cron python3 skills/obsidian-ontology-sync/scripts/setup-cron.py # Or manually via cron tool cron add \ --schedule "0 */3 * * *" \ --task "python3 skills/obsidian-ontology-sync/scripts/sync.py extract" \ --label "Obsidian → Ontology Sync" ``` ### Technical Analysis The Skill instructions direct the agent or user to register a recurring cron task that executes the extraction script every three hours. This scheduled task survives the original Skill run and continues executing across sessions, meeting the definition of system persistence. The referenced `setup-cron.py` file is not included in the audited project, so its behavior could not be verified. Nevertheless, the documented manual `cron add` command is independently actionable and explicitly establishes recurring execution. When invoked, `scripts/sync.py` recursively reads Markdown files from configured vault source directories. It extracts data such as names, email addresses, telephone numbers, organizations, projects, and source paths, then appends derived records to `graph.jsonl`. The scheduled process therefore causes repeated processing and duplication of potentially sensitive personal and business data without requiring confirmation for each run. No network communication, remote payload retrieval, subprocess execution from `sync.py`, privilege escalation, or data exfiltration was identified. The scheduled task runs with the permissions of the account under which it is registered. ### Attack Path 1. A user or agent loads the Skill and follows its automatic synchronization instructions. 2. The user runs the undocumented `setup-cron.py` command from another installation source, or executes the provided `cron add` command. 3. A recurring job is registered to run ...[truncated 1254 chars]
Remediation
## Remediation Suggestions 1. Make scheduled synchronization explicitly opt-in rather than presenting it as a routine installation step. 2. Require clear user confirmation immediately before creating each recurring job. 3. Display the exact command, schedule, executable path, data sources, output location, and execution identity before registration. 4. Include documented commands to list, disable, and permanently remove every scheduled job created by the Skill. 5. Use absolute, validated script and configuration paths so path replacement or working-directory manipulation cannot redirect execution. 6. Run the task under a dedicated least-privileged account with access limited to the required vault directories and ontology output. 7. Add file locking, deduplication, and retention controls to prevent unbounded append-only storage growth. 8. Document which personal and business fields are extracted, how long derived data is retained, and where it is stored. 9. Do not instruct users to execute `setup-cron.py` unless that file is included and available for security review. 10. Prefer an on-demand synchronization command where persistence is not essential.
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
92% confidence
Finding
The skill advertises bidirectional sync and broader graph-maintenance behavior, but the documented implementation mainly performs one-way extraction plus local writes, with future writeback only mentioned as a future capability. This mismatch is dangerous because users may approve or schedule the skill under incorrect assumptions about what it can do, what it writes, and what safeguards exist around local data access.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The README advertises bidirectional sync between Obsidian notes and an ontology graph but does not warn that this can modify user notes, graph data, or both. Because synchronization is inherently state-changing and the skill metadata says it runs on a schedule via cron, missing warnings and safeguards make accidental overwrites, propagation of bad extraction results, and silent data corruption more likely.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The README presents broad invocation-style actions such as syncing notes, updating the ontology graph, and checking note structure without any activation constraints, scope limits, or confirmation requirements. In a skill that performs bidirectional synchronization, vague triggers can cause the agent to run state-changing operations too eagerly, increasing the risk of unintended data processing or modification.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill clearly describes reading from an Obsidian vault and writing ontology and feedback files, yet it declares no explicit tool scope or permissions. This creates a trust and review gap: operators cannot easily constrain or audit filesystem access, and an agent may be granted broader file capabilities than users expect.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill is designed to automatically extract and schedule ongoing processing of sensitive personal and team-management data, including emails, phone numbers, response patterns, blockers, and business relationships, but it provides no prominent privacy warning or data-handling constraints. In this context, silent background collection and aggregation materially increase the risk of over-collection, unintended retention, and misuse of employee/contact data.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The script extracts personal contact data such as names, emails, phones, companies, and project associations from markdown notes and persists them into a machine-queryable ontology file. In a PKM context this may be expected functionality, but there is no explicit consent, warning, data minimization, or access-control check before materializing sensitive personal data into a new persistent store, which increases privacy and secondary-use risk.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The feedback feature writes derived summaries about missing emails and organizational relationships into new markdown files inside the vault, creating an additional disclosure surface for sensitive and inferred personal information. Even though the content is generated for usability, materializing relationship insights into broadly readable notes can expose data to other tools, sync services, or users with vault access.

Natural-Language Policy Violations

Low
Confidence
82% confidence
Finding
The README content is written entirely in Chinese and does not indicate that users may choose another language or locale. Under the language/locale policy, forcing a specific language without opt-in can be a natural-language policy concern unless the regional constraint is explicitly justified.

Static analysis

No suspicious patterns detected.