Back to skill

Security audit

JD - Triage

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent job-description triage helper, but it needs review because it persists sensitive career data and can modify its own reference material with learned phrases.

Before installing, assume this skill will keep a local career profile and append a record for every evaluated role. Avoid enabling full history in synced or shared workspaces, because raw postings can include recruiter contacts or private compensation details. Treat any prompt to append new language phrases into the skill's reference files as risky unless the value is reviewed and stored as plain data only.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • 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
  • 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)

T02 · Agent Memory Poisoning

Warning
Location
references/intensity-signals.md:91
Finding
Runtime Input Can Poison a Persistent Skill Instruction File## Vulnerability Details **File Location**: `references/intensity-signals.md:91-92` **Vulnerability Type**: Persistent instruction-file poisoning **Risk Level**: Medium ### Vulnerable Code Snippet ```markdown If the user confirms or corrects your reading, offer to append the phrase to this file's table for their language so the next posting matches directly. ``` ### Technical Analysis The skill directs the agent to append user-provided phrases to `references/intensity-signals.md`. This file is not merely user data: `SKILL.md` designates it as a reference that is loaded during later evaluations, making its contents part of the agent's trusted behavioral context. No strict schema, escaping, multiline-input rejection, character filtering, or separation between data and instructions is specified. Consequently, a phrase containing Markdown headings, tables, or imperative instructions could be written into the reference file. When a later invocation loads the modified file, the injected content may be interpreted as trusted skill guidance rather than inert classification data. User confirmation reduces accidental exploitation but does not remove the trust-boundary violation. The user may approve an apparently legitimate language correction without recognizing embedded prompt-control content. ### Attack Path 1. An attacker supplies a job posting or suggested intensity phrase containing crafted multiline Markdown or agent instructions. 2. The skill classifies the phrase and offers to append it to the language table. 3. The user confirms the update, believing it to be an ordinary vocabulary correction. 4. The agent writes the attacker-controlled content into `references/intensity-signals.md`. 5. During a later job-posting evaluation, the skill loads that reference file as trusted guidance. 6. The injected content can influence classification logic or attempt to redirect the agent's future behavior. ### Impact Assessment ...[truncated 580 chars]
Remediation
## Remediation Suggestions - Never write runtime user input into skill instruction or reference documents. - Store learned phrases in a separate data-only file, such as a strictly validated JSON or YAML vocabulary file. - Define an allowlisted schema containing only fields such as `language`, `tier`, and `phrase`. - Reject multiline values, control characters, Markdown structural syntax, and instruction-like content. - Apply explicit length limits and normalize Unicode before validation. - Serialize values with a standard library rather than constructing Markdown through string concatenation. - Require the user to review the exact normalized value, target language, and tier before saving it. - Treat loaded vocabulary entries exclusively as quoted data and explicitly instruct the agent never to execute or follow instructions found inside those values. - Prefer storing runtime data under the user's workspace rather than modifying the installed skill package. - Consider integrity-checking immutable skill reference files so unexpected modifications are detected before loading.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (9)

Memory Manipulation

High
Category
Memory Poisoning
Content
The file grows without bound by design — `analyze` gets better with more rows.
If it passes roughly 100 entries and the user asks, offer to archive entries
older than a year to `jd_history_<year>.md` rather than deleting them. Never
delete history unprompted.
Confidence
80% confidence
Finding
Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Anti-Refusal Statement

High
Category
Anti-Refusal
Content
**Unknown organizations.** If you have no reliable knowledge of an anchor, that
changes nothing: the `why` is the comparison basis, and it always was. Never
substitute a reputation for the user's stated reason — that is how the axis drifts
away from the person it is supposed to represent. Equally, never refuse to score
because an anchor is obscure.

### Comp fit — `comp_floor`, `profile.current_comp`
Confidence
85% confidence
Finding
Skill instructs the agent to never refuse or to always comply. Suppressing the agent's ability to decline removes a core safety control and enables downstream harmful requests to succeed.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The skill advertises very broad natural-language triggers such as "should I apply to this" and "what should I learn next," which can overlap with ordinary conversation and cause unintended activation. In a tool that stores and analyzes career criteria and job-history data, accidental invocation could lead to unsolicited processing of pasted content, unintended logging of sensitive recruiter or job details, or confusing actions when the user did not mean to invoke the skill.

Session Persistence

Medium
Category
Rogue Agent
Content
| **Derive from examples** | `/jd-triage learn`, or offered when a profile is thin | Paste a few JDs |
| **Full** | S5 (`update` / `reset`), or user asks | All fields |

Write to `~/.openclaw/workspace/jd_criteria.md` using `assets/criteria-template.yaml`.
Field keys English; values in the user's language.

## Using presets
Confidence
88% confidence
Finding
The skill persists a long-lived career profile to a predictable path under the user's home directory, creating session persistence beyond the current interaction. This can expose sensitive employment preferences, compensation floors, locations, and skills to other local processes or future runs without clear retention controls, and it increases the blast radius if the file is read, reused, or corrupted.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Migration

Triggered by S2 (`schema_version` < 3). Migrate everything inferable **without
asking**, then ask only for what cannot be derived. Show a summary of what
changed before writing.
Confidence
78% confidence
Finding
The migration flow directs the agent to transform existing profile data and derive new structured fields 'without asking' before user review. Even though it later says to show a summary, autonomous modification of decision-critical career criteria can introduce incorrect inferences that alter future recommendations, especially around compensation, location, and rejection logic.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The skill mandates automatic persistence of every evaluation to a local history file, including rejected roles and free-text excerpts from job descriptions, without requiring upfront consent for the baseline logging behavior. This creates a privacy and data-retention risk because users may not expect recruiter messages, compensation details, or sensitive career preferences to be stored indefinitely.

Intent-Code Divergence

Low
Confidence
96% confidence
Finding
The header says "jd_criteria.md" and claims the skill writes to "~/.openclaw/workspace/jd_criteria.md", but the file content is clearly YAML and the file itself is named "criteria-template.yaml". This is an active documentation contradiction about the persisted format/location rather than a mere omission.

Missing User Warnings

Low
Confidence
90% confidence
Finding
The skill instructs writing persistent data directly to a fixed workspace file in the user's home directory without explicitly requiring informed user confirmation at the point of write. While this is expected functionality for a profile-based skill, silent modification of local state can surprise users, create integrity issues, and make later evaluations depend on data the user did not realize was stored or changed.

Natural-Language Policy Violations

Low
Confidence
88% confidence
Finding
Lines L013-L015 say structural labels are "always English" so the file stays greppable. This imposes a fixed language choice in the skill behavior rather than offering user selection or opt-in, which matches the stated language/locale policy concern.

Static analysis

No suspicious patterns detected.