Back to skill

Security audit

Web Profiler

Security checks for vulnerabilities and agentic risk

Overview

This skill looks like a web profiler, but the shipped script mostly records user-supplied text into local logs, which can mislead users and retain sensitive debugging data.

Review before installing. Use this only as a local logging helper, not as a real web profiler. Do not enter tokens, credentials, private URLs, authorization headers, database connection strings, or sensitive stack traces unless you are comfortable with them being retained in plaintext under ~/.local/share/web-profiler/.

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 (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/script.sh:5
Finding

Profiling Inputs Are Persisted in Plaintext Without Explicit Access Controls

Content
View full analysis

Vulnerability Details

File Location: scripts/script.sh, lines 5–8 and repeated command handlers at lines 128–303
Vulnerability Type: Plaintext storage of potentially sensitive information with permissions inherited from the environment
Risk Level: Medium

Vulnerable Code

bash
DATA_DIR="${HOME}/.local/share/web-profiler"
mkdir -p "$DATA_DIR"

_log() { echo "$(date '+%m-%d %H:%M') $1: $2" >> "$DATA_DIR/history.log"; }

Representative input-storage block:

bash
local input="$*"
local ts=$(date '+%Y-%m-%d %H:%M')
echo "$ts|$input" >> "$DATA_DIR/run.log"
local total=$(wc -l < "$DATA_DIR/run.log")
echo "  [Web Profiler] run: $input"
echo "  Saved. Total run entries: $total"
_log "run" "$input"

Equivalent plaintext writes are repeated for the check, convert, analyze, generate, preview, batch, compare, export, config, status, and report commands.

Technical Analysis

The script accepts arbitrary command-line input and appends it to command-specific log files under ~/.local/share/web-profiler/. It also duplicates the same input into history.log. The intended use cases include recording URLs, SQL statements, configuration details, dependency information, and request diagnostics, all of which may contain credentials or other sensitive data.

The script does not set a restrictive umask, explicitly create the data directory with mode 0700, or enforce mode 0600 on generated files. Consequently, effective permissions depend on the invoking user's umask and the permissions of any pre-existing directory or files. On a system with permissive settings, other local users or processes may be able to read the stored information.

The implementation also performs no secret detection or redaction before persisting input. Information such as authorization headers, API keys, session identifiers, passwords embedded in connection strings, or sensitive query parameters ma ...[truncated 1610 chars]

Remediation
View remediation

Remediation Suggestions

  1. Set a restrictive file-creation mask before creating or writing any data:

    bash
    umask 077
    
  2. Create and verify the data directory with owner-only permissions:

    bash
    install -d -m 0700 "$DATA_DIR"
    chmod 0700 "$DATA_DIR"
    
  3. Create log files with mode 0600 before appending data, and reject unsafe pre-existing file types such as symbolic links:

    bash
    log_file="$DATA_DIR/run.log"
    if [ -L "$log_file" ]; then
        echo "Refusing to write through a symbolic link" >&2
        exit 1
    fi
    : >> "$log_file"
    chmod 0600 "$log_file"
    
  4. Apply equivalent protection to history.log and every command-specific log file.

  5. Redact common sensitive values before storage, including authorization headers, passwords, cookies, API keys, access tokens, and sensitive URL query parameters.

  6. Clearly document that users must not supply credentials or secrets. Consider requiring explicit confirmation when input matches common credential patterns.

  7. Add configurable retention and secure deletion policies so diagnostic information is not retained indefinitely.

  8. Add automated tests that run under permissive umask settings and verify that the directory remains 0700 and generated files remain 0600.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (10)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The skill markets itself as a web request profiling and analysis tool for Symfony/web-profiler contexts, but the documented behavior is only local logging, search, export, and simple statistics over user-supplied strings. This kind of capability mismatch is dangerous because users may trust it to inspect real request execution or dependencies and make operational or security decisions based on fabricated coverage that never actually occurred.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script presents itself as a web request profiler but the help text and command structure describe a broad toolkit whose behavior does not match the stated purpose. In a skill ecosystem, this kind of deceptive or materially misleading functionality is dangerous because users may grant trust, supply sensitive inputs, or install the tool under false assumptions about what it does.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

Commands named run, check, analyze, compare, report, and similar imply substantive profiler operations, but they only append arbitrary user input to local log files. This mismatch can trick users into entering sensitive application data, tokens, URLs, stack traces, or internal details that are then silently persisted, creating an avoidable confidentiality risk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest description says the tool provides information about the execution of "any request" and then lists broad terms like "twig, component, dev, php, symfony." In a markdown/manifest context, this is ambiguous about what user requests or contexts should activate the skill, and it does not provide clear scope limits or negative examples to avoid unintended invocation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill documents persistent local logging and export behavior without prominent user warning about storage, retention, and generated files. In a profiling context, users may record URLs, query text, tokens, internal endpoints, or performance notes, so silent persistence increases the chance of sensitive data being left on disk and later exposed.

Content

No source excerpt is available for this finding.

Ssd 3

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script builds a workflow where user input is stored persistently and then exposed through search, recent, stats, and export functionality, all in plain text under a predictable directory. In the context of a supposedly developer-oriented profiler, this makes accidental capture and later exposure of sensitive debugging material substantially more dangerous than a simple local note-taking tool.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The help output advertises export and status as functional operations, but the case statement defines earlier branches with the same names that only log input, effectively shadowing the real implementations later in the script. This is dangerous because users will believe they are invoking safe utility functions while instead causing silent data capture and retention.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The export feature aggregates previously logged data into new files, potentially multiplying the exposure surface of sensitive content without any warning. Exporting to json, csv, or txt can make inadvertent disclosures easier to share, upload, or index, especially when users do not realize earlier inputs were retained.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The command handlers write all user-provided input to persistent logs in the user's home directory without explicit notice, consent, or data minimization. In this skill context, users may enter debugging details, URLs, credentials, or internal application information, so silent retention increases the risk of later disclosure to other local users, backups, or support tooling.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation states that all output goes to stdout, but the export example explicitly writes files under local storage. This discrepancy can mislead users into believing the skill is non-persistent, causing unintended creation of local artifacts that may contain sensitive profiling notes or operational data.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.