Back to skill

Security audit

Dev Chronicle

Security checks for vulnerabilities and agentic risk

Overview

DevChronicle has a coherent work-summary purpose, but it automatically scans sensitive local memory and session records and ships a script with an unsafe configurable path handling flaw.

Review this skill before installing. It is not covertly malicious, but it can pull private developer history into agent context, including full memory notes and session metadata. Use it only with a reviewed config, disable or avoid auto-detected memory/session sources unless you explicitly want them included, and treat the bundled gather.sh script as needing a fix before use in shared or untrusted environments.

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

T09 · Insecure Skill Coding Practices

Error
Location
scripts/gather.sh:114
Finding

Python Code Injection Through Configurable Session Directory

Content
View full analysis
/dev/null || echo "") ``` The resulting configuration value is subsequently inserted directly into another Python program: ```bash if [ -n "$SESSIONS_DIR" ] && [ -d "$SESSIONS_DIR" ]; then echo "## SESSIONS" echo "" python3 -c " import os, json, glob, sys sdir = '$SESSIONS_DIR' start, end = '$START_DATE', '$DATE' found = 0 for f in sorted(glob.glob(os.path.join(sdir, '*.jsonl'))): if f.endswith('.lock'): continue try: with open(f) as fh: d = json.loads(fh.readline()) ts = d.get('timestamp','')[:10] if ts >= start and ts <= end: lines = sum(1 for _ in open(f)) sid = os.path.basename(f).replace('.jsonl','') print(f'- {sid[:12]}... | {ts} | {lines} lines') found += 1 except: pass if not found: print('(no sessions found for this period)') " 2>/dev/null || echo "(python3 not available — skipping sessions)" fi ``` ### Technical Analysis The `sessionsDir` property originates in the editable `config.json` file. Although the value is initially parsed as JSON, the shell script later interpolates it into a single-quoted Python string inside a `python3 -c` command: ```python sdir = '$SESSIONS_DIR' ``` JSON parsing does not make a value safe for insertion into Python source code. A value containing a single quote, Python statement separators, and a comment marker can terminate the intended string and append arbitrary Python statements. Execution is subject to the preceding `[ -d "$SESSIONS_DIR" ]` check. Therefore, exploitation requires the attacker to supply a crafted configuration value ...[truncated 1641 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/gather.sh:60
Finding

Automatic Collection of Sensitive Agent Memory and Session Records

Content
View full analysis
= start and ts <= end: lines = sum(1 for _ in open(f)) sid = os.path.basename(f).replace('.jsonl','') print(f'- {sid[:12]}... | {ts} | {lines} li ...[truncated 2732 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (10)

Ssd 3

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script auto-detects AI workspace memory directories and concatenates dated markdown memory files directly into output. Those files may contain sensitive user content, secrets, internal notes, or prior conversation artifacts, so dumping them in plain text creates a direct confidentiality risk, especially because the skill is designed to generate summaries from broad local history rather than from narrowly selected inputs.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README advertises very broad trigger phrases such as "What did I do today?", "Standup notes", and "recap"-style requests, which are common in normal conversation and can cause the skill to activate unintentionally. Because this skill reads sensitive sources like git history, memory, and session transcripts, accidental invocation can expose or summarize private development activity the user did not intend to process in that moment.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding

The skill instructs the agent to read configuration, a voice profile, gathered output, memory files, and session transcripts, but the manifest declares no explicit tool scope or permissions. That creates an authorization/expectation gap: a host may invoke the skill without clearly constraining what files it can access, increasing the chance of over-broad repository and transcript reads.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The manifest description includes broad trigger phrases like 'recap', 'standup', and 'what did I do today/this week', which can cause the skill to fire in contexts where the user did not intend repository/session scanning. Because the skill reads sensitive local artifacts, accidental invocation materially increases privacy risk.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
72% confidence
Finding

The skill establishes persistent configuration in {baseDir}/config.json containing directories to scan, including memory and session locations. Persisting these paths can silently broaden future access and normalize repeated scanning of sensitive locations if the user does not understand or review what was saved.

Content

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

Setup

On first use, check for {baseDir}/config.json. If it doesn't exist, create it by asking the user:

json
{

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill directs collection from git history, memory files, and OpenClaw session transcripts, but it does not require an up-front user warning or consent flow describing that potentially sensitive local history and conversation data will be scanned. These sources can contain secrets, proprietary code paths, personal notes, and transcript content far beyond what the user expects for a simple summary request.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The script auto-detects session directories and enumerates session JSONL files across a date range, exposing conversation timestamps, identifiers, and line counts. Even without full transcript contents, this metadata can reveal usage patterns, project activity, and existence of sensitive sessions; in some environments, such metadata itself is confidential.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script reads local memory files and session metadata from default AI workspace directories and prints them directly to stdout without any consent prompt, warning, or scoping control. In an agent skill context, this can unintentionally expose sensitive notes, prompts, project details, or behavioral metadata to downstream tools, logs, or users who did not explicitly request that data source.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The example rule hardcodes a Spanish sentence fragment as the model for acceptable wording, which implies a language choice without asking the user for their preferred language or locale. Because the skill otherwise does not offer language selection, this can conflict with language/locale policy expectations.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The template's language guidance sets 'Primary: English' as a default requirement, which can be interpreted as forcing a specific language choice. Because this is a reusable template rather than a clearly region-specific tool, the language constraint is not explicitly justified or presented as an opt-in.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.