Back to skill

Security audit

value-pricing

Security checks for vulnerabilities and agentic risk

Overview

This pricing skill needs review because its self-test can erase existing files and its crawler can reach unintended network destinations.

Before running, require safeguards against deleting existing self-test destinations and restrict crawler access to approved public sites. Use trusted study files and remove personal or confidential fields before Claude batches. Approve batch costs and any real survey outreach separately, and check pricing recommendations before applying them.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/crawl_site.py
Finding

Website-controlled redirects bypass the crawler's host boundary

Content
View full analysis

Impact

An attacker can cause unsolicited requests to local or private-network services. A successful HTML response can be converted and saved into the study corpus under the original public URL. This does not establish credential theft or transmission of the response back to the attacker.

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/selftest.py
Finding

Self-test deletes an existing destination without confirming ownership

Content
View full analysis

Impact

Permanent loss of files and subdirectories accessible to the process. The deletion precedes the test and is not contingent on successful test execution.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (47)

eval() call detected

High
Category
Dangerous Code Execution
Confidence
99% confidence
Finding

Configuration expressions are evaluated as Python while exposing the full NumPy module and unrestricted attribute access. Removing most builtins does not sandbox eval: NumPy APIs and Python object traversal can enable filesystem access or arbitrary code execution if an attacker influences an expression, so the comment asserting owner trust is not an enforceable security boundary.

Content

Scanner excerpt · scripts/common.py (reported line 80)May include surrounding context.

python
"""Evaluate a config expression over numpy arrays. The config files are the owner's own, not untrusted input."""
    if isinstance(expr, (int, float)):
        return expr
    return eval(str(expr), {"np": np, "__builtins__": {"min": min, "max": max, "abs": abs}}, ns)


def git_sha(root: Path) -> str | None:

Env Variable Harvesting

High
Category
Data Exfiltration
Confidence
70% confidence
Finding

Code enumerates, copies, or searches environment variables for secrets. Bulk environment access can collect credentials unrelated to the skill's stated purpose.

Content

Scanner excerpt · scripts/llm_batch.py (reported line 42)May include surrounding context.

python
def call_cli(prompt, system, model):
    env = {k: v for k, v in os.environ.items() if k not in ("ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN")}
    p = subprocess.run(["claude", "-p", "--model", model, "--output-format", "json", "--tools", "", "--system-prompt", system,
                        "--no-session-persistence", "--setting-sources", "", "--strict-mcp-config"],
                       input=prompt, capture_output=True, text=True, timeout=900, env=env, cwd="/tmp")

The self-test recursively deletes an existing --dir directory without disclosing that destructive behavior.

High
Category
Output Handling
Confidence
100% confidence
Finding

build() recursively deletes any existing directory supplied through --dir, without checking that it belongs to the self-test or requesting confirmation. A mistaken path or agent-generated invocation can therefore erase an existing study or other valuable directory, despite the documentation describing only construction of synthetic test data.

Content

No source excerpt is available for this finding.

Skill declares no tool scope ('permissions' or 'allowed-tools') but code capabilities were detected: env, file_read, file_write, network, shell.

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

The panel workflow lacks a privacy warning for business-derived persona and valuation data sent to Claude.

Medium
Category
Output Handling
Confidence
86% confidence
Finding

The workflow sends persona attributes and business-derived valuation cues to an external model without a data-classification, redaction, or disclosure-approval step. These inputs can contain confidential commercial information or identifiable customer details; disabling tools in the respondent process does not protect the data transmitted in its prompt.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/5-panel.md (reported line 55)May include surrounding context.

md
- The prompt shows the persona what the value model flagged for its scenario this month. That is the EVC
  cue, deliberate, and a declared threat: it invites pricing against value.
- Sample: 4 segments × 4 cells × ≥30 = 480 floor; 60 personas per segment (960 calls) target.
- Run long batches detached (`setsid nohup … &`) so a closed session or tool timeout doesn't kill them;
  re-running resumes.

## 4. Analyse

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/lessons.md (reported line 93)May include surrounding context.

md
## Running it

- **Keep the study on persistent disk.** A machine or VM restart clears `/tmp` and kills running jobs.
- **Run long jobs detached** (`setsid nohup … &`) and make them resumable; plan session limits interrupt
  long panels, and a resumable runner reruns only what's missing.

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/5-panel.md (reported line 55)May include surrounding context.

md
- The prompt shows the persona what the value model flagged for its scenario this month. That is the EVC
  cue, deliberate, and a declared threat: it invites pricing against value.
- Sample: 4 segments × 4 cells × ≥30 = 480 floor; 60 personas per segment (960 calls) target.
- Run long batches detached (`setsid nohup … &`) so a closed session or tool timeout doesn't kill them;
  re-running resumes.

## 4. Analyse

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · references/lessons.md (reported line 93)May include surrounding context.

md
## Running it

- **Keep the study on persistent disk.** A machine or VM restart clears `/tmp` and kills running jobs.
- **Run long jobs detached** (`setsid nohup … &`) and make them resumable; plan session limits interrupt
  long panels, and a resumable runner reruns only what's missing.

The instruction to run a roughly 2,000-invite survey pilot lacks an outreach and contact-data warning.

Medium
Category
Output Handling
Confidence
88% confidence
Finding

This workflow step directs a pilot wave using contacts drawn from CRM, lead, or newsletter records, rather than merely describing an available survey tool. It does not warn that sending invitations contacts real people and may repurpose personal data beyond its original consent scope.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/common.py (reported line 85)May include surrounding context.

python
def git_sha(root: Path) -> str | None:
    try:
        return subprocess.run(["git", "-C", str(root), "rev-parse", "HEAD"], capture_output=True, text=True, check=True).stdout.strip()
    except Exception:
        return None

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

The crawler's promise to honor robots.txt and delay every host request does not cover requests made through redirects or browser navigation.

Medium
Category
Excessive Agency
Confidence
97% confidence
Finding

Robots and delay checks apply to the initial URL, but requests follows redirects automatically and browser rendering can make additional requests to unchecked destinations. A competitor-controlled page can therefore bypass the advertised crawl boundary and generate unapproved traffic, potentially reaching internal services when the execution environment permits it.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/ingest_corpus.py (reported line 38)May include surrounding context.

python
if p.suffix.lower() == ".pdf":
        if not shutil.which("pdftotext"):
            return ""
        return subprocess.run(["pdftotext", "-layout", str(p), "-"], capture_output=True, text=True).stdout
    raw = p.read_text(errors="replace")
    if p.suffix.lower() in (".html", ".htm"):
        soup = BeautifulSoup(raw, "lxml")

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/llm_batch.py (reported line 19)May include surrounding context.

python
--free-text keeps replies that are not JSON (response = null, raw kept): the calibration needs this.

  llm_batch.py --study S --dir panel --workers 6 [--limit 20] [--expect choices,vw,gg] [--runner cli]
Run long batches detached (setsid nohup ... &): a closed session or a tool timeout then can't kill them.
"""
from __future__ import annotations

Session Persistence

Medium
Category
Rogue Agent
Confidence
65% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

Scanner excerpt · scripts/llm_batch.py (reported line 19)May include surrounding context.

python
--free-text keeps replies that are not JSON (response = null, raw kept): the calibration needs this.

  llm_batch.py --study S --dir panel --workers 6 [--limit 20] [--expect choices,vw,gg] [--runner cli]
Run long batches detached (setsid nohup ... &): a closed session or a tool timeout then can't kill them.
"""
from __future__ import annotations

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/llm_batch.py (reported line 43)May include surrounding context.

python
def call_cli(prompt, system, model):
    env = {k: v for k, v in os.environ.items() if k not in ("ANTHROPIC_API_KEY", "ANTHROPIC_AUTH_TOKEN")}
    p = subprocess.run(["claude", "-p", "--model", model, "--output-format", "json", "--tools", "", "--system-prompt", system,
                        "--no-session-persistence", "--setting-sources", "", "--strict-mcp-config"],
                       input=prompt, capture_output=True, text=True, timeout=900, env=env, cwd="/tmp")
    try:

Insecure deserialization: numpy.load(allow_pickle=True)

Medium
Category
Dangerous Code Execution
Confidence
99% confidence
Finding

Enabling pickle allows a malicious object array in posteriors.npz to execute arbitrary Python code when an affected member is accessed. Although this is normally an internally generated study artifact, an imported or replaced archive crosses a dangerous trust boundary and can compromise files and credentials available to the process.

Content

Scanner excerpt · scripts/optimize_packages.py (reported line 36)May include surrounding context.

python
class PanelDemand:
    def __init__(self, st: Study, draws: int):
        z = np.load(st.root / "panel/data/posteriors.npz", allow_pickle=True)
        b, self.cols, self.scale = z["b"], list(z["cols"]), float(z["scale"])
        self.b = b[np.linspace(0, len(b) - 1, min(draws, len(b))).astype(int)]
        self.P = len(self.cols)

subprocess module call

Medium
Category
Dangerous Code Execution
Confidence
70% confidence
Finding

subprocess module calls execute external commands. Without careful input validation, this enables command injection.

Content

Scanner excerpt · scripts/selftest.py (reported line 37)May include surrounding context.

python
def run(T, script, *args):
    p = subprocess.run([sys.executable, str(HERE / script), "--study", str(T), *args], capture_output=True, text=True, cwd=HERE)
    if p.returncode:
        raise SystemExit(f"{script} failed:\n{p.stdout[-2000:]}\n{p.stderr[-3000:]}")
    return p.stdout

The recommended pricing window can exceed the documented EVC ceiling by substituting a higher panel estimate.

Medium
Category
Excessive Agency
Confidence
99% confidence
Finding

The implementation uses the maximum of the EVC ceiling and panel p75 before calculating window_hi, so a higher panel estimate can relax the documented EVC ceiling. In a pricing skill this is a consequential output-integrity defect: inflated or manipulated panel estimates can produce recommendations above the declared value-based limit.

Content

No source excerpt is available for this finding.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding

Suspicious Unicode normalization or mixed-script content

Content

No source excerpt is available for this finding.

The standalone trigger "packaging" can activate the pricing skill for unrelated requests.

Low
Category
Trigger Abuse
Confidence
90% confidence
Finding

Although the description concerns product pricing, it explicitly lists "packaging" as a trigger without requiring that pricing context. The term also commonly refers to physical packaging or software packaging, creating avoidable invocation collisions.

Content

No source excerpt is available for this finding.