Back to skill

Security audit

Laravel Cloud

Security checks for vulnerabilities and agentic risk

Overview

This is a transparent Laravel Cloud management wrapper, but it grants broad cloud-changing authority without confirmation safeguards and recommends plaintext token storage without permission hardening.

Install only if you want an agent to manage Laravel Cloud resources on your behalf. Use a narrowly scoped token if available, prefer an environment variable or secret manager over the plaintext file, set any credential file to owner-only permissions, and require explicit human confirmation before delete, restore, stop, deployment, variable replacement, bucket-key, or remote command operations.

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
SKILL.md:32
Finding

Credential file setup does not enforce restrictive permissions

Content
View full analysis
~/.openclaw/credentials/laravel-cloud/config.json ``` ``` The credential is subsequently consumed by `scripts/laravel-cloud.sh:7,25-26`: ```bash CREDS="${HOME}/.openclaw/credentials/laravel-cloud/config.json" [[ -z "${LARAVEL_CLOUD_API_TOKEN:-}" ]] && [[ -f "$CREDS" ]] && \ LARAVEL_CLOUD_API_TOKEN=$(jq -r '.token // empty' "$CREDS" 2>/dev/null || true) ``` ### Technical Analysis The documented setup writes a long-lived Laravel Cloud bearer token to disk without explicitly controlling the permissions of either the credential directory or the resulting file. The effective modes depend on the user's current `umask`. Under common defaults, the directory may be created as mode `755` and the file as mode `644`, making the token readable by other local accounts. Reading this specific credential path is necessary for the declared authentication fallback. The excessive behavior is not the path access itself, but the failure to enforce least-privilege access when instructing users to create the secret. Because this token is used as a Bearer credential, possession is generally sufficient for authentication. The script exposes broad Laravel Cloud management functionality, including remote commands, environment-variable management, deployments, storage-key management, and destructive resource operations. The exact authority available to an attacker depends on the token's server-side permissions. ### Attack Path 1. A user follows the documented file-based setup instructions. 2. The user's `umask` permits group or world read access to newly created files. 3. `config.json` is created with permissions that allow another local account or process to rea ...[truncated 1108 chars]
Remediation
View remediation
"$HOME/.openclaw/credentials/laravel-cloud/config.json" chmod 600 "$HOME/.openclaw/credentials/laravel-cloud/config.json" ``` Additional hardening should include: 1. Prefer `LARAVEL_CLOUD_API_TOKEN` or a secret manager such as the already supported 1Password reference mechanism. 2. Validate file ownership and permissions before loading the credential, and reject files writable or readable by unauthorized principals. 3. Document that users should issue narrowly scoped tokens where Laravel Cloud supports such restrictions. 4. Recommend regular token rotation and immediate revocation after suspected disclosure. 5. Avoid embedding real tokens directly into shell commands where they may enter shell history; provide an interactive or secret-manager-based setup process. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
scripts/laravel-cloud.sh:140
Finding

Application secrets are accepted through process command-line arguments

Content
View full analysis
--vars 'APP_KEY=base64:...,DB_HOST=localhost' laravel-cloud envs vars-replace --vars 'KEY1=val1,KEY2=val2' ``` ### Technical Analysis The `--vars` and `--content` options are intended to carry Laravel environment configuration, which commonly includes application keys, database passwords, API tokens, and other credentials. Values passed this way are part of the invoking process's argument vector. Depending on the operating system and process-isolation configuration, arguments may be observable through process inspection facilities, monitoring agents, audit logs, diagnostic tooling, or job-runner logs. Interactive shells may also retain the complete command in persistent history. Quoting the value prevents shell expansion but does not remove it from the process argument vector or shell history. The script does not provide ...[truncated 1551 chars]
Remediation
View remediation
--content-stdin laravel-cloud envs vars-replace --vars-file ./protected-env.json ``` Implementation hardening should include: 1. Read secret content from standard input without echoing it. 2. Support files only after checking that they are regular files, owned by the invoking user, and not accessible by group or other users. 3. Avoid printing request bodies or environment values in normal output and errors. 4. Update documentation to prefer standard input, a protected file, or a secret-manager integration. 5. Warn users that `--vars` and `--content` may expose values through shell history, process inspection, CI logs, and monitoring systems. 6. If argument-based input must remain for compatibility, clearly designate it as suitable only for non-sensitive values. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (19)

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 82)May include surrounding context.

sh
update)
      [[ ${1:-} ]] || die "app-id required"; local id=$1; shift
      api PATCH "/applications/$id" "$(jb name="$(flag name "$@")" slack_channel="$(flag slack-channel "$@")")" ;;
    delete) [[ ${1:-} ]] || die "app-id required"; api DELETE "/applications/$1" ;;
    *) echo "apps: list | get <id> | create --name N --region R --repository owner/repo [--source-control github|gitlab|bitbucket] | update <id> [--name N] [--slack-channel C] | delete <id>" ;;
  esac
}

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 114)May include surrounding context.

sh
body="$(echo "$body" | jq --arg k "$fk" --arg d "$fd" '. + {filesystem_keys: [{id: $k, disk: $d, is_default_disk: true}]}')"
      fi
      api PATCH "/environments/$id" "$body" ;;
    delete)  [[ ${1:-} ]] || die "env-id required"; api DELETE "/environments/$1" ;;
    start)   [[ ${1:-} ]] || die "env-id required"; api POST "/environments/$1/start" '{}' ;;
    stop)    [[ ${1:-} ]] || die "env-id required"; api POST "/environments/$1/stop" '{}' ;;
    metrics) [[ ${1:-} ]] || die "env-id required"

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 192)May include surrounding context.

sh
[[ ${1:-} ]] || die "domain-id required"; local id=$1; shift
      api PATCH "/domains/$id" "$(jb www_redirect="$(flag redirect "$@")" \
        wildcard_enabled:bool="$(flag wildcard "$@")")" ;;
    delete) [[ ${1:-} ]] || die "domain-id required"; api DELETE "/domains/$1" ;;
    verify) [[ ${1:-} ]] || die "domain-id required"; api POST "/domains/$1/verify" '{}' ;;
    *) cat <<'EOF'
domains: list <env-id> | get <id> | delete <id> | verify <id>

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 223)May include surrounding context.

sh
min_replicas:int="$(flag min-replicas "$@")" max_replicas:int="$(flag max-replicas "$@")" \
        scaling_cpu_threshold_percentage:int="$(flag scaling-cpu-threshold "$@")" \
        scaling_memory_threshold_percentage:int="$(flag scaling-memory-threshold "$@")")" ;;
    delete) [[ ${1:-} ]] || die "instance-id required"; api DELETE "/instances/$1" ;;
    *) cat <<'EOF'
instances: list <env-id> | get <id> | sizes | delete <id>
           create <env-id> --name N --size S [--type service] [--scaling-type none|custom|auto]

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 248)May include surrounding context.

sh
update)
      [[ ${1:-} ]] || die "bg-process-id required"; local id=$1; shift
      api PATCH "/background-processes/$id" "$(jb name="$(flag name "$@")" command="$(flag command "$@")")" ;;
    delete) [[ ${1:-} ]] || die "bg-process-id required"; api DELETE "/background-processes/$1" ;;
    *) echo 'bg-processes: list <inst-id> | get <id> | create <inst-id> --name N --command C | update <id> [--name N] [--command C] | delete <id>' ;;
  esac
}

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 275)May include surrounding context.

sh
cluster-update)
      [[ ${1:-} ]] || die "cluster-id required"; local id=$1; shift
      api PATCH "/databases/clusters/$id" "$(jb name="$(flag name "$@")")" ;;
    cluster-delete)  [[ ${1:-} ]] || die "cluster-id required"; api DELETE "/databases/clusters/$1" ;;
    cluster-metrics) [[ ${1:-} ]] || die "cluster-id required"
                     api GET "/databases/clusters/$1/metrics$(qs period "$(flag period "${@:2}")")" ;;
    types)    api GET /databases/types ;;

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 285)May include surrounding context.

sh
[[ ${1:-} ]] || die "cluster-id required"; local cid=$1; shift
      local n=$(flag name "$@"); [[ $n ]] || die "--name required"
      api POST "/databases/clusters/$cid/databases" "$(jb name="$n")" ;;
    delete)          [[ ${1:-} ]] || die "database-id required"; api DELETE "/databases/$1" ;;
    snapshots)       [[ ${1:-} ]] || die "cluster-id required"; api GET "/databases/clusters/$1/snapshots" ;;
    snapshot)        [[ ${1:-} ]] || die "snapshot-id required"; api GET "/database-snapshots/$1" ;;
    snapshot-create) [[ ${1:-} ]] || die "cluster-id required"; api POST "/databases/clusters/$1/snapshots" '{}' ;;

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 289)May include surrounding context.

sh
snapshots)       [[ ${1:-} ]] || die "cluster-id required"; api GET "/databases/clusters/$1/snapshots" ;;
    snapshot)        [[ ${1:-} ]] || die "snapshot-id required"; api GET "/database-snapshots/$1" ;;
    snapshot-create) [[ ${1:-} ]] || die "cluster-id required"; api POST "/databases/clusters/$1/snapshots" '{}' ;;
    snapshot-delete) [[ ${1:-} ]] || die "snapshot-id required"; api DELETE "/database-snapshots/$1" ;;
    restore)
      [[ ${1:-} ]] || die "cluster-id required"; local cid=$1; shift
      local n=$(flag name "$@"); [[ $n ]] || die "--name required"

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 331)May include surrounding context.

sh
[[ ${1:-} ]] || die "cache-id required"; local id=$1; shift
      api PATCH "/caches/$id" "$(jb size="$(flag size "$@")" \
        auto_upgrade_enabled:bool="$(flag auto-upgrade "$@")")" ;;
    delete)  [[ ${1:-} ]] || die "cache-id required"; api DELETE "/caches/$1" ;;
    metrics) [[ ${1:-} ]] || die "cache-id required"
             api GET "/caches/$1/metrics$(qs period "$(flag period "${@:2}")")" ;;
    *) cat <<'EOF'

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 358)May include surrounding context.

sh
update)
      [[ ${1:-} ]] || die "bucket-id required"; local id=$1; shift
      api PATCH "/buckets/$id" "$(jb name="$(flag name "$@")")" ;;
    delete) [[ ${1:-} ]] || die "bucket-id required"; api DELETE "/buckets/$1" ;;
    *) echo "buckets: list | get <id> | create --name N --region R [--visibility private|public] [--jurisdiction default|eu] [--key-name N] [--key-permission read_write|read_only] | update <id> [--name N] | delete <id>" ;;
  esac
}

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 378)May include surrounding context.

sh
[[ ${1:-} ]] || die "key-id required"; local id=$1; shift
      api PATCH "/bucket-keys/$id" "$(jb name="$(flag name "$@")" \
        permission="$(flag permission "$@")")" ;;
    delete) [[ ${1:-} ]] || die "key-id required"; api DELETE "/bucket-keys/$1" ;;
    *) echo "bucket-keys: list <bucket-id> | get <id> | create <bucket-id> --name N [--permission read_write|read_only] | update <id> [--name N] [--permission P] | delete <id>" ;;
  esac
}

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 396)May include surrounding context.

sh
update)
      [[ ${1:-} ]] || die "ws-cluster-id required"; local id=$1; shift
      api PATCH "/websocket-servers/$id" "$(jb name="$(flag name "$@")" size="$(flag size "$@")")" ;;
    delete)  [[ ${1:-} ]] || die "ws-cluster-id required"; api DELETE "/websocket-servers/$1" ;;
    metrics) [[ ${1:-} ]] || die "ws-cluster-id required"
             api GET "/websocket-servers/$1/metrics$(qs period "$(flag period "${@:2}")")" ;;
    *) echo "websockets: list | get <id> | create --name N --region R [--size S] | update <id> [--name N] [--size S] | delete <id> | metrics <id> [--period ...]" ;;

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
90% confidence
Finding

Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Content

Scanner excerpt · scripts/laravel-cloud.sh (reported line 416)May include surrounding context.

sh
update)
      [[ ${1:-} ]] || die "ws-app-id required"; local id=$1; shift
      api PATCH "/websocket-applications/$id" "$(jb name="$(flag name "$@")")" ;;
    delete)  [[ ${1:-} ]] || die "ws-app-id required"; api DELETE "/websocket-applications/$1" ;;
    metrics) [[ ${1:-} ]] || die "ws-app-id required"
             api GET "/websocket-applications/$1/metrics$(qs period "$(flag period "${@:2}")")" ;;
    *) echo "ws-apps: list <ws-id> | get <id> | create <ws-id> --name N | update <id> [--name N] | delete <id> | metrics <id> [--period ...]" ;;

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill exposes shell-based capabilities through a wrapper script but does not declare any explicit tool scope such as allowed-tools or permissions. That omission weakens least-privilege controls and can cause the agent runtime or user to underestimate that the skill can issue arbitrary API-driving shell commands affecting cloud infrastructure.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
84% confidence
Finding

The skill recommends persisting an API token in a plaintext credentials file under the user's home directory, which creates long-lived secret exposure on disk. If local filesystem access is compromised, backups are leaked, or permissions are too broad, the token could be used to manage Laravel Cloud resources.

Content

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

Option 2 — Credentials file:

bash
mkdir -p ~/.openclaw/credentials/laravel-cloud
echo '{"token":"your-token-here"}' > ~/.openclaw/credentials/laravel-cloud/config.json

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The documentation prominently includes destructive and mutating actions such as create, update, delete, start, stop, restore, and deployment initiation without warnings, confirmation guidance, or safety notes. In an agent setting, this increases the chance of accidental production-impacting operations because users or downstream agents may treat examples as safe defaults.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This shell script performs irreversible DELETE requests for multiple resource types, and the first instance appears here with application deletion. Although the script is an API CLI, these delete actions have no confirmation prompt, cautionary output, or inline warning comment to disclose that they can permanently remove cloud resources.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% 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/laravel-cloud.sh (reported line 445)May include surrounding context.

sh
ws-apps       WebSocket applications      ips           Whitelisted IPs
  org           Organization info           regions       Available regions

Auth: export LARAVEL_CLOUD_API_TOKEN=... or create ~/.openclaw/credentials/laravel-cloud/config.json
Help: laravel-cloud <resource> help
EOF
}

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
83% confidence
Finding

The script automatically reads an API token from a local credentials file if the environment variable is unset. This is access to sensitive credentials, but there is no visible log, warning, or explanatory help text informing users that the script will read secrets from this path during execution.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.