T05 · Unauthorized Access and Privilege Escalation
- Location
driftwatch.py:33- Finding
Tracked Workspace Content Is Disclosed to an External LLM by Default
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill does the advertised drift audit, but it can send sensitive workspace diffs to Claude by default and writes reports despite claiming it is read-only.
Review this carefully before installing. Use `--no-llm` for local-only scans, avoid cron mode unless you are comfortable sending identity and memory diff snippets to Claude, and treat the generated approval/confidence labels as advisory rather than proof of human review.
driftwatch.py:33Tracked Workspace Content Is Disclosed to an External LLM by Default
driftwatch.py:152Untrusted Git Content Can Inject Instructions into the LLM Security Analysis
driftwatch.py:222Commit-Message Prefixes Can Falsely Mark Unauthorized Changes as Human-Approved
SKILL.md:48Read-Only Documentation Conflicts with Report File Creation
The manifest describes a read-only local audit tool, but the documented behavior indicates external LLM invocation, report-file writes, and monitoring of files beyond the declared set. This mismatch is dangerous because operators may approve or run the skill under false assumptions, leading to unintended data exfiltration of diffs/history and unexpected filesystem modification.
Claiming the skill is read-only while also stating that it writes a markdown report to disk is a direct integrity and transparency violation. Even if the write is only a report, this can mislead users, bypass stricter review for mutating skills, and create opportunities for sensitive history-derived content to be persisted unexpectedly.
The skill is described as local git-history monitoring, but its default path submits diff snippets to an external Claude CLI for semantic analysis. That is a material capability expansion involving possible data exfiltration and third-party processing, which users are not clearly warned about.
The skill advertises itself as read-only and safe to run anytime, but it writes markdown reports and optional JSON files to disk. This mismatch can mislead operators and automated systems into granting the tool broader trust than warranted, especially in environments where write operations are restricted or monitored.
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
LLM flags for:
- Softening of constraints ("must" → "should", removing "ask first" rules)
- Autonomy expansion language ("can now", "without asking", "on my own")
- Removal of deferential/safety language
- Changes with no corresponding commit message explaining why
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
LLM flags for:
- Softening of constraints ("must" → "should", removing "ask first" rules)
- Autonomy expansion language ("can now", "without asking", "on my own")
- Removal of deferential/safety language
- Changes with no corresponding commit message explaining why
The skill advertises itself without any explicit tool-scope declaration even though its documented behavior implies shell execution and file access. In a skill ecosystem, missing permission boundaries increases the chance that an agent invokes the skill with broader capabilities than users expect, weakening reviewability and containment.
Internal documentation contradictions about whether the skill modifies files create operator confusion and undermine safe deployment decisions. In security-sensitive agent tooling, ambiguity itself is risky because users may grant trust or automate execution based on the safer-sounding statement while the skill still performs writes.
The module docstring frames the tool as a git-history tracker while omitting that semantic analysis is performed through Claude by default. This mischaracterization weakens informed consent and can cause users to run the tool under false assumptions about locality, privacy, and trust boundaries.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def git(cmd: list[str], cwd: Path = WORKSPACE) -> str:
"""Run a git command and return stdout."""
result = subprocess.run(
["git"] + cmd,
cwd=cwd,
capture_output=True,
This call sends repository diff content to an external Claude CLI by default, which can disclose sensitive identity, memory, or policy file contents outside the local workspace. The danger is increased because the skill is presented as a read-only local audit tool, so users may not expect external transmission of tracked content.
]"""
try:
result = subprocess.run(
["claude", "--print", "--model", "claude-haiku-4-5", prompt],
capture_output=True,
text=True,
Invoking an external LLM subprocess introduces networked or third-party processing capability beyond a straightforward git audit, increasing the trust boundary and data exposure surface. In the context of identity and memory files, that can expose sensitive operational instructions or internal state not necessary for basic monitoring.
Tracked file diffs are forwarded to an external LLM CLI without an explicit warning or consent step, which creates a clear confidentiality risk. Since the files include identity and memory artifacts, the transmitted content may contain sensitive prompts, policies, or operational details that should remain local.
Allowing arbitrary paths via --files expands the tool beyond the declared identity-file scope and can be used to inspect unrelated workspace files. Because the default behavior may then forward diff snippets to an external LLM, this scope expansion can become an unintended data-exposure channel.
This markdown file documents that DriftWatch writes output to drift-report-YYYY-MM-DD.md, which is a file-system modification. The README does not explicitly warn users that running the tool will create or overwrite report files, so the behavior may affect user data or workspace state without clear disclosure.
The report output forces a specific timezone/locale marker in natural-language output regardless of user preference or system locale. This can violate language/locale policy when the skill imposes a locale-specific format without opt-in or justification.