Back to skill

Security audit

Caprover CI Deployments

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent CapRover deployment helper, but it should be reviewed carefully because it stores high-value credentials and can trigger live deployments without strong scoping or confirmation.

Install only if you are comfortable giving the skill deployment authority. Prefer per-app CapRover tokens over the master password, avoid storing secrets in plaintext config files, add a real gitignore for local config, require manual confirmation before deploys, redact webhook URLs from logs, and pin GitHub Actions or package versions before using the templates in production.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (4)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:15
Finding

Unnecessary Plaintext Collection of a CapRover Master Password

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/deploy.py:187
Finding

CapRover Application Token Exposed Through Process Arguments

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/deploy.py:137
Finding

Credential-Bearing CapRover Webhook URL Partially Disclosed in Logs

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:163
Finding

Deployment Workflows Execute Dependencies Referenced by Mutable Versions

Content
View full analysis
> $GITHUB_ENV echo "CAPROVER_TOKEN=${{ secrets.CAPROVER_APP_TOKEN_PROD }}" >> $GITHUB_ENV else echo "CAPROVER_APP=${{ secrets.CAPROVER_APP_STAGING }}" >> $GITHUB_ENV echo "CAPROVER_TOKEN=${{ secrets ...[truncated 3154 chars]
Remediation
View remediation
``` 2. Retain the human-readable release in a comment so updates remain understandable: ```yaml uses: actions/checkout@ # v4.x.x ``` 3. Pin the CapRover npm package to a reviewed exact version rather than installing the latest release: ```bash npm install -g caprover@ ``` 4. Use lockfiles and integrity verification where package installation occurs inside a project. 5. Configure Dependabot or Renovate to propose pinned SHA updates through reviewed pull requests. 6. Restrict workflow `permissions` to the minimum required for each job and step. 7. Protect production deployments with GitHub Environments, required reviewers, and environment-scoped secrets. 8. Use distinct least-privilege CapRover tokens for staging and production and rotate them periodically. 9. Review third-party actions before adoption and prefer first-party or locally audited alternatives where practical. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (11)

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding

The skill claims it can scaffold workflows, generate deployment files, and configure secrets, but the documented behavior mainly covers triggering existing deploy paths and listing status. This mismatch can mislead operators about what automation will do, causing unsafe assumptions and potentially prompting manual secret handling or deployment steps outside expected review paths.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The skill explicitly describes network calls and shell-based deployment actions but declares no tool restrictions or permission boundaries. In an agent environment, that increases the chance of the skill being invoked with capabilities to trigger real external changes without clear sandboxing or authorization controls.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrases are broad enough that ordinary deployment-related conversation could activate a skill that performs live deployment actions. In this context, over-broad activation is risky because the skill can contact GitHub and CapRover and may initiate production-impacting changes.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill is designed to trigger remote deployments and mutate live systems, but it does not prominently warn that these are state-changing actions. Without explicit warning and confirmation, users may invoke it casually and unintentionally deploy code, rebuild apps, or affect production availability.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

Strategy 1: GitHub Workflow Dispatch (Recommended)

bash
curl -X POST \
  -H "Authorization: Bearer $GITHUB_TOKEN" \
  -H "Accept: application/vnd.github+json" \
  https://api.github.com/repos/OWNER/REPO/actions/workflows/deploy.yml/dispatches \

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
return False

    ref = branch or app_config.get("default_branch", "main")
    url = f"https://api.github.com/repos/{repo}/actions/workflows/{workflow}/dispatches"

    headers = {
        "Authorization": f"Bearer {token}",

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
return False

    ref = branch or app_config.get("default_branch", "main")
    url = f"https://api.github.com/repos/{repo}/actions/workflows/{workflow}/dispatches"

    headers = {
        "Authorization": f"Bearer {token}",

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/deploy.py (reported line 109)May include surrounding context.

python
return False

    ref = branch or app_config.get("default_branch", "main")
    url = f"https://api.github.com/repos/{repo}/actions/workflows/{workflow}/dispatches"

    headers = {
        "Authorization": f"Bearer {token}",

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/deploy.py (reported line 237)May include surrounding context.

python
return False

    ref = branch or app_config.get("default_branch", "main")
    url = f"https://api.github.com/repos/{repo}/actions/workflows/{workflow}/dispatches"

    headers = {
        "Authorization": f"Bearer {token}",

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/deploy.py (reported line 180)May include surrounding context.

python
return False

    # Check if caprover CLI is installed
    result = subprocess.run(["which", "caprover"], capture_output=True)
    if result.returncode != 0:
        print("❌ caprover CLI not installed. Run: npm install -g caprover")
        return False

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/deploy.py (reported line 196)May include surrounding context.

python
cmd += ["--branch", branch]

    print(f"   App: {app_name}")
    result = subprocess.run(cmd, capture_output=False)
    if result.returncode == 0:
        print("✅ Deployed successfully!")
        return True

Static analysis

No suspicious patterns detected.