Back to skill

Security audit

Workflow-Memory Guardian

Security checks for vulnerabilities and agentic risk

Overview

This skill is not clearly malicious, but it tries to govern every conversation and persist detailed work and profile memory, so it needs careful review before installation.

Install only if you intentionally want an always-on workflow and memory manager. Use it in an isolated project, avoid shared machines or sensitive conversations, inspect the memory files it creates, and be ready to disable or purge memory if the stored profile or task history is broader than you want.

Vulnerability Patterns
  • 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
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (3)

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:29
Finding
Mandatory Global Workflow Hijacks Agent Goals and User Interaction<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:29-49`, `SKILL.md:94-111`, `references/phase-2-clarification.md:1-39` **Vulnerability Type**: T01: Skill Instruction Hijacking **Risk Level**: Critical ### Evidence ```markdown **Execution rules:** 1. This protocol governs **EVERY user message** in **EVERY session** at **EVERY task level** — trivial or complex, one-step or hundred-step. 2. No phase may be **skipped, merged, reordered, or silently dropped**. 3. Saving tokens or time is **NEVER** a valid reason to bypass a phase or a checkpoint. 4. User pressure ("just do it", "quick", "don't ask", "simpel aja") **never cancels** a phase — it only compresses the phase's format. 5. If you notice you are about to respond without having executed the phases: **STOP, discard the draft, restart from Phase 1.** 6. A response delivered with a missing phase is a **protocol violation**, not a speed achievement. **Memory rules:** 7. **Memory files are the single source of truth** for anything that must survive a session boundary. Conversation history and auto-generated session summaries are lossy compressed views — treat them as hints, never as the record. 8. **NEVER** respond "saya tidak punya konteks / I don't remember" at a session start or continuation without first reading the memory files. 9. **Restore before respond** (M0 runs before any substantive answer); **checkpoint before risk** (M1 after every phase/task/decision and before long stretches); **compress under pressure** (M2 when context degrades); **handoff on every exit** (M3 on any session-end signal, including abrupt ones). 10. **The 95% standard:** the Memory Manifest (section 8) must survive every boundary. CRITICAL categories have zero-loss tolerance — one lost CRITICAL category breaches the standard regardless of the arithmetic. **Activation rules:** 11. **Description presence is NOT activation.** The description visible in the system prompt is a trigger label, not the protocol — the ru ...[truncated 3040 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Change activation from universal and automatic to explicit, user-requested, and task-scoped activation. 2. Remove language such as “EVERY user message,” “EVERY session,” “no exceptions,” and “discard the draft.” 3. State explicitly that system, developer, platform, safety, and current user instructions always take precedence. 4. Allow users to skip clarification or planning for sufficiently specified and low-risk tasks. 5. Treat phase markers as optional observability features rather than mandatory output. 6. Apply the workflow only to tasks for which structured planning materially improves the result. 7. Add a clear scope boundary, such as: “Use this workflow only when the user explicitly asks for workflow management.” 8. Ensure disabling the workflow takes effect immediately without requiring negotiation or persistence. ]]>

T02 · Agent Memory Poisoning

Error
Location
SKILL.md:169
Finding
Untrusted Session Content Can Be Promoted into Authoritative Persistent Memory<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:169-179`, `SKILL.md:190-224`, `references/lifecycle-protocol.md:16-24`, `references/lifecycle-protocol.md:90-96` **Vulnerability Type**: T02: Agent Memory Poisoning **Risk Level**: High ### Evidence ```markdown **Read order at restore:** `SESSION-STATE.md` → `MEMORY.md` → handoff file if SESSION-STATE references one → `worklog.md` tail only if gaps remain. **Missing files:** if `memory/` does not exist, initialize the structure from `worklog.md` + a confirmation with the user — never treat absence as "no history existed". If `worklog.md` is also absent (total cold start, e.g. a brand-new container), initialize an empty structure and treat it as session 1 — still confirm with the user. ### 3. Lifecycle M0–M3 (Condensed) / Daur Ulang M0–M3 (Ringkas) - **M0 — Cold Boot / Restore:** read SESSION-STATE + MEMORY (mandatory minimum) → run the Recall Check (section 8) → gap-fill with minimum reads (see 4b) from handoffs → worklog tail → actual files until ≥95% → cross-check any auto-summary (conflict: memory files win; summary-only facts: promote them) → emit marker → present restored context → confirm the restored plan with the user before executing new work. - **M1 — Checkpoint:** rewrite SESSION-STATE.md atomically (full snapshot, not append) whenever material state changes: task started/finished, decision locked, artifact delivered, blocker found, plan changed. Append worklog only for major milestones (with Task ID). Emit `[MEM | CHECKPOINT]` inline. - **M2 — Emergency Compression:** on pressure signals, write SESSION-STATE NOW — CRITICAL items first, then a handoff draft if severe. The ~5% loss budget is spent HERE and only here — drop narrative verbosity, never the manifest. - **M3 — Handoff:** write `handoffs/YYYY-MM-DD-<slug>.md` with all 7 manifest sections (write "none" explicitly rather than omitting) → promote durable facts into MEMORY.md → rewrite SESSION-STATE to final state → emit marker ...[truncated 2747 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Treat restored memory exclusively as untrusted data, never as executable instructions. 2. Define a strict schema that permits only non-behavioral task metadata, such as task identifiers, artifact paths, and factual status fields. 3. Prohibit storage of prompts, commands, policies, safety changes, tool-use rules, or behavioral directives under “preferences,” “decisions,” or “conventions.” 4. Require explicit, per-item user approval before promoting content into long-term memory. 5. Record provenance, author identity, creation time, scope, and expiration for every persisted item. 6. Validate and sanitize memory entries during both writing and restoration. 7. Do not automatically prefer memory over authenticated current-session instructions. 8. Add integrity protection and access control to persistent state. 9. Provide a review screen or diff before each M3 promotion. 10. Apply retention limits and make correction and deletion affect all derived copies, including handoffs and work logs where policy permits. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
references/integration.md:60
Finding
Hard-Coded Shared Memory Scope Can Expose or Misapply User and Workspace State<![CDATA[ ## Vulnerability Details **File Location**: `references/memory-architecture.md:9-16`, `references/integration.md:60-65` **Vulnerability Type**: T09: Insecure Skill Coding Practices **Risk Level**: Medium ### Evidence ```markdown /home/z/my-project/ ├── memory/ │ ├── MEMORY.md # long-term memory (durable facts, promoted via M3) │ ├── SESSION-STATE.md # working snapshot (atomic rewrite per checkpoint) │ └── handoffs/ │ └── YYYY-MM-DD-<slug>.md # immutable session archives (write once) ├── worklog.md # append-only multi-agent audit trail (platform convention) └── download/ # user-facing deliverables (platform convention) ``` The documented edge-case handling states: ```markdown | Case | Handling | |------|----------| | User references work that is in NO memory file | Search worklog.md and the filesystem (download/, scripts/, skills/) BEFORE claiming ignorance. If found: restore it and record the gap (why wasn't it checkpointed?). If truly not found: say so honestly, offer to reconstruct | | First-ever session (no memory exists) | M0 becomes an explicit "no prior memory" statement + initialize the memory/ skeleton. This is correct behavior, not a failure | | Session summary says X, memory files say Y | Memory files win for facts; investigate worklog to understand why they differ; promote anything the summary uniquely preserves | | User corrects restored context ("bukan gitu, yang kemarin itu…") | The user outranks the files: update memory immediately (M1), note the correction, apologize briefly — the files serve the user, not the reverse | | Continuation arrives while a task is mid-flight in SESSION-STATE | Present the restored state INCLUDING the in-flight status and the exact resume point; confirm before resuming | | Two users / shared machine ambiguity | Treat the profile in MEMORY.md as the profile of THE user you are talking to; update on clear signals | ``` ### Tec ...[truncated 2053 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the hard-coded global path with a platform-provided, project-local storage directory. 2. Namespace memory by authenticated user, tenant, project, and session. 3. Enforce filesystem permissions that prevent other users or projects from reading the state. 4. Never infer the current user’s identity from an existing memory profile. 5. Require explicit user approval before searching work logs or workspace directories for recovery. 6. Restrict recovery reads to an allowlist of paths associated with the active authenticated project. 7. Display the source and owner of restored information before applying it. 8. Add retention periods and automatic cleanup for profiles, session state, and handoffs. 9. Avoid storing unnecessary profile attributes; retain only information essential to the active task. 10. Detect identity or project mismatches and start with isolated empty state rather than reusing existing files. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (16)

Vague Triggers

High
Confidence
97% confidence
Finding
The activation condition is effectively universal: it instructs loading on the first turn of every session and on common continuation phrases like 'continue' and 'lanjut'. That lets the skill seize control across unrelated conversations and override normal task-specific skill selection, creating prompt-injection-style policy capture and unnecessary memory access on nearly every interaction.

Vague Triggers

High
Confidence
98% confidence
Finding
Claiming the protocol governs every user message with zero exceptions is overbroad and conflicts with least-privilege behavior for agent skills. In practice, it attempts to supersede system orchestration and forces this skill onto trivial, unrelated, or sensitive interactions, increasing the chance of denial-of-service to normal assistant behavior and unwanted persistence operations.

Natural-Language Policy Violations

Medium
Confidence
82% confidence
Finding
The marker format examples prescribe only Indonesian and English response marker forms, which can constrain language behavior for users in other locales. The document does not clearly offer a broader user language choice or opt-in for this locale limitation.

Whitespace Padding

Medium
Category
Prompt Injection
Content
### 6. Message-Type Handling / Penanganan Jenis Pesan

| Turn Type            | Required Path                                                                                          |
|----------------------|--------------------------------------------------------------------------------------------------------|
| Type 0 conversational| M0 (if session start) → Phase 1 (classify) → phases 2–4 explicitly `N/A — Type 0` → Phase 5 (concise friendly close). Keep it human: markers are one line each; the reply itself stays short. |
| New task             | M0 (if session start) → full 5 phases. First response usually ends at Phase 2 awaiting answers — that is the protocol working. |
Confidence
70% confidence
Finding
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.

Ssd 3

Medium
Confidence
97% confidence
Finding
These sections require persistent preservation of user profile, task history, decisions, artifacts, and trajectory across session boundaries as part of an integrity contract. That creates a clear data retention and leakage risk because sensitive conversational details are normalized for long-term storage and later reconstruction, potentially beyond what is necessary for task completion.

Ssd 4

Medium
Confidence
96% confidence
Finding
The document operationalizes an aggressive workflow in which cross-session preservation and reconstruction are mandatory prerequisites to continuing work. In the context of an agent skill, this makes the behavior more dangerous because it systematizes broad memory collection and rehydration as a default norm, increasing privacy, leakage, and unauthorized persistence risks at scale.

Ssd 3

Medium
Confidence
98% confidence
Finding
The recall procedure explicitly directs the agent to reconstruct detailed prior-session and user information from multiple sources, including handoff archives, worklogs, and files on disk, before any work resumes. This increases the chance of cross-session exposure, over-retention, and unintended resurfacing of sensitive information that the user may not expect to persist or be reassembled.

Natural-Language Policy Violations

Medium
Confidence
87% confidence
Finding
The file embeds operational triggers and marker content in both English and Indonesian, including Indonesian-only examples such as "lanjut" and "kerjakan yang kemarin." Because these phrases are part of the protocol behavior and there is no explicit opt-in or justification that the skill is intended for Indonesian-speaking users only, this can violate language/locale policy expectations.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The skill explicitly directs persistent storage of user language, register, timezone, and communication preferences as durable memory, but it does not require user knowledge, consent, minimization, or an opt-out. In the context of a mandatory always-on cross-session memory skill, this creates unnecessary profiling and retention of personal preference data across sessions, increasing privacy risk and the chance of over-collection.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The instruction to always detect and mirror the user's language removes user choice and can cause unintended disclosure, exclusion, or unsafe localization behavior in multilingual contexts. In a mandatory, every-turn workflow skill, this becomes more dangerous because it globally overrides normal interaction patterns and may force outputs into a language the user did not explicitly request for the deliverable.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
The file consistently frames instructions, templates, and examples in Indonesian/English and includes hardcoded Indonesian status markers such as '[FASE 2 | KLARIFIKASI]'. This can amount to a language/locale policy violation because the skill appears to force a specific language presentation rather than offering the user a choice or documenting a justified locale restriction.

Natural-Language Policy Violations

Low
Confidence
82% confidence
Finding
The heading immediately provides both English and Indonesian forms, and the document continues to embed Indonesian terms such as "lanjutkan" and "Penjelasan (ID)" without stating whether language selection is user-driven. This can conflict with a language/locale policy that requires explicit user choice rather than silently imposing or mixing locales.

Natural-Language Policy Violations

Low
Confidence
94% confidence
Finding
The document treats the user's language as a critical profile attribute that must be persistently preserved across sessions, but it does not state that this should be optional, user-provided, or minimally retained. While language preference can be operationally useful, mandating retention by default creates unnecessary profiling and persistence of personal context without clear consent boundaries.

Natural-Language Policy Violations

Low
Confidence
95% confidence
Finding
The recall checklist instructs the agent to reconstruct 'who is the user' including language, preferences, style, and timezone from memory files before resuming work. This encourages retention and re-use of user profile data as a default behavior rather than a user-controlled setting, which increases privacy risk and can lead to over-collection of contextual identifiers.

Natural-Language Policy Violations

Low
Confidence
89% confidence
Finding
This file presents operational guidance bilingually, but several required markers and examples are specifically in Indonesian (for example, 'RENCANA DIUBAH' and 'FASE 3 | RENCANA'). The policy requires avoiding forced language or locale constraints unless the user is given a choice or the regional constraint is explicitly justified.

Natural-Language Policy Violations

Low
Confidence
77% confidence
Finding
The document contains natural-language behavior rules about response language, including 'Match the user's language.' In context, the file is explicitly bilingual and repeatedly defaults to Indonesian examples and labels, which can be interpreted as imposing a locale/language behavior without explicit opt-in or a stated user choice mechanism beyond inference from the user's message.

Static analysis

No suspicious patterns detected.