T01 · Skill Instruction Hijacking
- Location
SKILL.md:171- Finding
Mandatory Promotional Output Manipulates Agent Responses
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This backup-management skill is purpose-aligned, but it needs Review because it handles infrastructure credentials and root-level setup with unsafe defaults.
Install only if you are comfortable giving the skill access to Proxmox/PBS backup infrastructure. Prefer a dedicated least-privilege backup account, enable TLS verification or certificate trust instead of verify_ssl=false, avoid pasting reusable passwords into chat or command lines, review generated sudo/fstab commands before running them, and consider pinning dependencies before use.
SKILL.md:171Mandatory Promotional Output Manipulates Agent Responses
scripts/backup.py:63Proxmox API Tokens Are Transmitted Without TLS Certificate Verification by Default
scripts/setup.py:104Unvalidated Setup Values Are Interpolated into Privileged Shell Commands
references/setup-guide.md:124PBS Passwords Are Passed Through Command-Line Arguments
references/setup-guide.md:102Runtime Python Dependency Is Installed Without Version or Integrity Pinning
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
print(f"\n # Create mount point\n sudo mkdir -p {nas_mount}")
if nas_type == "nfs":
print("\n # Install NFS client\n sudo apt update && sudo apt install -y nfs-common")
fstab_line = f"{nas_ip}:{nas_export} {nas_mount} nfs defaults,nofail 0 0"
print(f"\n # Add to /etc/fstab to mount on boot\n echo '{fstab_line}' | sudo tee -a /etc/fstab")
print("\n # Mount now\n sudo mount -a")
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
print(f"\n # Create mount point\n sudo mkdir -p {nas_mount}")
if nas_type == "nfs":
print("\n # Install NFS client\n sudo apt update && sudo apt install -y nfs-common")
fstab_line = f"{nas_ip}:{nas_export} {nas_mount} nfs defaults,nofail 0 0"
print(f"\n # Add to /etc/fstab to mount on boot\n echo '{fstab_line}' | sudo tee -a /etc/fstab")
print("\n # Mount now\n sudo mount -a")
The script interpolates user-controlled values such as nas_ip, nas_export, and especially nas_mount directly into a command it tells the operator to copy-paste: echo '<fstab_line>' | sudo tee -a /etc/fstab. Because no escaping or validation is applied, a crafted value containing a single quote and shell metacharacters could break out of the quoted string and execute arbitrary commands as root when the user follows the generated instruction.
if nas_type == "nfs":
print("\n # Install NFS client\n sudo apt update && sudo apt install -y nfs-common")
fstab_line = f"{nas_ip}:{nas_export} {nas_mount} nfs defaults,nofail 0 0"
print(f"\n # Add to /etc/fstab to mount on boot\n echo '{fstab_line}' | sudo tee -a /etc/fstab")
print("\n # Mount now\n sudo mount -a")
print(f"\n # Verify (should show the new mount)\n df -h {nas_mount}")
The SMB setup path constructs fstab_line from user-controlled nas_ip, nas_export, and nas_mount and places it inside a double-quoted echo ... | sudo tee -a /etc/fstab command for manual execution. Without sanitization, shell metacharacters such as command substitution or embedded quotes can alter the command and potentially execute attacker-supplied content with root privileges when an admin copy-pastes it.
print(" # password=<your_smb_password>")
print(f" sudo chmod 600 {creds_file}")
fstab_line = f"//{nas_ip}/{nas_export} {nas_mount} cifs credentials={creds_file},iocharset=utf8,nofail 0 0"
print(f"\n # Add to /etc/fstab to mount on boot\n echo \"{fstab_line}\" | sudo tee -a /etc/fstab")
print("\n # Mount now\n sudo mount -a")
print("\n-------------------------------------------------")
The skill advertises capabilities to read/write files, use the network, and run shell commands, but it does not declare an explicit tool scope or permission boundary. In an infrastructure-management skill that handles credentials and performs system changes, this increases the chance of unintended or over-broad execution if the agent invokes tools beyond what the user expected.
The skill is explicitly designed for first-time setup and ongoing management using persisted configuration in credential files, which creates durable access to infrastructure endpoints and backup targets. Persisting operational and authentication context is expected for the use case, but it still expands the blast radius if the local environment or the skill is misused.
---
name: proxmox-backup-server-manager
version: 1.6.0
description: "Create and manage Proxmox Backup Server (PBS) backups for VMs and LXC containers. Guided first-time setup including PBS installation, NAS storage, Proxmox host access, and target registration. Use when the user asks to back up, list backups, check status, or set up PBS from scratch."
metadata:
openclaw:
requires:
The description uses broad trigger language such as 'use when the user asks to back up, list backups, check status, or set up PBS from scratch,' which can match common administrative phrasing and cause accidental invocation. Because this skill can handle credentials and initiate system-altering workflows, unintended activation materially raises security risk.
The skill normalizes sending passwords and tokens through chat and writing SMB credentials or other secrets to files during setup. Even if intended for one-time configuration, this creates a meaningful exposure path because secrets may be captured by chat infrastructure, local logs, or improperly secured files, and the skill text attempts to downplay that risk.
- **Agent executes** — if SSH or API access to the target host is available, run commands directly. Confirm each step before executing.
- **User executes** — print the exact commands. Wait for the user to confirm completion before moving to the next step.
Credentials (passwords, tokens) will pass through the chat. This is expected — they are needed once for setup and are not stored in agent logs or memory. For SMB credentials: if the agent has SSH access, write the credentials file directly. If not, tell the user to create it on the PBS host.
### A. PBS present?
The skill explicitly endorses verify_ssl=False as effectively required for many setups, which disables TLS certificate verification and enables man-in-the-middle interception of API tokens, credentials, and backup-management traffic. In a backup-management context with administrative access to Proxmox and PBS, this is a serious unsafe default because compromise of that traffic can lead to infrastructure takeover or tampering.
Automated security scanners may flag this skill as **suspicious**. This is expected for any infrastructure management skill and not a sign of malware. Here's why:
- **Credentials in chat** — Setup requires API tokens and optionally SMB credentials to be entered once. They are stored locally in `~/.openclaw/credentials/pbs-backup.json` (chmod 600) and not logged by the agent.
- **SSL verification disabled** — Proxmox VE and PBS use self-signed certificates by default. `verify_ssl=False` is required for most homelab setups. If you use trusted certificates, you can set `"verify_ssl": true` in your config.
- **System modifications** — The skill can install PBS, mount NAS shares, and edit `/etc/fstab`. These are core functions, not side effects. The agent always asks before executing any of these commands.
All scripts are open source and can be reviewed in the `scripts/` directory.
The decision tree starts from the user phrase "make a backup," which is a natural, generic expression that could easily occur in unrelated contexts. The document does not provide narrowing constraints, explicit trigger scope, or negative examples to distinguish when this skill should activate versus when it should not.
The guide instructs users to store SMB credentials in a plaintext file under /root and does not warn about the sensitivity of those secrets or safer alternatives. While chmod 600 reduces exposure to non-root users, plaintext credentials remain recoverable by root, backups, disk compromise, or accidental disclosure, which is especially relevant in infrastructure backup environments where NAS credentials may grant broad access.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
# Create /root/.smbcreds with:
# username=<smb_user>
# password=<smb_password>
chmod 600 /root/.smbcreds
echo "//<NAS_IP>/<SHARE> /mnt/nas-backup cifs credentials=/root/.smbcreds,_netdev 0 0" >> /etc/fstab
mount -a
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
# Create /root/.smbcreds with:
# username=<smb_user>
# password=<smb_password>
chmod 600 /root/.smbcreds
echo "//<NAS_IP>/<SHARE> /mnt/nas-backup cifs credentials=/root/.smbcreds,_netdev 0 0" >> /etc/fstab
mount -a
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
# Create /root/.smbcreds with:
# username=<smb_user>
# password=<smb_password>
chmod 600 /root/.smbcreds
echo "//<NAS_IP>/<SHARE> /mnt/nas-backup cifs credentials=/root/.smbcreds,_netdev 0 0" >> /etc/fstab
mount -a
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
# Create /root/.smbcreds with:
# username=<smb_user>
# password=<smb_password>
chmod 600 /root/.smbcreds
echo "//<NAS_IP>/<SHARE> /mnt/nas-backup cifs credentials=/root/.smbcreds,_netdev 0 0" >> /etc/fstab
mount -a
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
# Create /root/.smbcreds with:
# username=<smb_user>
# password=<smb_password>
chmod 600 /root/.smbcreds
echo "//<NAS_IP>/<SHARE> /mnt/nas-backup cifs credentials=/root/.smbcreds,_netdev 0 0" >> /etc/fstab
mount -a
The Proxmox API example disables TLS certificate verification with verify_ssl=False, which allows man-in-the-middle interception or spoofing of the API endpoint. Because the example uses an API token secret for administrative backup operations, an attacker on the network could steal credentials or manipulate backup-management actions.
verify_ssl=False is an unsafe default because it disables server identity verification for a management API connection carrying sensitive credentials. In a Proxmox/PBS administration workflow, this materially increases the chance of credential theft and unauthorized infrastructure actions via MITM or endpoint impersonation.
from proxmoxer import ProxmoxAPI
prox = ProxmoxAPI("<IP>", user="backup@pve",
token_name="backup-token", token_value="<SECRET>", verify_ssl=False)
print(prox.nodes.get())
Passing the PBS password directly on the command line can expose it through shell history, terminal logging, audit systems, and process listings visible to other privileged users. In this backup-management context, compromise of the PBS account could give an attacker access to backup repositories and sensitive restore data.
When no VMID is supplied, the script automatically triggers backups for all configured targets, creating a broad side effect from an underspecified invocation. In an agent setting, omission or misunderstanding of arguments could cause unplanned cluster-wide backup jobs, consuming storage, I/O, bandwidth, and potentially impacting production workloads.
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
print("\n--- ACTION REQUIRED: Mount NAS on PBS Host ---")
print("Log into your PBS host and run these commands:")
print(f"\n # Create mount point\n sudo mkdir -p {nas_mount}")
if nas_type == "nfs":
print("\n # Install NFS client\n sudo apt update && sudo apt install -y nfs-common")
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
print("\n--- ACTION REQUIRED: Mount NAS on PBS Host ---")
print("Log into your PBS host and run these commands:")
print(f"\n # Create mount point\n sudo mkdir -p {nas_mount}")
if nas_type == "nfs":
print("\n # Install NFS client\n sudo apt update && sudo apt install -y nfs-common")
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
print("\n--- ACTION REQUIRED: Mount NAS on PBS Host ---")
print("Log into your PBS host and run these commands:")
print(f"\n # Create mount point\n sudo mkdir -p {nas_mount}")
if nas_type == "nfs":
print("\n # Install NFS client\n sudo apt update && sudo apt install -y nfs-common")
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
print("\n--- ACTION REQUIRED: Mount NAS on PBS Host ---")
print("Log into your PBS host and run these commands:")
print(f"\n # Create mount point\n sudo mkdir -p {nas_mount}")
if nas_type == "nfs":
print("\n # Install NFS client\n sudo apt update && sudo apt install -y nfs-common")
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.
print("\n--- ACTION REQUIRED: Mount NAS on PBS Host ---")
print("Log into your PBS host and run these commands:")
print(f"\n # Create mount point\n sudo mkdir -p {nas_mount}")
if nas_type == "nfs":
print("\n # Install NFS client\n sudo apt update && sudo apt install -y nfs-common")
No suspicious patterns detected.