update-plus
15 findings (5 critical, 3 high, 4 medium, 3 low), mainly command injection, unauthorized tool use, data exfiltration. Most recent scan 2026-02-07.
The update-plus skill presents MULTIPLE HIGH-SEVERITY security vulnerabilities primarily related to command injection and insufficient input validation. The restore functionality accepts unvalidated user input (backup_id) that is used directly in file operations and tar extraction, creating command injection and path traversal risks. The extensive use of shell scripting with user-controlled configuration values (loaded from JSON) without proper quoting and validation creates additional injection vectors throughout the codebase. MEDIUM-severity concerns include potential credential exposure through unencrypted backups of sensitive directories, undeclared tool permissions despite broad file system and network operations, and resource exhaustion risks from unbounded backup creation. The skill performs powerful operations (backup, restore, update, remote sync) but lacks adequate security controls, input validation, and user warnings about the risks involved. While the functionality is useful for system maintenance, the implementation requires significant security hardening before it can be considered safe for production use.
Scanner's overall assessment (LLM analyzer)
Second scanner: NVIDIA SkillSpector
Independent static run, no language model, over the same files as the Cisco scan above. How the two scanners compare across the whole corpus: Two scanners, one corpus.
What this skill does
Full backup, update, and restore for OpenClaw - config, workspace, and skills with auto-rollback
- Package
- 10 files, 48 KB
- SKILL.md
- 444 words, 12+ sections
- Code
- Shell (7)
- Requires
- bins:
gitjqrsync - Version
- 4.0.3
SKILL.md covers: 🔄 Update Plus · Quick Start · Check for available updates · Create a full backup · Update everything (creates backup first) · Preview changes (no modifications) · Restore from backup · Features · Installation · Add to PATH · Configuration · Commands
Findings
CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[0;31m
bin/lib/utils.sh:7
RED='\033[0;31m'CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[0;32m
bin/lib/utils.sh:8
GREEN='\033[0;32m'CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[1;33m
bin/lib/utils.sh:9
YELLOW='\033[1;33m'CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[0;34m
bin/lib/utils.sh:10
BLUE='\033[0;34m'CRITICAL INJECTION ATTACK detected by YARA Command Injectionstatic
Detects embedded scripting payloads (JS, VBScript, etc.) in MCP tool descriptions: \033[0m
bin/lib/utils.sh:11
NC='\033[0m' # No ColorHIGH SYSTEM MANIPULATION detected by YARA Unauthorized Tool Usestatic
Detects system manipulation, privilege escalation, and destructive file operations: find "${BACKUP_DIR}" -name "*.log" -mtime +30 -delete
bin/lib/cron.sh:76
find "${BACKUP_DIR}" -name "*.log" -mtime +30 -delete 2>/dev/nullHIGH Command Injection via Unvalidated Backup ID in Restore Function Command Injectionllm
The restore_backup() function in bin/lib/restore.sh accepts a user-provided backup_id parameter and uses it directly in file path operations and tar extraction without proper validation. An attacker could provide a malicious backup_id containing path traversal sequences (../) or command injection payloads to access arbitrary files or execute commands. The backup_id is used in: backup_path="${BACKUP_DIR}/${backup_id}" and tar -xzf "$backup_path", allowing potential directory traversal or malicious archive extraction.
bin/lib/restore.sh
restore_backup() {
local backup_id="$1"
...
local backup_path="${BACKUP_DIR}/${backup_id}"
...
if ! tar -xzf "$backup_path" -C "$tmp_extract_dir" 2>/dev/null; thenHIGH Command Injection via eval and Unvalidated User Input in Multiple Functions Command Injectionllm
Multiple shell scripts use eval with user-controlled or external data without proper sanitization. In bin/lib/utils.sh, the expand_path() function uses sed to perform variable substitution which could be exploited. More critically, configuration values loaded from JSON (which could be user-modified) are used in shell commands throughout the codebase without proper quoting or validation. The jq outputs are used directly in while loops and command construction, creating injection opportunities.
bin/lib/utils.sh
expand_path() {
local path="$1"
echo "$path" | sed "s|\${HOME}|$HOME|g" | sed "s|~|$HOME|g"
}
# Used throughout with user-controlled paths:
dir_path=$(echo "$dir_config" | jq -r '.path')
dir_path=$(expand_path "$dir_path")MEDIUM User input used in command substitution - potential injection risk Command Injectionstatic
Pattern detected: eval rsync $rsync_args "$dir_path/" "$tmp_backup_dir/$
bin/lib/backup.sh:63
eval rsync $rsync_args "$dir_path/" "$tmp_backup_dir/$dir_label/" 2>/dev/null || {MEDIUM Potential Credential Exposure via Backup of Sensitive Directories Data Exfiltrationllm
The backup functionality backs up the entire ~/.openclaw directory by default, which may contain sensitive credentials, API keys, or tokens. The configuration allows arbitrary paths to be backed up via backup_paths in the JSON config. If users configure backups of ~/.ssh, ~/.aws, or other credential directories, these will be included in backups. While encryption is optional (ENCRYPTION_ENABLED), it defaults to false, meaning backups are stored unencrypted by default. Additionally, backups can be synced to remote storage (rclone) without enforcing encryption.
bin/lib/backup.sh
# Default backup includes entire .openclaw directory
BACKUP_PATHS_JSON=""
# Encryption is optional and defaults to false
ENCRYPTION_ENABLED="false"
# Remote storage sync without mandatory encryption
REMOTE_STORAGE_ENABLED="false"MEDIUM Tool Restriction Violation - Undeclared Network and File System Operations Unauthorized Tool Usellm
The skill's YAML manifest does not declare allowed-tools, but the scripts perform extensive file system operations (Read, Write, Glob) and network operations (curl for connection checks, npm/pnpm for updates, rclone for remote storage, notification APIs). While allowed-tools is optional, the absence of this declaration combined with the broad scope of operations (backup, restore, update, remote sync) creates ambiguity about the skill's intended permissions. The skill can modify arbitrary files via restore operations and make network calls without explicit permission declaration.
SKILL.md
# YAML manifest missing allowed-tools
allowed-tools: Not specified
# But scripts perform:
- File operations: tar, rsync, mkdir, rm -rf
- Network operations: curl, npm, rclone
- Notifications: openclaw messaging API callsMEDIUM Potential Resource Exhaustion via Unbounded Backup Creation Resource Abusellm
The backup functionality lacks safeguards against resource exhaustion. While BACKUP_COUNT limits the number of retained backups (default 5), there are no checks for: 1) Maximum backup size before creation, 2) Total disk space consumption by all backups, 3) Rate limiting on backup creation. The check_disk_space() function only checks available space, not total consumption. An attacker or misconfiguration could trigger repeated backup operations, filling disk space. The cron job (install_cron) can be set to run at any interval without rate limiting.
bin/lib/backup.sh
# Backup count limit exists but no size limits
BACKUP_COUNT="5"
# Disk space check is optional and only checks available space
check_disk_space() {
local required_mb="${1:-500}"
local check_enabled="${CHECK_DISK:-true}"
# Cron can be set to any schedule without validation
install_cron() {
local cron_schedule="${1:-0 2 * * *}"LOW Skill does not specify a license Policy Violationstatic
Skill manifest does not include a 'license' field. Specifying a license helps users understand usage terms.
SKILL.md
LOW Hardcoded Sensitive Path Patterns Without Validation Data Exfiltrationllm
The scripts contain hardcoded paths to potentially sensitive directories (~/.aws, ~/.ssh mentioned in comments/documentation) and the code walks directory trees without validating against sensitive locations. While not actively exploited in the current code, the rsync and tar operations could inadvertently include sensitive files if users configure broad backup paths. The exclude mechanism relies on user configuration rather than enforcing security boundaries.
bin/lib/backup.sh
# Rsync with user-defined excludes only
local rsync_args="-a"
while IFS= read -r exclude_pattern; do
rsync_args="$rsync_args --exclude=$exclude_pattern"
done <<< "$dir_excludes"
# No hardcoded exclusions for sensitive pathsLOW Missing Security Warnings in Skill Description Social Engineeringllm
The skill description and documentation do not adequately warn users about security implications of the operations performed. The skill can: 1) Execute arbitrary code from git repositories during updates, 2) Restore potentially malicious backup archives, 3) Sync backups to remote storage, 4) Execute with elevated privileges via cron. The SKILL.md presents these as convenience features without security warnings about verifying backup integrity, validating update sources, or risks of automatic updates.
SKILL.md
description: Full backup, update, and restore for OpenClaw - config, workspace, and skills with auto-rollback
# No warnings about:
- Verifying backup integrity before restore
- Risks of automatic updates from git
- Remote storage security implications
- Cron job running with user privilegesWhat is in the package
| File | Kind | Size |
|---|---|---|
README.md | doc | 5.2 KB |
SKILL.md | doc | 3.5 KB |
update-plus.example.json | config | 1.1 KB |
bin/lib/backup.sh | script | 6.0 KB |
bin/lib/config.sh | script | 4.7 KB |
bin/lib/cron.sh | script | 2.4 KB |
bin/lib/notify.sh | script | 2.5 KB |
bin/lib/restore.sh | script | 7.0 KB |
bin/lib/update.sh | script | 12 KB |
bin/lib/utils.sh | script | 4.0 KB |
External hosts referenced
github.com google.com
Hostnames that appear in the skill's files. Referencing a host is not a finding; compare against the findings above and the skill's stated purpose.
Environment variables referenced
CONFIG_FILE BACKUP_DIR WORKSPACE BOT_DIR REMOTE_STORAGE_PATH WORKSPACE_DEFAULT
Package contents recorded 2026-10-22. The scan above ran against the version current at scan time; the two can differ if the skill has since been updated.
What we checked
- Static analyzer. Pattern rules over SKILL.md and bundled files: known-bad commands, exfiltration URLs, secrets, obfuscation.
- Llm analyzer. A language model reads the skill and reports intent-level issues the rules cannot express.
- Meta analyzer. A second model pass that validates, deduplicates and re-scores the other analyzers' findings.
What we did not check
- Runtime behaviour. The skill was not executed; findings come from reading its files.
- Anything fetched at install or run time, including remote scripts, package dependencies, and URLs the skill tells the agent to open.
- Content the analyzers cannot read: images, binaries, and some non-English text.
- Known scanner bypass classes. See the methodology and limitations page.
Sources
- Repository: https://clawhub.ai/skills/update-plus
- Raw scan result: update-plus-scan.json
- Badge for your README:
 - Request a re-scan