Back to skill

Security audit

Personal Understanding v2

Security checks for vulnerabilities and agentic risk

Overview

This local personal-memory skill is mostly transparent about what it does, but it stores very sensitive data broadly and has several high-impact behaviors that deserve review before installation.

Install only if you intentionally want an agent to keep a durable local archive of your exact personal messages and attachments. Review the MCP installer before using `--auto`, avoid configuring cloud backup unless the remote is end-to-end encrypted, and run the dashboard only when you are comfortable with a local service being able to display files from the archive folder.

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 (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/open_dashboard.py:301
Finding

Unauthenticated dashboard endpoint exposes sensitive files throughout the project root

Content
View full analysis
Path | None: candidate = (ROOT / relative).resolve() try: candidate.relative_to(ROOT.resolve()) except ValueError: return None return candidate if candidate.is_file() else None ``` ```python if parsed.path == "/api/file": relative = parse_qs(parsed.query).get("path", [""])[0] path = inside_root(relative) if not path: self.json({"error": "Path not allowed"}, 403); return try: content = path.read_text(encoding="utf-8") except UnicodeDecodeError: self.json({"path": relative, "binary": True, "content": "This is a binary file; view the original under sources/."}); return self.json({"path": relative, "binary": False, "content": content}); return ``` ```python server = ThreadingHTTPServer(("127.0.0.1", args.port), Handler) ``` ### Technical Analysis The dashboard binds only to the loopback interface, which prevents direct access from other hosts under normal network conditions. However, the HTTP service does not implement authentication, an unguessable per-launch access token, Origin validation, or Host-header validation. The `/api/file` endpoint accepts a caller-controlled relative path and allows access to any regular UTF-8 file whose resolved path remains under the project root. Its authorization boundary is therefore the entire repository rather than the limited set of files needed by the dashboard. This includes highly sensitive data such as: - Immutable personal-message captures under `sources/conversation/`; - Personal attachments and source material; - Derived records under `memory/`; - Backup configuration and state; - Scripts, tests, migration files, and other repo ...[truncated 2164 chars]
Remediation
View remediation
` and `[::1]:`. - Reject attacker-controlled hostnames even if they resolve to loopback. - This materially reduces DNS-rebinding exposure. 3. **Validate request origins** - Reject cross-origin requests. - Set a restrictive Content Security Policy. - Return `X-Content-Type-Options: nosniff`. - Avoid permissive CORS headers. 4. **Apply least-privilege file allowlisting** - Restrict `/api/file` to directories the dashboard genuinely needs, such as selected paths under `memory/` and `sources/`. - Deny configuration files, scripts, tests, backups, and arbitrary project files by default. - Consider exposing records through purpose-built API methods instead of a generic file-reading endpoint. 5. **Retain canonical-path checks** - Continue using `resolve()` and `relative_to()` to prevent traversal. - Explicitly reject symlinks if they are unnecessary, including symlinks that resolve elsewhere within the project but cross sensitivity boundaries. 6. **Limit service lifetime** - Shut down the server when the dashboard window closes or after an inactivity timeout. - Clearly display that a local file-reading service is active. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/backup_archive.py:51
Finding

Unencrypted personal archive snapshots may be transferred automatically to a configured cloud remote

Content
View full analysis
list[Path]: paths: list[Path] = [] for name in INCLUDE_DIRS: base = source_root / name if not base.is_dir(): continue paths.extend(path for path in base.rglob("*") if path.is_file() and "__pycache__" not in path.parts) for name in INCLUDE_FILES: path = source_root / name if path.is_file(): paths.append(path) return sorted(set(paths)) ``` The snapshot uses ordinary ZIP compression without application-level encryption: ```python def promote_stable(source_root: Path = ROOT, backups_dir: Path | None = None) -> dict: """Certify the current working archive as the new archived snapshot; the previous snapshot is kept for one generation (previous), capped at two files.""" backups = backups_dir or BACKUPS ok, gate = validation_gate() if not ok: return {"promoted": False, "reason": gate} paths = snapshot_paths(source_root) backups.mkdir(parents=True, exist_ok=True) target = backups / STABLE_ZIP previous = backups / PREVIOUS_ZIP if target.exists(): # Keep the previous snapshot for one generation: the copy that is always # one version behind the working archive shutil.copy2(target, previous) if (backups / STABLE_MANIFEST).e ...[truncated 6026 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (110)

Ssd 3

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

This skill intentionally creates a broad archive of verbatim personal messages, attachments, and derived sensitive inferences, which creates a natural-language data exposure surface far beyond what is needed for many interactions. Because the archive is designed for later retrieval and reuse, any retrieval mistake, prompt injection in surrounding context, UI leakage, or overbroad answer synthesis could disclose highly sensitive user data.

Content

No source excerpt is available for this finding.

Ssd 3

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The privacy section explicitly authorizes reading highly private archived content whenever the system deems it relevant, normalizing broad access to sensitive memory. In a memory skill, that is dangerous because relevance is model-judged and can be overbroad, leading to unnecessary disclosure of intimate stored details in responses.

Content

No source excerpt is available for this finding.

Anti-Refusal Statement

High
Category
Anti-Refusal
Confidence
80% confidence
Finding

Skill instructs the agent to omit warnings, disclaimers, or ethical commentary. Stripping safety caveats hides risk from the user and is a common jailbreak preamble.

Content

Scanner excerpt · SKILL.md (reported line 362)May include surrounding context.

md
Structural validation no longer just prints "pass". `scripts/validate_memory.py` has three outcomes:

- `clean`: no errors, no warnings;
- `warnings`: structurally usable, but there is summary debt, source gaps, date gaps, pending follow-ups, or entity connection issues;
- `failed`: hash errors, duplicate IDs, orphaned references, relation cycles, corrupt JSONL, or unacceptable schema errors.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 421)May include surrounding context.

md
- real file entries for `SKILL.md`, references, scripts, and memory/v2;

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · scripts/install_mcp.py (reported line 9)May include surrounding context.

python
python scripts/install_mcp.py --auto         # register/update every detected client
  python scripts/install_mcp.py --client zcode # handle only the given client

Supported: zcode (~/.zcode/cli/config.json), codex (~/.codex/config.toml),
claude-code (~/.claude.json), cursor (~/.cursor/mcp.json),
generic (~/.agents/mcp.json, a cross-tool compatibility slot).

Agent Config Directory Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.

Content

Scanner excerpt · scripts/install_mcp.py (reported line 262)May include surrounding context.

python
python scripts/install_mcp.py --auto         # register/update every detected client
  python scripts/install_mcp.py --client zcode # handle only the given client

Supported: zcode (~/.zcode/cli/config.json), codex (~/.codex/config.toml),
claude-code (~/.claude.json), cursor (~/.cursor/mcp.json),
generic (~/.agents/mcp.json, a cross-tool compatibility slot).

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The README instructs users to activate the skill on very broad, everyday personal phrases such as 'I've been feeling…' and 'remember that…' without defining narrow trigger boundaries or consent gates. In a memory-capture skill, this can cause over-collection of sensitive personal data, unexpected activation on ordinary conversation, and privacy-impacting persistence of information the user did not clearly intend to archive.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README explicitly says the skill will automatically trigger on personal content and capture users' verbatim messages for storage, but the activation point shown to users does not present a clear just-in-time privacy warning or consent step. Even though the data stays local, this still creates a privacy risk because users may disclose sensitive information without realizing that full transcripts will be persistently stored and indexed.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill mandates storing complete personal messages and attachments verbatim, but the file does not require a clear, user-facing consent and retention notice at the point of collection. In a skill specifically designed to archive intimate experiences and files, that omission materially increases privacy risk because users may disclose sensitive data without understanding persistence, future retrieval, or backup behavior.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The follow-up workflow requires preserving sensitive disclosures and later reusing them in prompts with contextual recall. That behavior increases the chance of re-exposing private facts in contexts where the user did not intend to revisit them, especially if the environment is shared or the follow-up topic is delicate.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill mandates saving complete user utterances, attachments, hashes, timestamps, and session identifiers as immutable records, but the user-facing description does not provide a clear privacy warning, retention policy, or consent checkpoint. For a personal-memory skill, this is especially risky because it centralizes highly sensitive autobiographical data and makes broad later retrieval a default behavior.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill requires comprehensive long-term archival of personal statements and attachments, then reuses them for retrieval and proactive follow-up. This creates a sensitive data aggregation system in which intimate details, relationships, emotional state, and historical materials become concentrated in one searchable archive, increasing harm from leakage, over-collection, or misuse.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The hard gate forces creation of receipts and immutable captures for any qualifying personal message before the system may respond, making persistent recording a prerequisite for assistance. That design removes meaningful user choice at the moment of disclosure and encourages collection of complete inputs even when a less invasive response could suffice.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill instructs the agent to auto-install and register a local MCP service across AI clients, expanding from memory management into host/client configuration. That broader capability increases attack surface because a skill handling adversarial natural language should not be able to silently modify client integrations or persist new tool access without a separate explicit trust boundary.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The skill explicitly permits reading highly private content whenever deemed relevant and combining it with archives, sources, and verbatim quotes in later answers. In a natural-language system, relevance decisions can be overbroad or mistaken, causing unnecessary disclosure of deeply sensitive data into responses or contexts where the user did not expect it.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
80% confidence
Finding

Automatic backup mirroring to a second location broadens data movement beyond the core purpose of local personal-memory storage. Because this archive contains raw utterances, attachments, hashes, and relationship data, silent replication increases the chance of unintended exposure, misconfigured destinations, or persistence in locations the user did not expect.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The dashboard fetches and displays file contents from /api/file in openSource and openFile, which can reveal potentially sensitive source text and skill files to the user. Although this is likely intended functionality, there is no visible warning, confirmation, or explanatory comment near these operations disclosing that clicking an item will retrieve and display raw file contents.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

This policy mandates capturing and storing the full user message whenever a broad range of personal or contextual information is shared. That creates systematic over-collection of potentially sensitive data, increases privacy and compliance risk, and can preserve secrets or regulated personal information that are not necessary for the task.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The file explicitly instructs the model to 'open directly, like someone who knows you well,' which encourages familiarity-assuming responses without clear user opt-in. This can cause the assistant to imply a closer relationship, shared history, or personal knowledge than the user actually granted, increasing the risk of manipulative framing, privacy overreach, and misplaced trust in sensitive conversations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The policy describes pushing archived snapshots to a WebDAV cloud drive on every backup run, but it does not include a clear warning or consent requirement about privacy implications, off-device transmission, retention, or third-party storage exposure. Because the content is a personal memory archive and explicitly described as non-regenerable, silent or weakly disclosed cloud upload behavior materially increases confidentiality and data-governance risk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The policy states that once a backup is overdue, the reminder always appears and the model executes it automatically. In a skill handling personal memory archives, broad automatic trigger language can cause the agent to initiate backup actions without a fresh, explicit user confirmation, increasing the risk of unintended data handling or transfer. The surrounding backup policy makes this more dangerous because the archive contains sensitive, non-regenerable personal data and backups may involve external cloud synchronization.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger list includes broad phrases like moral or emotional descriptors that can easily match benign conversation without reliably indicating the intended signal. This creates a security and safety issue because the agent may over-collect meaning from normal speech, misclassify the user, and steer the interaction based on inaccurate inferred traits or vulnerabilities.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This section contains highly generic triggers such as references to money, expenses, or responsibility transitions that commonly appear in ordinary conversation. In a proactive cueing system, overly broad triggers can cause unwarranted inference about a user's emotional or personal state, leading the agent to act on weak signals and potentially surface intrusive or manipulative follow-up behavior.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This trigger set includes everyday phrases such as privacy-related corrections or casual objections that may occur in many harmless contexts. If these cues automatically activate special handling, the system can misinterpret routine speech as a boundary or identity-resolution event, increasing the chance of incorrect profiling, unnecessary escalation, or privacy-invasive follow-up.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The document instructs the system to persist per-run retrieval traces including queries, time windows, selected/stopped IDs, and capture associations, while also stating that traces are not shown to the user by default. That creates a privacy and transparency risk because user-provided context and behavior-derived metadata may be retained in logs without clear user notice, consent, or minimization controls.

Content

No source excerpt is available for this finding.