Back to skill

Security audit

sys-updater

Security checks across malware telemetry and agentic risk

Overview

This is a plausible maintenance skill, but it can alter system packages and OpenClaw skills in ways that its own safety documentation understates or contradicts.

Install only after reviewing the automation policy. Use a dedicated low-privilege account, keep sudoers restricted to exact documented commands, and inspect or disable the apt install/autoremove paths and report-time skill update. Do not treat report_9am or apt_maint.py --dry-run as fully side-effect-free, and decide explicitly whether unattended OpenClaw skill updates are acceptable on the host.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
Findings (23)

subprocess module call

Medium
Category
Dangerous Code Execution
Content
# Skills section
    try:
        result = subprocess.run(
            ["clawhub", "list"], capture_output=True, text=True, timeout=30
        )
        if result.returncode == 0 and result.stdout:
Confidence
78% confidence
Finding
result = subprocess.run( ["clawhub", "list"], capture_output=True, text=True, timeout=30 )

subprocess module call

Medium
Category
Dangerous Code Execution
Content
pkg_maint_path = Path(__file__).parent / "pkg_maint.py"
        if pkg_maint_path.exists():
            log.info("Running: pkg_maint.py check for npm/brew")
            cp_check = subprocess.run(
                ["python3", str(pkg_maint_path), "check"],
                capture_output=True, text=True, timeout=180
            )
Confidence
88% confidence
Finding
cp_check = subprocess.run( ["python3", str(pkg_maint_path), "check"], capture_output=True, text=True, timeout=180 )

subprocess module call

Medium
Category
Dangerous Code Execution
Content
log.warning("pkg_maint.py check: rc=%d, err=%s", cp_check.returncode, cp_check.stderr[:200])

            log.info("Running: pkg_maint.py upgrade for npm/brew planned packages")
            cp_upgrade = subprocess.run(
                ["python3", str(pkg_maint_path), "upgrade"],
                capture_output=True, text=True, timeout=600
            )
Confidence
88% confidence
Finding
cp_upgrade = subprocess.run( ["python3", str(pkg_maint_path), "upgrade"], capture_output=True, text=True, timeout=600 )

subprocess module call

Medium
Category
Dangerous Code Execution
Content
skills_updated = []
            skills_with_changes = []
            try:
                update_result = subprocess.run(
                    ["clawhub", "update", "--all", "--no-input"],
                    capture_output=True, text=True, timeout=60
                )
Confidence
90% confidence
Finding
update_result = subprocess.run( ["clawhub", "update", "--all", "--no-input"], capture_output=True, text=True, timeout=60 )

Intent-Code Divergence

Medium
Confidence
88% confidence
Finding
The documentation states that secrets are not logged, but it also explicitly says full unhandled exception tracebacks are logged. Tracebacks can include exception messages, local variables, file paths, configuration values, or environment-derived secrets, so this creates a realistic risk of sensitive data disclosure through logs.

Intent-Code Divergence

Medium
Confidence
97% confidence
Finding
The help text promises dry-run mode won't execute commands, but the implementation only suppresses sudo-prefixed commands; non-sudo subprocesses like pkg_maint.py, clawhub list, and clawhub update still run. This mismatch can cause operators to trigger real state changes when they believe execution is safe.

Intent-Code Divergence

High
Confidence
98% confidence
Finding
The module advertises itself as a conservative apt maintenance helper, but it also runs npm/pnpm/brew upgrade logic and even skill updates. This scope mismatch is dangerous because operators may grant trust, scheduling, or privileges appropriate for apt-only maintenance while the script performs much broader software changes.

Intent-Code Divergence

Medium
Confidence
94% confidence
Finding
The module advertises a conservative track-review-upgrade workflow, but skills are explicitly exempted and updated immediately. That mismatch is security-relevant because users or operators may rely on the documented delay/review policy while the code silently performs immediate code updates for agent skills, increasing supply-chain risk.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The skill advertises Telegram reporting but does not prominently warn that package inventory, host maintenance status, and installed-update details may be transmitted off-host to a third-party messaging platform. That can expose sensitive operational metadata useful for profiling the system or its patch posture if the chat, bot token, or recipient configuration is mismanaged.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
Automatic security updates change system state without interactive review, and the description does not prominently warn users that unattended changes will occur. While common in administration tooling, unattended package changes can still cause service disruption, compatibility issues, or unexpected reboots/behavior on production systems.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The documentation instructs users to delete the tracking state file and regenerate it without warning that this resets review state and may discard package-tracking history. In an operations context, this can cause loss of auditability and lead users to overlook previously tracked or blocked package decisions, increasing the chance of unsafe maintenance actions.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The file provides clear instructions for temporarily and permanently disabling the system updater but does not warn that doing so may suspend security patching and leave the system exposed to known vulnerabilities. Because this is operational documentation for update management, readers are likely to follow these steps directly, making the omission materially risky.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The script automatically updates OpenClaw skills during check mode without user confirmation, despite skills being executable agent extensions and thus a code supply-chain boundary. In this context, immediate unattended updates are more dangerous than ordinary package refreshes because a compromised or malicious skill update can alter agent behavior or execute arbitrary logic on the host.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
meta.get("reviewedAt")
            and not meta.get("planned")
            and not meta.get("blocked")
            and ("review ok" in note or "auto-approved" in note)
        ):
            meta["planned"] = True
            recovered += 1
Confidence
85% confidence
Finding
auto-approve

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
if result == ReviewResult.OK:
        updated["planned"] = True
        updated["blocked"] = False
        updated["note"] = f"Auto-approved: {reason}"
        logger.info(f"✅ {manager}/{name}: {reason}")
    elif result == ReviewResult.BLOCKED:
        updated["blocked"] = True
Confidence
81% confidence
Finding
Auto-approve

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
- Python 3.10+ (stdlib only, no dependencies)
- Ubuntu with `unattended-upgrades` installed
- Sudo NOPASSWD for apt-get and unattended-upgrade (see [docs/sudoers.md](docs/sudoers.md))

## Directory Structure
Confidence
87% confidence
Finding
Sudo

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
- Node.js + npm (for npm packages)
- Homebrew (for brew packages)
- OpenClaw with clawhub CLI
- sudo access for specific apt commands (see below)

## Sudoers Configuration
Confidence
80% confidence
Finding
sudo

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
# Sudoers Setup

sys-updater requires passwordless sudo for specific apt commands.

## Required Commands
Confidence
95% confidence
Finding
sudo

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
ap.add_argument(
        "--dry-run", "-n",
        action="store_true",
        help="Don't execute sudo commands, just log what would happen",
    )
    ap.add_argument(
        "--verbose", "-v",
Confidence
95% confidence
Finding
sudo

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
log = _setup_logging(verbose=True)

    if _dry_run:
        log.info("DRY-RUN mode enabled: sudo commands will be skipped")

    exit_code = 0
    try:
Confidence
94% confidence
Finding
sudo

Self-Modification

High
Category
Rogue Agent
Content
else:
                log.debug("Skill %s already up to date", slug)
        else:
            log.error("Failed to update skill %s: %s", slug, stderr[:200])
            result["failed"].append({"name": slug, "error": stderr[:200]})
    
    return result
Confidence
98% confidence
Finding
update skill

Self-Modification

High
Category
Rogue Agent
Content
blocked_count = _count_flag(tracked_by_manager, "blocked")
    log.info("Summary: planned=%d, blocked=%d", planned_count, blocked_count)

    # Update skills immediately (no quarantine for skills)
    log.info("Updating OpenClaw skills...")
    skills_result = check_skills()
    if skills_result["installed"]:
Confidence
99% confidence
Finding
Update skill

Self-Modification

High
Category
Rogue Agent
Content
formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
Modes:
  check    - Update tracked state + auto-update skills (run daily in run_6am)
  review   - Show packages due for bug review (after 2 days)
  upgrade  - Apply planned npm/pnpm/brew upgrades
  skills   - Update OpenClaw skills immediately (no quarantine)
Confidence
92% confidence
Finding
update skill

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.