Back to skill

Security audit

Linux Patcher

Security checks across malware telemetry and agentic risk

Overview

The skill has a legitimate server-patching purpose, but it can make broad infrastructure changes and has unsafe credential, sudo, and command-handling patterns users should review carefully.

Install only if you are prepared to review and harden the scripts first. Use a dedicated low-privilege PatchMon account, verified HTTPS, tightly scoped sudo or root-owned wrapper scripts, explicit host allowlists, dry-run by default, and manual confirmation before Docker restarts, pruning, or fleet-wide patching.

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
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (29)

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill clearly instructs the agent to execute shell-based maintenance actions over SSH, including package upgrades and Docker restarts, yet no explicit permissions are declared. That mismatch weakens policy enforcement and user visibility, increasing the chance that a high-impact maintenance skill can run without appropriately scoped approval.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
The guide characterizes the sudoers configuration as 'minimal permissions' for patching, but it grants package-removal actions and broad Docker subcommands, including wildcarded image pulls and compose operations that can materially change deployed workloads. In a patching skill, this mismatch increases the chance that operators over-trust the privilege scope and deploy broader passwordless sudo than intended.

Context-Inappropriate Capability

Medium
Confidence
97% confidence
Finding
The script sources a temporary config file generated by another script, which means any shell code placed into that file will execute locally with the privileges of this patching process. Because PatchMon output is treated as trusted and then executed via `source`, a compromised PatchMon integration, malicious host metadata, or output-injection bug could lead to arbitrary code execution on the orchestrator, not just host-list parsing.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The contribution guide tells testers to run patching scripts against a host, including a non-dry-run host patch command, without clearly warning that these actions may change system state, install updates, restart services, or affect availability. In a skill specifically designed to patch remote Linux hosts, this omission increases the chance that contributors execute impactful commands on real systems without appropriate staging, backups, or authorization.

Missing User Warnings

Low
Confidence
82% confidence
Finding
The development setup section includes remote host detection and patching-related commands but does not warn contributors about privacy, authorization, or operational impact when targeting a host over SSH. Although some examples use dry-run, the surrounding guidance still normalizes execution against `user@testhost` without instructing users to use controlled environments or avoid production systems.

Vague Triggers

Medium
Confidence
90% confidence
Finding
The README advertises a very broad chat trigger pattern for a high-impact skill that performs package upgrades and Docker updates across servers. Ambiguous phrases like updating 'my servers' can cause accidental invocation or unintended scope selection, especially in conversational contexts where the user has not explicitly confirmed target hosts, environment, or whether Docker should be touched.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The usage examples rely on natural-language commands such as 'Update my servers' and 'What servers need patching?' without defining authentication, host scope, or approval boundaries. In an agentic system, this increases the chance of misinterpretation, overbroad actions, or patching the wrong hosts based on auto-detection from PatchMon.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The troubleshooting section instructs users to display the credentials file contents directly with `cat ~/.patchmon-credentials.conf` and includes a manual auth example containing plaintext credentials. This can expose secrets to shell history, terminal recording, screen sharing, logs, or nearby observers during support workflows.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The description says to use this skill whenever the user asks to 'update, patch, or upgrade Linux servers,' which is broad enough to match common conversational phrasing without confirming target hosts, maintenance scope, or whether Docker restarts are acceptable. In this context, accidental invocation can trigger privileged infrastructure changes across multiple hosts.

Vague Triggers

Medium
Confidence
96% confidence
Finding
The example chat triggers include short everyday phrases like 'Update my servers' and 'Patch all hosts that need updates,' which can map normal conversation directly to destructive maintenance actions. Because the skill defaults to automatic host detection and can update Docker containers, these broad triggers materially increase the chance of unintended execution.

Vague Triggers

Medium
Confidence
98% confidence
Finding
This section explicitly instructs users that natural-language requests like 'Update my servers' will automatically query PatchMon, patch hosts, and by default pull images and recreate containers. That combination of broad trigger phrases plus automated privileged actions across infrastructure makes accidental or ambiguous invocation especially dangerous.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The workflow explicitly performs disruptive operations such as package upgrades, docker system prune, image pulls, and container recreation, but the document does not require a clear user-facing warning about downtime, restarts, or irreversible cleanup effects. In an agent skill, omission of these warnings increases the risk that users trigger production-impacting maintenance without informed consent.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
The PatchMon flow describes loading credentials from a local file and transmitting them to an API endpoint, but does not mention secure storage, least-privilege credentials, TLS validation, redaction, or user warnings about secret handling. In an automation skill that may run broadly across hosts, undocumented credential handling can lead to accidental exposure or unsafe operator assumptions.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The document instructs users to run a remote script directly with `curl ... | sudo bash`, which executes network-fetched code as root without any verification, review, pinning, or integrity check. If the upstream repository, transport path, DNS, or account serving the script is compromised, an attacker can achieve immediate privileged code execution on every host where this command is used.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The script performs `docker system prune -af` on the remote host without any explicit confirmation gate, scope limitation, or preflight summary. This can irreversibly remove stopped containers, unused networks, dangling images, and build cache during a routine patch run, creating availability risk and accidental data or rollback loss if operators did not intend destructive cleanup.

Missing User Warnings

High
Confidence
98% confidence
Finding
The script directly sources a user-supplied configuration file with `source "$CONFIG_FILE"`, which executes any shell code present in that file in the script's process. Because this skill is designed for patching multiple Linux hosts, an attacker who can influence the config file can achieve arbitrary code execution locally before any host validation or patching logic runs, making the operational context especially sensitive.

Missing User Warnings

Medium
Confidence
99% confidence
Finding
The script sends PatchMon credentials in a network request while explicitly disabling TLS certificate verification with curl -k. This makes the login vulnerable to man-in-the-middle interception or spoofing, allowing attackers on the network path to capture credentials and issue authenticated requests as the PatchMon user.

External Transmission

Medium
Category
Data Exfiltration
Content
# Authenticate with PatchMon
echo "Authenticating with PatchMon..."
TOKEN=$(curl -s -k -X POST "$PATCHMON_URL/api/auth/login" \
    -H "Content-Type: application/json" \
    -d "{\"username\":\"$PATCHMON_USERNAME\",\"password\":\"$PATCHMON_PASSWORD\"}" \
    | jq -r '.token // .accessToken // empty')
Confidence
90% confidence
Finding
curl -s -k -X POST "$PATCHMON_URL/api/auth/login" \ -H "Content-Type: application/json" \ -d

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
### Step 3: Configure Passwordless Sudo (CRITICAL SECURITY STEP)

**⚠️ Security Warning:**
Passwordless sudo is required for automation but poses security risks. We configure it with **minimal permissions** - only for specific commands needed for patching.

**On each target host, run as root or with sudo:**
Confidence
96% confidence
Finding
sudo

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
}

echo "Step 3/5: Pulling updated Docker images..."
ssh "$HOST" "cd $DOCKER_PATH && sudo docker images --format '{{.Repository}}:{{.Tag}}' | grep -v '<none>' | xargs -r -L1 sudo docker pull" || {
    echo "WARNING: Some image pulls failed (continuing anyway)"
}
Confidence
95% confidence
Finding
sudo

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
}

echo "Step 3/5: Pulling updated Docker images..."
ssh "$HOST" "cd $DOCKER_PATH && sudo docker images --format '{{.Repository}}:{{.Tag}}' | grep -v '<none>' | xargs -r -L1 sudo docker pull" || {
    echo "WARNING: Some image pulls failed (continuing anyway)"
}
Confidence
95% confidence
Finding
sudo

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
}

echo "Step 4/5: Pulling compose images..."
ssh "$HOST" "cd $DOCKER_PATH && sudo docker compose pull" || {
    echo "ERROR: Docker compose pull failed on $HOST"
    exit 1
}
Confidence
95% confidence
Finding
sudo

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
}

echo "Step 5/5: Recreating containers..."
ssh "$HOST" "cd $DOCKER_PATH && sudo docker compose up -d" || {
    echo "ERROR: Docker compose up failed on $HOST"
    exit 1
}
Confidence
95% confidence
Finding
sudo

Chaining Abuse

High
Category
Tool Misuse
Content
}

echo "Step 3/5: Pulling updated Docker images..."
ssh "$HOST" "cd $DOCKER_PATH && sudo docker images --format '{{.Repository}}:{{.Tag}}' | grep -v '<none>' | xargs -r -L1 sudo docker pull" || {
    echo "WARNING: Some image pulls failed (continuing anyway)"
}
Confidence
88% confidence
Finding
&& sudo

Chaining Abuse

High
Category
Tool Misuse
Content
}

echo "Step 4/5: Pulling compose images..."
ssh "$HOST" "cd $DOCKER_PATH && sudo docker compose pull" || {
    echo "ERROR: Docker compose pull failed on $HOST"
    exit 1
}
Confidence
95% confidence
Finding
&& sudo

VirusTotal

60/60 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.