Back to skill

Security audit

Proactive Ops Monitor

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent workspace operations monitor, but it can surface recent agent-memory content and persist alert/config files in the workspace.

Install this only in workspaces where it is acceptable for an ops tool to read recent agent memory and show selected draft, decision, or correction content in dashboards or suggestions. Treat alert_config as a persistent settings change, and review or remove workspace alert/config files if they contain operational details you do not want retained.

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
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

other

Warning
Location
scripts/run.py:86
Finding
Agent Memory Contents Exposed Through Suggestion Output<![CDATA[ ## Vulnerability Details **File Location**: `scripts/run.py:86-99` **Vulnerability Type**: Sensitive Agent Memory Access **Risk Level**: Medium ### Vulnerable Code ```python # Check open loops in WAL (category=draft, decision, correction) if WAL_FILE.exists(): open_loops = [] with open(WAL_FILE) as f: for line in f.readlines()[-100:]: try: entry = json.loads(line) if entry["category"] in ("draft", "decision", "correction"): open_loops.append(entry["content"]) except: continue for i, loop in enumerate(open_loops[:limit]): suggestions.append({"type": "open_loop", "content": loop, "priority": "high"}) ``` ### Technical Analysis The `suggest_next` operation reads up to 100 recent records from the Agent's persistent `memory/wal.jsonl` file. For records categorized as `draft`, `decision`, or `correction`, the implementation copies the raw `content` field directly into its tool output. Agent memory can contain private conversation context, operational decisions, personal information, credentials accidentally entered by users, internal instructions, or other sensitive data. The implementation does not apply authorization checks, user confirmation, secret detection, redaction, output filtering, or record-level access controls before disclosing this content. Although the Skill manifest labels `suggest_next` as `read_only`, that permission describes whether the operation modifies state; it does not adequately communicate or restrict access to sensitive memory. The output may subsequently be retained in model context, conversation transcripts, dashboards, or downstream logs. ### Attack Path 1. A caller gains the ability to invoke the Skill's documented `suggest_next` tool. 2. The caller supplies a `limit` or relies on the default limit. 3. The tool opens the workspace's `memory/wal.js ...[truncated 1271 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Require explicit user consent before inspecting or returning persistent Agent memory. 2. Restrict this operation to a dedicated, structured open-loop store that contains only data intentionally marked for suggestion generation. 3. Avoid returning raw WAL `content`; return opaque record identifiers or minimal, generated summaries instead. 4. Apply secret and personal-data redaction before placing memory-derived information in tool output. 5. Add record-level sensitivity labels and exclude private, credential-bearing, or system-only records. 6. Enforce caller authorization separately from the generic `read_only` permission designation. 7. Bound and validate `limit` to a small non-negative integer and define an explicit maximum. 8. Provide an opt-out configuration that disables WAL inspection by default. 9. Document that the tool reads persistent Agent memory and may expose selected content to transcripts or logs. 10. Add tests confirming that secrets, private records, and unauthorized memory categories are never returned. ]]>
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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 (5)

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill behavior clearly includes reading and writing workspace files such as `memory/wal.jsonl`, `notes/areas/open-loops.md`, `memory/ops-alerts.jsonl`, and `proactive-ops-config.json`, but it does not declare an overall tool/file-access scope beyond per-tool entries. That mismatch weakens least-privilege review and can cause users or hosting platforms to underestimate the skill’s access to sensitive workspace state and its ability to persist data.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The skill is presented as a monitoring/dashboard utility, but the `alert_config` action allows persistent modification of `proactive-ops-config.json`. In an agent environment, that expands the tool from read-only observability into state-changing behavior, which can be abused to disable alerts, alter thresholds, or suppress operational signals without clear user awareness.

Context-Inappropriate Capability

Medium
Confidence
87% confidence
Finding
Writing to a persistent configuration file is not clearly necessary for a skill whose stated purpose is operational monitoring. This mismatch increases risk because consumers may grant or invoke the skill expecting passive telemetry, while it can actually alter future behavior and reduce safety visibility by changing alert or suggestion settings.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
`CONFIG_FILE.write_text(...)` overwrites persistent configuration immediately, with no confirmation, backup, concurrency protection, or warning to the user. An unintended or malicious invocation could silently replace thresholds or settings, causing alert suppression, noisy misconfiguration, or operational blind spots that persist across runs.

Missing User Warnings

Low
Confidence
88% confidence
Finding
The skill advertises monitoring and alerting benefits, but the user-facing description does not prominently warn that alerting persists monitoring data into workspace files. This can expose conversation-derived operational metadata, open-loop/task details, and usage patterns in files that may later be read by other skills, users, or automation, increasing privacy and cross-skill data exposure risk.

Static analysis

No suspicious patterns detected.