Back to skill

Security audit

Deploy Helper

Security checks for vulnerabilities and agentic risk

Overview

The main deployment helper mostly prints deployment templates, but it includes insecure default database credentials and an unrelated local-history logging script that users should review before installing.

Review the generated Compose file before use, replace all database credentials with real secrets or environment-based secret management, and do not run the unrelated script.sh unless you accept its local command-history logging. Treat the SSL output as copy-and-review guidance, not a command block to run blindly as root.

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/deploy.sh:107
Finding
Predictable Hardcoded PostgreSQL Credentials in Generated Docker Compose Configuration## Vulnerability Details **File Location**: `scripts/deploy.sh`, lines 107 and 120–123 **Vulnerability Type**: Hardcoded credentials in generated deployment configuration **Risk Level**: Medium ### Vulnerable Code ```yaml environment: - NODE_ENV=production - DATABASE_URL=postgres://user:pass@db:5432/appdb - REDIS_URL=redis://redis:6379 ``` ```yaml db: image: postgres:15-alpine environment: POSTGRES_USER: user POSTGRES_PASSWORD: pass POSTGRES_DB: appdb ``` ### Technical Analysis The `compose` command generates a functional Docker Compose configuration containing the fixed PostgreSQL username `user` and password `pass`. The same credentials are embedded in the application's `DATABASE_URL`, making the predictable secret available both in the generated configuration and in the application container's environment. These are not merely nonfunctional placeholders: deploying the generated configuration creates a PostgreSQL account using the published values. Although the provided Compose template does not directly publish PostgreSQL's port to the host, any process with access to the Compose network—including a compromised application or peer container—can attempt authentication using these known credentials. Users may also expose the database later without recognizing that the template contains insecure defaults. ### Attack Path 1. A user generates a Compose configuration with `bash scripts/deploy.sh compose <type>`. 2. The user deploys the generated configuration without replacing the default credentials. 3. An attacker compromises an Internet-facing application or another container attached to `app-network`, or reaches PostgreSQL after a later configuration change exposes port 5432. 4. The attacker connects to the `db` service using username `user`, password `pass`, and database `appdb`. 5. The attacker reads, modifies, or deletes data available to tha ...[truncated 753 chars]
Remediation
## Remediation Suggestions - Remove all functional default passwords from the generated configuration. - Require explicit secret values using mandatory Compose interpolation: ```yaml services: app: environment: DATABASE_URL: "postgres://${POSTGRES_USER:?required}:${POSTGRES_PASSWORD:?required}@db:5432/${POSTGRES_DB:?required}" db: environment: POSTGRES_USER: "${POSTGRES_USER:?required}" POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:?required}" POSTGRES_DB: "${POSTGRES_DB:?required}" ``` - Prefer Docker secrets or an external secret manager for production deployments rather than storing credentials in source-controlled Compose files. - Add documentation warning users not to commit `.env` files and provide a `.env.example` containing names only, without usable credentials. - Generate a high-entropy password when an explicitly requested local-development mode needs automatic setup, and clearly distinguish that mode from production templates. - Keep PostgreSQL isolated on an internal network and do not publish port 5432 unless operationally necessary. - Rotate the database credentials in any environment already deployed from this template.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (13)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
There is a significant mismatch between the declared purpose and the observed behavior: instead of acting as a deployment-config generator, the skill reportedly implements unrelated workflow/help behavior and writes persistent local usage logs. This kind of misrepresentation is dangerous because it can conceal undisclosed data collection or other hidden actions behind a benign deployment-assistant description, undermining user trust and informed consent.

Chaining Abuse

High
Category
Tool Misuse
Content
# --- Step 1: Install Certbot ---
# Ubuntu/Debian:
sudo apt update && sudo apt install -y certbot python3-certbot-nginx

# --- Step 2: Obtain Certificate ---
sudo certbot --nginx -d {domain} -d www.{domain}
Confidence
75% confidence
Finding
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Lp3

Medium
Category
MCP Least Privilege
Confidence
80% confidence
Finding
The skill metadata does not declare any tool scope or permission boundaries even though the skill advertises execution via a shell script and deployment-related actions that commonly require shell and network access. Missing explicit scope increases the chance of overbroad execution and makes it harder for users or platforms to constrain potentially dangerous operations.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The generated docker-compose template embeds hardcoded example credentials like POSTGRES_USER=user and POSTGRES_PASSWORD=pass without warning that they are insecure placeholders. Users may deploy the template unchanged, resulting in trivial compromise of the database and downstream application access.

Description-Behavior Mismatch

Medium
Confidence
86% confidence
Finding
The manifest describes a one-command deployment assistant that generates deployment-related artifacts such as Dockerfiles, compose files, Nginx configs, CI/CD pipelines, Vercel/Netlify configs, and Kubernetes manifests. The `ssl` command goes beyond artifact generation and outputs operational instructions for installing Certbot with `sudo`, obtaining live certificates, and setting up cron-based renewal, which is broader than the stated generation scope.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
# --- Step 1: Install Certbot ---
# Ubuntu/Debian:
sudo apt update && sudo apt install -y certbot python3-certbot-nginx

# --- Step 2: Obtain Certificate ---
sudo certbot --nginx -d {domain} -d www.{domain}
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
# --- Step 1: Install Certbot ---
# Ubuntu/Debian:
sudo apt update && sudo apt install -y certbot python3-certbot-nginx

# --- Step 2: Obtain Certificate ---
sudo certbot --nginx -d {domain} -d www.{domain}
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
# --- Step 1: Install Certbot ---
# Ubuntu/Debian:
sudo apt update && sudo apt install -y certbot python3-certbot-nginx

# --- Step 2: Obtain Certificate ---
sudo certbot --nginx -d {domain} -d www.{domain}
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
# --- Step 1: Install Certbot ---
# Ubuntu/Debian:
sudo apt update && sudo apt install -y certbot python3-certbot-nginx

# --- Step 2: Obtain Certificate ---
sudo certbot --nginx -d {domain} -d www.{domain}
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Session Persistence

Medium
Category
Rogue Agent
Content
}}

# --- Step 4: Auto-renewal (cron) ---
# sudo crontab -e
# 0 3 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

# --- Step 5: Verify ---
Confidence
85% 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.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The manifest says this skill is a one-command deployment assistant for generating Dockerfiles, compose files, Nginx configs, CI/CD pipelines, hosting configs, and Kubernetes manifests. In contrast, the user-facing behavior documented in this script is a generic 'Developer workflow automation tool' with commands like init, check, build, test, docs, clean, and status, and no code that generates deployment artifacts.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The header comment and help text explicitly present the tool as a 'Developer workflow automation tool'. That actively conflicts with the stated skill intent of being a deployment assistant focused on generating deployment-related configuration files and manifests.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The script logs command usage and user-supplied arguments to a local history file without explicit consent, retention controls, or redaction. If users pass sensitive values as arguments, those secrets could be persisted in plaintext under a user-controlled data directory and later exposed to other local processes, backups, or support bundles.

Static analysis

No suspicious patterns detected.