Back to skill

Security audit

Redline Annotate

Security checks for vulnerabilities and agentic risk

Overview

This skill has a coherent annotation purpose, but it installs a persistent global prompt hook and runs an unauthenticated local server that can write broadly under the user's home directory.

Install only if you are comfortable with a global Claude prompt hook and a localhost service that can modify files as your user. Prefer running it in a disposable workspace, stopping the server after use, and reviewing ~/.claude/settings.json and any .redline-inbox.json contents before allowing the agent to apply changes.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
Findings (5)

T09 · Insecure Skill Coding Practices

Error
Location
server.py:29
Finding
Unauthenticated Cross-Origin Arbitrary File Write<![CDATA[ ## Vulnerability Details **File Location**: `server.py:29-37, 40-44, 54-57, 73-98` **Vulnerability Type**: Unauthenticated arbitrary file write with permissive CORS **Risk Level**: Critical ### Vulnerable Code ```python def is_path_allowed(p: Path) -> bool: """只允许写到用户家目录或 /tmp 下,避免任意路径写入。""" try: p = p.resolve() except Exception: return False home = Path.home().resolve() tmp = Path("/tmp").resolve() return any(str(p).startswith(str(root) + os.sep) for root in (home, tmp)) class Handler(http.server.BaseHTTPRequestHandler): def _cors(self): self.send_header("Access-Control-Allow-Origin", "*") self.send_header("Access-Control-Allow-Methods", "POST, GET, OPTIONS") self.send_header("Access-Control-Allow-Headers", "Content-Type") def do_POST(self): if self.path != "/feedback": return self._json(404, {"ok": False, "error": "not found"}) try: length = int(self.headers.get("Content-Length", 0)) raw = self.rfile.read(length).decode("utf-8") body = json.loads(raw) except Exception as e: return self._json(400, {"ok": False, "error": f"invalid json: {e}"}) inbox = body.get("inbox") payload = body.get("payload") if not inbox or not isinstance(payload, dict): return self._json( 400, {"ok": False, "error": "missing inbox or payload"} ) inbox_path = Path(inbox) if not is_path_allowed(inbox_path): return self._json( 403, {"ok": False, "error": f"path not allowed: {inbox_path}"} ) try: inbox_path.parent.mkdir(parents=True, exist_ok=True) inbox_path.write_text( json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8", ) except Exception as e: return self._json(500, {"ok": False, "error ...[truncated 2025 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Generate a cryptographically random, per-session bearer token and reject requests that do not present it. 2. Register one canonical inbox path when starting the server; do not accept a destination path from the HTTP request. 3. Require the destination basename to be exactly `.redline-inbox.json` and bind it to the active project directory. 4. Remove wildcard CORS. Prefer no CORS headers, or allow only an explicitly controlled origin. 5. Apply a strict request-size limit before reading the request body. 6. Validate payloads against a strict schema, including types, annotation count, and field-length limits. 7. Reject symlinks and use atomic file creation with restrictive permissions. 8. Stop the service after submission or after a short inactivity timeout. ]]>

T01 · Skill Instruction Hijacking

Error
Location
hook.sh:23
Finding
Untrusted Annotation Data Is Injected into Privileged Agent Instructions<![CDATA[ ## Vulnerability Details **File Location**: `hook.sh:23-53` **Vulnerability Type**: Agent prompt injection through an untrusted inbox **Risk Level**: High ### Vulnerable Code ```bash PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$PWD}" INBOX="$PROJECT_DIR/.redline-inbox.json" [[ -f "$INBOX" ]] || exit 0 INBOX="$INBOX" python3 <<'PYEOF' import json, os, sys inbox_path = os.environ["INBOX"] with open(inbox_path, "r", encoding="utf-8") as f: inbox_content = f.read() context = f"""[redline hook] 检测到挂起的标注反馈: ```json {inbox_content} ``` 请按 redline skill 的"阶段 2:应用"流程处理这些标注: 1. 读 feedback-template.md 的渲染规则 2. 用 Edit 工具修改 inbox 里 `file` 字段对应的源文件(不要碰 .annotated.html) 3. apply 完成后,**必须**用 Bash 跑 `rm {inbox_path}`,否则下一次 prompt 会重复触发 4. 简明汇报每条标注的处理结果(✓ 已改 / ✗ 未匹配 / ⚠ 冲突已合并) 如果用户当前消息和反馈完全无关,先问"检测到 N 条挂起反馈,先处理还是继续当前话题?",由用户决定。 """ output = { "hookSpecificOutput": { "hookEventName": "UserPromptSubmit", "additionalContext": context, } } print(json.dumps(output, ensure_ascii=False)) PYEOF ``` ### Technical Analysis The hook reads the inbox as raw text and embeds it verbatim into `additionalContext`. Fields such as `file`, `comment`, `selector`, and `elementHTML` are therefore attacker-controlled text inside a privileged agent context. Placing the data inside a Markdown JSON fence does not create a security boundary for a language model. A malicious comment or other field can contain instructions asking the agent to disregard the intended annotation workflow, inspect unrelated files, reveal information, execute commands, or make unrelated modifications. The risk is amplified by the server vulnerability: an arbitrary website can write a crafted `.redline-inbox.json` into a targeted project. The Skill documentation then explicitly tells the agent to interpret comments as modification requests, edit the file named in the payload, and run a deletion command. The payload's `file` field is not independently constrained to the originally annota ...[truncated 1388 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Treat every inbox field as untrusted data rather than executable instructions. 2. Validate the inbox against a strict schema before emitting any context. 3. Bind each inbox to a registered project and canonical source file generated by the injector. 4. Reject absolute paths, traversal components, unexpected extensions, and files outside the project root. 5. Require explicit user confirmation before applying pending annotations. 6. Present annotation values as quoted data and explicitly instruct the agent never to follow commands contained inside those values. 7. Use deterministic application logic where possible instead of relying on the model to interpret unrestricted comments. 8. Delete or archive the inbox in trusted hook/server code rather than instructing the model to issue `rm`. 9. Authenticate inbox submissions using a per-session token and include a signed or unpredictable session identifier. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
injector.sh:90
Finding
Python Code Injection Through Interpolated Paths and Environment Variables<![CDATA[ ## Vulnerability Details **File Location**: `injector.sh:90-128` **Vulnerability Type**: Code injection into `python3 -c` **Risk Level**: High ### Vulnerable Code ```bash INPUT_ABS="$(cd "$(dirname "$INPUT")" && pwd)/$(basename "$INPUT")" INPUT_DIR="$(dirname "$INPUT_ABS")" INPUT_BASE="$(basename "$INPUT_ABS")" if [[ "$INPUT_BASE" == *.annotated.html ]]; then OUTPUT="$INPUT_ABS" ORIGINAL_NAME="${INPUT_BASE%.annotated.html}.html" elif [[ "$INPUT_BASE" == *.html ]]; then OUTPUT="$INPUT_DIR/${INPUT_BASE%.html}.annotated.html" ORIGINAL_NAME="$INPUT_BASE" else OUTPUT="$INPUT_DIR/${INPUT_BASE}.annotated.html" ORIGINAL_NAME="$INPUT_BASE" fi INBOX_PATH="${RL_INBOX:-$PWD/.redline-inbox.json}" CONFIG_JSON=$(python3 -c " import json, sys print(json.dumps({ 'port': int('$RL_PORT'), 'inbox': '$INBOX_PATH', 'file': '$ORIGINAL_NAME', }, ensure_ascii=False)) ") ``` ### Technical Analysis `RL_PORT`, `INBOX_PATH`, and `ORIGINAL_NAME` are inserted directly into Python source code enclosed in single-quoted Python string literals. Shell quoting does not escape these values for the Python grammar because interpolation occurs before Python parses the script. A filename or environment value containing a single quote followed by valid Python syntax can terminate the intended literal and inject additional expressions or statements. The resulting code runs under `python3` with the privileges of the user invoking `injector.sh`. This is not merely malformed JSON generation: the attacker-controlled value is incorporated into executable source code. ### Attack Path 1. An attacker supplies an HTML file with a specially crafted filename, or influences `RL_INBOX`, `RL_PORT`, or the current directory name. 2. The user runs `injector.sh` against that file. 3. The script derives `ORIGINAL_NAME` or `INBOX_PATH` from the attacker-influenced value. 4. The value is interpolated into the `python3 -c` program. 5. Python parses attacker-controlled characters ...[truncated 549 chars]
Remediation
<![CDATA[ ## Remediation Suggestions Pass all data to Python through positional arguments or environment variables instead of interpolating it into source code. For example: ```bash RL_PORT_VALUE="$RL_PORT" \ INBOX_PATH_VALUE="$INBOX_PATH" \ ORIGINAL_NAME_VALUE="$ORIGINAL_NAME" \ python3 <<'PY' import json import os port = int(os.environ["RL_PORT_VALUE"]) if not 1 <= port <= 65535: raise ValueError("Port is outside the valid range") print(json.dumps({ "port": port, "inbox": os.environ["INBOX_PATH_VALUE"], "file": os.environ["ORIGINAL_NAME_VALUE"], }, ensure_ascii=False)) PY ``` Additionally: 1. Validate `RL_PORT` as a decimal integer in the range 1–65535. 2. Canonicalize and validate the inbox path against the active project. 3. Add regression tests using filenames and directory names containing quotes, backslashes, newlines, and shell metacharacters. ]]>

T03 · Remote Payload Retrieval and Execution

Warning
Location
inject.js:53
Finding
Remote Third-Party JavaScript Is Retrieved and Executed Without Integrity Verification<![CDATA[ ## Vulnerability Details **File Location**: `inject.js:53-68` **Vulnerability Type**: Runtime remote payload retrieval and execution **Risk Level**: Medium ### Vulnerable Code ```javascript function loadFinder() { return new Promise((resolve) => { if (window.finder) { state.finder = window.finder; return resolve(); } const s = document.createElement('script'); s.src = 'https://unpkg.com/@medv/finder@3.1.0/finder.js'; s.setAttribute(UI_ATTR, '1'); s.onload = () => { state.finder = window.finder || null; resolve(); }; s.onerror = () => resolve(); document.head.appendChild(s); }); } ``` ### Technical Analysis Every annotated page can dynamically download JavaScript from a third-party CDN and execute it in the page context. Although the URL includes a package version, the response is not protected with Subresource Integrity, an independently verified hash, or a bundled audited copy. Consequently, the effective code executed by the Skill can differ from the code present during static review. A compromise of the package, CDN, account, or delivery path could cause arbitrary JavaScript to execute when an annotated page is opened. The remote script shares the annotated page's execution context. It can inspect DOM content, alter annotation behavior, access page-origin storage, and send requests to the Redline localhost service. ### Attack Path 1. The user generates and opens an annotated HTML page. 2. The injected Redline code creates a script element pointing to unpkg. 3. The browser retrieves the remote dependency. 4. If the dependency or CDN response has been compromised, malicious JavaScript is returned. 5. The browser executes that JavaScript in the annotated page context. 6. The script can inspect page data, manipulate annotations, make network requests, or interact with the local Redline endpoint. ### Impact Assessment A successful supply-chain compromise provides JavaScript execu ...[truncated 372 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Vendor a reviewed copy of the selector library inside the Skill package. 2. Verify the vendored file using a pinned cryptographic checksum during release preparation. 3. If remote loading is unavoidable, use an immutable artifact URL and an independently verified Subresource Integrity hash with an appropriate `crossorigin` setting. 4. Apply a restrictive Content Security Policy that prevents unapproved script and network destinations. 5. Document the dependency, exact version, source, and update process. 6. Prefer the existing local fallback selector implementation if the external dependency is not essential. ]]>

T06 · System Persistence

Warning
Location
install.sh:47
Finding
Global Prompt Hook and Long-Lived Local Service Create Cross-Session Persistence<![CDATA[ ## Vulnerability Details **File Location**: `install.sh:47-95`; `injector.sh:52-82` **Vulnerability Type**: Persistent global hook and detached local service **Risk Level**: Medium ### Vulnerable Code ```bash HOOK_CMD="$HOOK_CMD" SETTINGS="$SETTINGS" python3 <<'PYEOF' import json, os, sys from pathlib import Path settings_path = Path(os.environ["SETTINGS"]) hook_cmd = os.environ["HOOK_CMD"] if settings_path.exists(): with open(settings_path, "r", encoding="utf-8") as f: cfg = json.load(f) else: settings_path.parent.mkdir(parents=True, exist_ok=True) cfg = {} hooks = cfg.setdefault("hooks", {}) ups_list = hooks.setdefault("UserPromptSubmit", []) if not already: found_updated = any( h.get("command", "") == hook_cmd for entry in ups_list for h in entry.get("hooks", []) ) if not found_updated: ups_list.append({ "hooks": [{"type": "command", "command": hook_cmd}] }) with open(settings_path, "w", encoding="utf-8") as f: json.dump(cfg, f, indent=2, ensure_ascii=False) f.write("\n") PYEOF ``` ```bash if server_alive; then echo "✓ server 已在运行 (pid=$(cat "$PIDFILE"), port=$RL_PORT)" else rm -f "$PIDFILE" nohup python3 "$SERVER_PY" "$RL_PORT" > "$LOGFILE" 2>&1 & SERVER_PID=$! echo "$SERVER_PID" > "$PIDFILE" fi ``` ### Technical Analysis Installation modifies the user's global Claude settings by registering a `UserPromptSubmit` command hook. The hook therefore executes for later prompts and sessions rather than only for the project that requested annotation. The injector also starts the HTTP server with `nohup`, allowing it to survive the invoking shell and remain available after the annotation task. There is no automatic timeout or shutdown after feedback submission. These persistence mechanisms are documented and an uninstaller is provided, so they are not covert. Nevertheless, their system-wide and long-lived scope is broader than required for ann ...[truncated 1315 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Prefer project-scoped configuration instead of modifying global Claude settings. 2. Obtain explicit confirmation before installing any persistent hook. 3. Use a short-lived, per-annotation server process with a cryptographic session token. 4. Terminate the server after successful submission or a short inactivity timeout. 5. Record and verify the exact hook entry created by the installer rather than matching broad path suffixes. 6. Pin or verify the hook script's integrity before execution. 7. Clearly display whether the service is running and provide a direct stop command. 8. Remove runtime files, logs, and stale server state during uninstall where appropriate. 9. Consider replacing the global hook with an explicit feedback-import command initiated by the user. ]]>
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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (52)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The stated purpose is page annotation, but the skill also installs persistent hooks, edits agent configuration, writes under ~/.claude, removes components, and terminates processes. This mismatch can prevent users and reviewers from understanding the full security impact, especially because hook installation creates durable behavior beyond a single annotation session.

Ae1

High
Category
analysis-evasion
Content
- 把 `inject.css` / `inject.js` / `__RL_CONFIG__` 注入到 `</body>` 前
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
- 把 `inject.css` / `inject.js` / `__RL_CONFIG__` 注入到 `</body>` 前
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Agent Config Directory Access

High
Category
Agent Snooping
Content
`install.sh` 会自动完成:
1. 创建 `~/.claude/skills/redline` 软链接
2. 向 `~/.claude/settings.json` 添加 UserPromptSubmit hook
3. 设置脚本可执行权限

首次使用时 server 自动启动,无需手动运行。
Confidence
94% confidence
Finding
Modifying ~/.claude/settings.json grants the skill influence over agent-global configuration and future prompt processing through hook registration. This is security-sensitive because a compromised or flawed skill can persist behavior across sessions, intercept future prompts, or create hard-to-notice changes outside the current project.

Agent Config Directory Access

High
Category
Agent Snooping
Content
## 调试

- 看 server 日志:`tail -f ~/.claude/redline/server.log`
- 手动起 server:`python3 server.py 7893`
- 手动测 hook:`CLAUDE_PROJECT_DIR=/path/to/project ./hook.sh`(需先在该目录放一份 inbox)
- 杀 server:`kill $(cat ~/.claude/redline/server.pid)`
Confidence
88% confidence
Finding
The skill explicitly accesses files under ~/.claude, an agent configuration area that may contain sensitive logs, state, or operational metadata. Access to this directory is dangerous because it crosses from project-local annotation into agent-global data, increasing the chance of data exposure or unintended interference with agent behavior.

Agent Config Directory Access

High
Category
Agent Snooping
Content
- 看 server 日志:`tail -f ~/.claude/redline/server.log`
- 手动起 server:`python3 server.py 7893`
- 手动测 hook:`CLAUDE_PROJECT_DIR=/path/to/project ./hook.sh`(需先在该目录放一份 inbox)
- 杀 server:`kill $(cat ~/.claude/redline/server.pid)`
Confidence
91% confidence
Finding
Reading a PID file from ~/.claude/redline/server.pid and using it to kill a process introduces control over processes via agent-global state. If the PID file is stale, replaced, or manipulated, the wrong process could be terminated, causing denial of service or interference with unrelated tooling.

Agent Config Directory Access

High
Category
Agent Snooping
Content
#!/usr/bin/env bash
# UserPromptSubmit hook for redline
#
# 配置进 ~/.claude/settings.json 后,每次用户发送 prompt 前会先跑这个脚本。
# 检查 cwd 下是否有 .redline-inbox.json:
#   有 → 把内容作为 additionalContext 注入到 prompt(连带 apply 指令)
#   无 → 静默退出,不影响正常对话
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.

Missing User Warnings

High
Confidence
96% confidence
Finding
The code transmits page-derived annotation data, including snippets of DOM content, to a local HTTP service and falls back to copying the full payload to the clipboard. Both paths can expose sensitive page content without an upfront warning, and the clipboard fallback broadens exposure to any application the user pastes into afterward.

Agent Config Directory Access

High
Category
Agent Snooping
Content
SKILLS_HOME="$HOME/.claude/skills"
LINK_PATH="$SKILLS_HOME/redline"
SETTINGS="$HOME/.claude/settings.json"
HOOK_CMD="$SKILL_DIR/hook.sh"

echo "redline skill 安装"
Confidence
91% confidence
Finding
The script targets the agent configuration directory and writes to ~/.claude/settings.json, which is a sensitive control point because it can alter how the agent behaves on later runs. In this skill's context, that access is more dangerous because it is used to install a prompt-submission hook, effectively creating persistent behavior that can observe or transform future user interactions.

Hidden Instructions

High
Category
Prompt Injection
Content
<footer>
    © 2026 AcmeAI Inc.
  </footer>
<!-- redline: injected -->
<style data-rl-ui="1">
/* ============================================================
   redline injected styles
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<footer>
    © 2026 AcmeAI Inc.
  </footer>
<!-- redline: injected -->
<style data-rl-ui="1">
/* ============================================================
   redline injected styles
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<html><body><h1>Hi</h1><div>x</div>
<!-- web-annotate: injected -->
<style data-wa-ui="1">
/* ============================================================
   web-annotate injected styles
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<html><body><h1>Hi</h1><div>x</div>
<!-- web-annotate: injected -->
<style data-wa-ui="1">
/* ============================================================
   web-annotate injected styles
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<html><body><h1>Hi</h1><div>x</div>
<!-- web-annotate: injected -->
<style data-wa-ui="1">
/* ============================================================
   web-annotate injected styles
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
<html><body><h1>Hi</h1><div>x</div>
<!-- web-annotate: injected -->
<style data-wa-ui="1">
/* ============================================================
   web-annotate injected styles
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Context-Inappropriate Capability

High
Confidence
99% confidence
Finding
The code appends a <script> element whose src points to a third-party CDN, then executes whatever JavaScript is returned in the page context. Because this skill operates on generated HTML pages, the remote code gains access to page DOM, localStorage, clipboard-triggering flows, and any sensitive rendered content, making compromise of the dependency materially dangerous.

Agent Config Directory Access

High
Category
Agent Snooping
Content
set -euo pipefail

LINK_PATH="$HOME/.claude/skills/redline"
SETTINGS="$HOME/.claude/settings.json"
RL_HOME="$HOME/.claude/redline"
PIDFILE="$RL_HOME/server.pid"
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.

Lp3

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding
The skill declares no explicit tool scope while its documented behavior requires shell execution, local networking, file reads/writes, and environment access. That increases the attack surface and makes it easier for the skill to invoke sensitive capabilities without clear user-visible boundaries or policy enforcement.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The trigger conditions include broad natural-language phrases such as generic requests to annotate a webpage, which can cause the skill to activate unintentionally. Because activation can lead to code execution, file modification, browser launch, and server startup, overbroad triggering raises the risk of unexpected side effects.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
整个技能说明和触发短语均以中文固定表达,未说明是否支持其他语言,也未给出用户可选择语言的机制。按规则,强制特定语言而没有用户选择或明确合理的地区限定,属于自然语言策略问题。

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The installation flow modifies ~/.claude/settings.json and registers a UserPromptSubmit hook, but the skill text does not prominently warn about the persistence and security implications of changing global agent configuration. Hook installation can affect future prompts and projects, so understated disclosure materially increases risk.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The template explicitly instructs the agent to delete an inbox file after applying changes, but provides no user-facing notice, confirmation, or safety checks on the path. In an agentic workflow, destructive file operations tied to injected context can remove data unexpectedly or be abused if the inbox path is malformed or manipulated.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The 'must execute' rm command makes deletion mandatory and unconditional, which is risky because the path comes from hook-injected context rather than being hardcoded and validated in this file. If the context is wrong, attacker-influenced, or unexpectedly broad, the model could delete an unintended file without warning.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The hook reads a local project file and injects its full contents into the model prompt as additional context before every user submission, with no explicit user-facing disclosure or per-use consent. That creates a prompt-context exfiltration channel from the filesystem into the model and can cause unintended processing of stale, sensitive, or adversarially crafted local data.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The injected context instructs the agent that it must run a shell command to delete a local file after applying changes, but this destructive action is only conveyed through hidden prompt augmentation rather than a visible user workflow. That means a local file operation can be induced automatically by ambient context, reducing transparency and creating risk of unintended deletion behavior if the inbox path or surrounding workflow is manipulated.

Static analysis

No suspicious patterns detected.