Back to skill

Security audit

Dashboard

Security checks for vulnerabilities and agentic risk

Overview

This dashboard exposes sensitive local OpenClaw and host controls through an unauthenticated network service and uses high-risk installers.

Review carefully before installing. Do not run the one-line installers as written; prefer a pinned, reviewed local install. If testing, bind only to localhost, add authentication, remove token display, disable wildcard CORS, avoid passwordless sudo, and make service persistence and ZeroTier installation explicit opt-in steps.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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
Findings (5)

T03 · Remote Payload Retrieval and Execution

Error
Location
README.md:18
Finding

Unpinned Remote Scripts Are Executed with Elevated Privileges

Content
View full analysis
/dev/null; then echo "Installing ZeroTier..." curl -s https://install.zerotier.com | sudo bash fi ``` ```bash # scripts/install-macos.sh:14-18 if ! command -v brew &> /dev/null; then echo "Installing Homebrew..." /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" fi ``` ### Technical Analysis The documented installation procedure pipes content from mutable remote URLs directly into a shell. The Linux command executes the project installer under `sudo`, while the installer itself downloads and executes additional NodeSource and ZeroTier scripts. The macOS installer similarly executes the current Homebrew installation script. None of these downloads is pinned to an immutable commit or release, and no checksum or cryptographic signature is verified. Consequently, the code ultimately executed can change after this Skill has been reviewed. HTTPS protects transport ...[truncated 1508 chars]
Remediation
View remediation

T06 · System Persistence

Error
Location
scripts/install-linux.sh:66
Finding

Installers Establish Automatic Cross-Session Persistence

Content
View full analysis
/dev/null < /dev/null; then echo "Installing ZeroTier..." curl -s https://install.zerotier.com | sudo bash fi # Enable and start service sudo systemctl daemon-reload sudo systemctl enable glitch-dashboard sudo systemctl start glitch-dashboard ``` ```bash # scripts/install-macos.sh:43-69 cat > "$PLIST_PATH" < Label com.glitch.dashboard ProgramArguments /usr/local/bin/node $INSTALL_DIR/main.js WorkingDirectory $INSTALL_DIR RunAtLoad KeepAlive StandardOutPath $HOME/.glitch-dashboard/output.log StandardErrorPath $HOME/.glitch-dashboard/error.log EOF ``` ```bash # scripts/install-macos.sh:82-84 # Load service launchctl load "$PLIST_PATH" ``` ### Technical Analysis The Linux installer writes a system-wide systemd unit, enables it at boot, and configures unconditional restart behavior. The macOS installer creates a LaunchAgent with both `RunAtLoa ...[truncated 1538 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
main.js:274
Finding

Unauthenticated Dashboard Exposes Sensitive Host and OpenClaw Information

Content
View full analysis
{ exec(cmd,{timeout:t,shell:true,windowsHide:isWin},(e,so,se)=>r({out:so?.trim()||'',err:se?.trim()||'',code:e?.code||0})); }); } function getTokens(){ try{ if(!fs.existsSync(CONFIG_FILE))return[]; const cfg=JSON.parse(fs.readFileSync(CONFIG_FILE,'utf8')); const tokens=[]; const providers=cfg.models?.providers||{}; for(const[p,data]of Object.entries(providers)){ if(data.apiKey&&data.apiKey!=='minimax-oauth'){ const key=data.apiKey.length>12?data.apiKey.substring(0,8)+'...'+data.apiKey.substring(data.apiKey.length-4):data.apiKey; tokens.push({name:p.charAt(0).toUpperCase()+p.slice(1),key,enabled:true,provider:p,baseUrl:data.baseUrl}); } } return tokens; }catch(e){return[];} } ``` ```js // main.js:35-62 async function getLogs(){ const logs=[]; const journal=await execCmd('journalctl --user-unit openclaw-gateway --no-pager -n 30 2>/dev/null'); if(journal.out){ const lines=journal.out.split('\n').slice(0,15); for(const line of lines){ if(line.trim()&&!line.includes('journal')){ const ts=line.match(/^(\w+\s+\d+\s+[\d:]+)/)?.[1]||new Date().toISOString(); const msg=line.replace(/^[^:]+:/,'').trim(); if(msg)logs.push({t:ts,s:'gateway',m:msg.substring(0,100)}); } } } const syslog=await execCmd('tail -30 /var/log/syslog 2>/dev/null || tail -30 /var/log/messages 2>/dev/null'); if(syslog.out){ const lines=syslog.out.split('\n').slice(0,10 ...[truncated 3656 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
main.js:221
Finding

Stored Cross-Site Scripting Through Task and Log Rendering

Content
View full analysis
`
${t.t}
✓✎✕
[${t.st}]Priority: ${t.pr}
${t.sub?.length?`
${t.sub.map(s=>`
${s.c}
`).join('')}
`:''}
`).join(''):'
No tasks. Click "+ Add Task" to create one.
'} ``` ```js // main.js:245 ${logs.map(l=>`
${l.t.substring(0,16)}[${l.s}]${l.m}
`).join('')} ``` ```js // main.js:267-268 function saveEdit(){const id=document.getElementById('editId').value;const content=document.getElementById('editContent').value;const priority=parseInt(document.getElementById('editPriority').value);fetch('/api/task',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({action:id?'update':'add',id:id?parseInt(id):null,content,priority})}).then(()=>location.reload());} function subtask(taskId,idx){fetch('/api/task',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({action:'subtask',taskId,idx})}).then(()=>location.reload());} ``` ```js // main.js:281-287 con ...[truncated 2502 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
main.js:274
Finding

Unauthenticated APIs Permit Task Tampering and ZeroTier Disconnection

Content
View full analysis
{ const u=new URL(req.url,'http://localhost:'+PORT); res.setHeader('Access-Control-Allow-Origin','*'); res.setHeader('Access-Control-Allow-Methods','GET,POST,OPTIONS'); res.setHeader('Access-Control-Allow-Headers','Content-Type'); if(req.method==='OPTIONS'){res.end();return;} if(u.pathname==='/api/task'){ let body='';req.on('data',c=>body+=c);req.on('end',() => { try{ const d=JSON.parse(body); const tasks=getTasks(); if(d.action==='add'){const newTask={id:Date.now(),t:d.content,st:'pending',pr:d.priority||1,sub:[]};tasks.push(newTask);saveTasks(tasks);} else if(d.action==='complete'){const idx=tasks.findIndex(t=>t.id==d.id);if(idx>-1){tasks[idx].st='completed';saveTasks(tasks);}} else if(d.action==='delete'){const idx=tasks.findIndex(t=>t.id==d.id);if(idx>-1){tasks.splice(idx,1);saveTasks(tasks);}} else if(d.action==='update'){const idx=tasks.findIndex(t=>t.id==d.id);if(idx>-1){tasks[idx].t=d.content;tasks[idx].pr=d.priority;saveTasks(tasks);}} else if(d.action==='subtask'){const idx=tasks.findIndex(t=>t.id==d.taskId);if(idx>-1&&tasks[idx].sub&&tasks[idx].sub[d.idx]){tasks[idx].sub[d.idx].s=!tasks[idx].sub[d.idx].s;saveTasks(tasks);}} res.end('ok'); }catch(e){res.end('error:'+e.message);} });return; } if(u.pathname==='/api/network'){ let body='';req.on('data',c=>body+=c);req.on('end',async() => { try{ const d=JSON.parse(body); if(d.leave){ await execCmd('sudo zerotier-cli leave af415e486fc5fca0'); res.end('left'); }else if(d.gateway||d.dns){ const cfg=path.join(DATA_DIR,'network.json'); const current=fs.existsSync( ...[truncated 2404 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (77)

Chaining Abuse

High
Category
Tool Misuse
Confidence
97% confidence
Finding

The curl ... | sudo bash chain combines remote retrieval, shell interpretation, and immediate root execution in a single step. This dramatically increases risk because there is no verification or review boundary; any attacker who can alter the fetched content gains instant privileged code execution.

Content

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

Linux (Ubuntu/Debian/CentOS/Arch)

bash
curl -fsSL https://raw.githubusercontent.com/chris6970barbarian-hue/glitch-skills/main/dashboard/scripts/install-linux.sh | sudo bash

macOS

Chaining Abuse

High
Category
Tool Misuse
Confidence
93% confidence
Finding

The curl ... | bash pattern is dangerous because it executes whatever the remote server returns, including malicious or tampered content. While it may run without elevated privileges, it still enables arbitrary code execution in the user's session and can be used for persistence or credential theft.

Content

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

macOS

bash
curl -fsSL https://raw.githubusercontent.com/chris6970barbarian-hue/glitch-skills/main/dashboard/scripts/install-macos.sh | bash

Windows (PowerShell Admin)

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The dashboard reads API credential material from a local OpenClaw config and exposes provider names, base URLs, and partial key values in an HTTP UI. Even partial secret disclosure materially aids fingerprinting, token correlation, shoulder-surfing, screenshots, and follow-on attacks, and this capability is not necessary for a generic dashboard to function.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code invokes privileged ZeroTier commands using sudo to gather status and later supports privileged control operations. Running elevated commands from application logic significantly increases blast radius and, without disclosure or safeguards, creates unsafe expectations around privilege use.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The network API allows HTTP-triggered administrative ZeroTier actions, including leaving a network, and persists network configuration changes locally. Because the server binds to 0.0.0.0 and has no authentication or CSRF protection, anyone who can reach the service may change connectivity or disrupt remote access.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The installer executes remote content from NodeSource via curl piped to bash, allowing arbitrary code from the fetched endpoint to run immediately. Even if commonly seen, this is dangerous because it bypasses package integrity review at the script level and creates a supply-chain compromise path during installation.

Content

No source excerpt is available for this finding.

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 · scripts/install-linux.sh (reported line 40)May include surrounding context.

sh
yum install -y nodejs
            ;;
        arch|manjaro)
            pacman -Sy --noconfirm nodejs npm
            ;;
        *)
            echo "Please install Node.js 18+ manually"

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

Installing ZeroTier is not necessary for the stated purpose of deploying a local dashboard, yet it grants additional network-management capability via a remotely fetched privileged script. In the context of an installer, this mismatch is dangerous because users may unknowingly authorize software that changes host networking behavior and could facilitate remote administration or persistence.

Content

No source excerpt is available for this finding.

External Script Fetching

High
Category
Supply Chain
Confidence
99% confidence
Finding

The installer fetches a remote ZeroTier install script and executes it with root privileges in a single command. This is especially dangerous because it combines hidden functionality expansion with unaudited privileged remote code execution, giving an attacker full control if the source is tampered with.

Content

Scanner excerpt · scripts/install-linux.sh (reported line 96)May include surrounding context.

sh
# Install ZeroTier if not present
if ! command -v zerotier-cli &> /dev/null; then
    echo "Installing ZeroTier..."
    curl -s https://install.zerotier.com | sudo bash
fi

# Enable and start service

Chaining Abuse

High
Category
Tool Misuse
Confidence
99% confidence
Finding

This command chains network retrieval directly into privileged shell execution, eliminating opportunities for inspection, integrity verification, or least-privilege handling. In the context of an installer that unexpectedly adds networking software, this is a severe pattern because a single compromised upstream response yields immediate root-level compromise.

Content

Scanner excerpt · scripts/install-linux.sh (reported line 96)May include surrounding context.

sh
# Install ZeroTier if not present
if ! command -v zerotier-cli &> /dev/null; then
    echo "Installing ZeroTier..."
    curl -s https://install.zerotier.com | sudo bash
fi

# Enable and start service

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script executes a remote Homebrew bootstrap script directly via curl piped to bash, which grants arbitrary code execution from the network without local review or integrity verification. If the remote content, transport, or upstream account is compromised, the installer will execute attacker-controlled code on the host.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README instructs users to download and immediately execute remote install scripts, including one piped directly into a privileged shell. This is dangerous because any compromise of the GitHub account, repository, branch, or network path could turn installation into arbitrary code execution without giving users a chance to inspect the script first.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
94% confidence
Finding

Using sudo bash on a script fetched from the internet grants full root privileges to unreviewed remote content. If that script is modified maliciously or intercepted, it can install backdoors, steal secrets, or permanently alter the system with complete administrative access.

Content

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

Linux (Ubuntu/Debian/CentOS/Arch)

bash
curl -fsSL https://raw.githubusercontent.com/chris6970barbarian-hue/glitch-skills/main/dashboard/scripts/install-linux.sh | sudo bash

macOS

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

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

Linux

bash
# Check service status
sudo systemctl status glitch-dashboard

# View logs
sudo journalctl -u glitch-dashboard -f

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

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

Linux

bash
# Check service status
sudo systemctl status glitch-dashboard

# View logs
sudo journalctl -u glitch-dashboard -f

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

Restart

launchctl unload ~/Library/LaunchAgents/com.glitch.dashboard.plist launchctl load ~/Library/LaunchAgents/com.glitch.dashboard.plist

text

### Windows

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill explicitly advertises queue-mutating actions such as completing the current task and clearing the queue, but it does not warn users that these operations are destructive and can remove or alter queued work. In an agent or operations setting, undocumented destructive behavior increases the chance of accidental task loss or misuse by operators or downstream automation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The API documentation exposes POST endpoints for completing tasks and clearing the queue without any user-facing warning about their destructive effects or mention of authentication/authorization requirements. In a web dashboard context, this makes the capability more dangerous because it normalizes sensitive state-changing endpoints while omitting the operational risk of task deletion or premature completion.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

Reading local token data and presenting it in the UI without clear disclosure or consent is a sensitive data handling issue. Even if only truncated values are shown, users are not informed that credential files will be accessed and surfaced over HTTP.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The code collects journal and syslog data via shell commands and renders selected entries in a web dashboard. Logs frequently contain usernames, hostnames, command lines, service state, error details, and sometimes secrets, so exposing them through an unauthenticated interface broadens access to sensitive local telemetry.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill accesses local journal/syslog data without any user-facing warning, which creates an unnecessary privacy and security exposure. Users are not informed that system and service logs will be read and displayed in the browser.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
94% confidence
Finding

Using sudo in a web-exposed dashboard to execute ZeroTier commands introduces privilege escalation risk and expands the consequences of any surrounding logic flaw or unauthorized access. In this skill, the danger is amplified because the service listens on all interfaces and lacks authentication.

Content

Scanner excerpt · main.js (reported line 105)May include surrounding context.

js
return{cpu:{use:u.toFixed(1),n:cpus.length},mem:{pct:((tm-fm)/tm*100).toFixed(1),used:mb(tm-fm),tot:mb(tm)},up:os.uptime(),host:os.hostname(),plat:PLATFORM,arch:os.arch(),lanIp:net.lanIp,ztIp:net.ztIp};
    })(),
    (async()=>{
      const cmd=isWin?'"C:\\Program Files (x86)\\ZeroTier\\One\\zerotier-cli.exe"':isMac?'/usr/local/bin/zerotier-cli':'sudo zerotier-cli';
      const n=await execCmd(`${cmd} listnetworks`),i=await execCmd(`${cmd} info`);
      const m=n.out.match(/(\d+\.\d+\.\d+\.\d+)/),id=n.out.match(/([a-f0-9]{16})/);
      return{on:!n.err&&n.out.includes('OK'),addr:i.out.match(/([a-f0-9]{10})/)?.[1]||'?',ip:m?.[1]||'Not connected',net:id?.[1]||null}

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
99% confidence
Finding

The endpoint can trigger 'sudo zerotier-cli leave ...' from an HTTP request, enabling remote disruption of network connectivity if the service is reachable. This is a high-risk administrative action because it can cut off management access and affect system networking from an unauthenticated interface.

Content

Scanner excerpt · main.js (reported line 288)May include surrounding context.

js
try{
        const d=JSON.parse(body);
        if(d.leave){
          await execCmd('sudo zerotier-cli leave af415e486fc5fca0');
          res.end('left');
        }else if(d.gateway||d.dns){
          const cfg=path.join(DATA_DIR,'network.json');

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
65% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · scripts/install-linux.sh (reported line 40)May include surrounding context.

sh
yum install -y nodejs
            ;;
        arch|manjaro)
            pacman -Sy --noconfirm nodejs npm
            ;;
        *)
            echo "Please install Node.js 18+ manually"

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script is presented as a dashboard installer, but it also installs ZeroTier, a separate network-management/overlay networking component, without prior disclosure or user consent. Adding network connectivity software broadens the attack surface and can create unexpected remote access pathways, which is especially risky in an installer running privileged actions.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.env_credential_access

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
main.js:16

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
main.js:7