Back to skill

Security audit

ProcessGuard — Critical Process Monitor & Auto-Restart

Security checks for vulnerabilities and agentic risk

Overview

ProcessGuard is a coherent process-monitoring skill, but it needs human review because it can run local commands and its optional dashboard may expose operational status beyond localhost despite being described as local.

Install only if you are comfortable running a local process monitor that can execute configured commands. Use commandAllowlist, keep configs trusted and static, run it as a low-privilege service account, avoid allowAnyCommand in production, and expose the dashboard only on loopback or behind authentication/firewall controls. Pin and review pidusage before installing it.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
src/process-guard.js:382
Finding

Unauthenticated Dashboard Binds to All Network Interfaces

Content
View full analysis
{ if (req.url === '/health') { res.writeHead(200, { 'Content-Type': 'text/plain' }); return res.end('OK'); } if (req.url === '/status' || req.url === '/') { res.writeHead(200, { 'Content-Type': 'application/json' }); return res.end(JSON.stringify(this.status(), null, 2)); } res.writeHead(404); res.end('Not found'); }); this._httpServer.listen(port, () => { this._log(`Dashboard: http://localhost:${port}/status`); }); } ``` ### Technical Analysis The server calls `listen(port)` without specifying a host address. In Node.js, this commonly listens on the unspecified address and may accept connections through every available network interface. This conflicts with the log message and documentation, which represent the dashboard as a localhost endpoint. Neither `/status` nor `/health` implements authentication, authorization, or client-origin restrictions. Consequently, enabling `dashboardPort` on a network-accessible host can expose the service to unauthenticated remote clients. The `/status` response includes monitored process names, health stages, uptime percentages, restart counts, last-up timestamps, CPU and memory usage, alert counts, and recent restart history. ### Attack Path 1. An operator enables `dashboardPort`, expecting the endpoint to be local because it is documented and logged as `localhost`. 2. ProcessGuard invokes `listen(port)` without a loopback bind address. 3. The operating system exposes the port through one or more external interfaces, subject to firewall configuration. 4. An attacker with network access scans for or otherwise discovers the configured port. 5. The attacker se ...[truncated 790 chars]
Remediation
View remediation
{ this._log(`Dashboard: http://${host}:${port}/status`); }); ``` 2. Add an explicit `dashboardHost` configuration option. Require deliberate configuration before allowing a wildcard or non-loopback address. 3. Require authentication for remotely exposed dashboards, such as a securely generated bearer token validated with timing-safe comparison. 4. When a non-loopback address is selected, emit a prominent warning that the endpoint exposes operational information. 5. Recommend firewall restrictions or an authenticated TLS reverse proxy for remote access. 6. Minimize the information returned by `/status`, especially where process names or operational history are not required. ]]>

T08 · Insecure Dependencies

Note
Location
README.md:44
Finding

Optional Dependency Installation Is Not Version-Pinned

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (11)

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 · README.md (reported line 204)May include surrounding context.

md
},
    {
      name: 'bad-config',
      restart: 'rm -rf /'        // ❌ throws at construction — 'rm' not in allowlist
    }
  ]
});

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 · README.md (reported line 229)May include surrounding context.

md
},
    {
      name: 'bad-config',
      restart: 'rm -rf /'        // ❌ throws at construction — 'rm' not in allowlist
    }
  ]
});

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% 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 · README.md (reported line 204)May include surrounding context.

md
},
    {
      name: 'bad-config',
      restart: 'rm -rf /'        // ❌ throws at construction — 'rm' not in allowlist
    }
  ]
});

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
85% 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 · README.md (reported line 229)May include surrounding context.

; & | ` $ < > \n

text

Example: `restart: 'node server.js && rm -rf /'` → **throws at construction**, regardless of `allowAnyCommand`.

Validation runs at construction — misconfigured commands throw before any monitoring begins.

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 · README.md (reported line 229)May include surrounding context.

; & | ` $ < > \n

text

Example: `restart: 'node server.js && rm -rf /'` → **throws at construction**, regardless of `allowAnyCommand`.

Validation runs at construction — misconfigured commands throw before any monitoring begins.

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · README.md (reported line 229)May include surrounding context.

; & | ` $ < > \n

text

Example: `restart: 'node server.js && rm -rf /'` → **throws at construction**, regardless of `allowAnyCommand`.

Validation runs at construction — misconfigured commands throw before any monitoring begins.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The README documents execution of restart and check commands via child_process.exec/execSync, which are shell-invoking APIs. Even if a small set of shell metacharacters is blocked, allowAnyCommand: true still permits arbitrary executables and arguments chosen by the operator, so the documentation overstates safety and may cause users to trust a fragile filter as complete command-injection protection.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill advertises shell-command health checks and restart commands but provides no explicit warning that these features execute local commands. In a skill context, users may copy example configurations or enable shell-based checks without appreciating that misconfiguration, untrusted inputs, or unsafe command strings could lead to arbitrary command execution under the monitor's privileges.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The skill exposes outbound alerting and an HTTP status dashboard but does not warn about data exposure, unauthorized access, or integrity risks. Alert webhooks can leak operational metadata to third parties, and an exposed dashboard may reveal process names, health state, ports, or environment details useful to attackers if bound beyond localhost or deployed without authentication.

Content

No source excerpt is available for this finding.

Unrestricted Tool Access

Medium
Category
Excessive Agency
Confidence
84% confidence
Finding

This component is explicitly designed to execute configured restart and health-check commands via spawn/spawnSync. While it blocks obvious shell metacharacters and can enforce an allowlist, it still permits arbitrary executable invocation when allowAnyCommand is enabled, and even with allowlists the executed binaries inherit the monitor's privileges. In a monitoring skill, that means a malicious or compromised configuration can turn the tool into a privileged command runner, making the finding a real security risk rather than a false positive.

Content

Scanner excerpt · src/process-guard.js (reported line 93)May include surrounding context.

js
// ─── Config Validation ────────────────────────────────────────────────────

  _validateConfig() {
    // Require explicit security posture - no silent defaults that execute arbitrary commands
    const hasRestartCommands = this.processes.some(p => p.restart);
    if (hasRestartCommands && !this.commandAllowlist && !this.allowAnyCommand) {
      throw new Error(

Scope Creep

Low
Category
Excessive Agency
Confidence
70% confidence
Finding

Skill's behavior or capabilities extend beyond its stated purpose. Scope creep allows an agent to perform actions unrelated to its documented functionality, increasing the attack surface.

Content

Scanner excerpt · README.md (reported line 346)May include surrounding context.

md
**USE AT YOUR OWN RISK.**

- The author(s) are NOT liable for any damages, losses, or consequences arising from
  the use or misuse of this software — including but not limited to financial loss,
  data loss, security breaches, business interruption, or any indirect/consequential damages.
- This software does NOT constitute financial, legal, trading, or professional advice.
- Users are solely responsible for evaluating whether this software is suitable for

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
src/process-guard.js:203