Back to skill

Security audit

AI Commander Dashboard

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent read-only dashboard, but it exposes sensitive email/session data with unsafe network defaults and mutable third-party browser code.

Review before installing. Use only on a trusted machine/network, set DASHBOARD_HOST=127.0.0.1 unless you deliberately need remote access, avoid sharing token URLs, and treat the dashboard as exposing the contents of recent inbound emails. The safer design would package frontend assets locally and use localhost or HTTPS/tunneling for any remote access.

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)

T08 · Insecure Dependencies

Warning
Location
assets/index.html:8
Finding

Mutable Third-Party JavaScript Can Access Dashboard Tokens and Sensitive Email Data

Content
View full analysis
``` ```javascript const urlToken = new URLSearchParams(window.location.search).get('token'); if (urlToken) { localStorage.setItem('dashboard-token', urlToken); window.history.replaceState({}, document.title, window.location.origin + window.location.pathname); } const token = localStorage.getItem('dashboard-token'); ``` ```javascript const eRes = await fetch('/api/emails', { headers: { 'X-Dashboard-Token': token } }); ``` ```javascript const sRes = await fetch('/api/session', { headers: { 'X-Dashboard-Token': token } }); ``` ### Technical Analysis The page executes a versionless JavaScript resource from `cdn.tailwindcss.com`. This script runs with the full privileges of the dashboard origin. It can therefore: - Read the dashboard token from the initial URL before it is removed. - Read the token retained in `localStorage`. - Intercept or modify `fetch` calls. - Make authenticated same-origin requests to `/api/emails` and `/api/session`. - Read email data already rendered into the DOM. - Transmit collected information to an external destination. Because the CDN script is fetched at runtime and is not pinned or protected with Subresource Integrity, its effective behavior can change after the Skill has been reviewed. A compromise of the CDN, its delivery chain, or the externally hosted script could consequently compromise the dashboard. The flagged requests at lines 85 and 113 are themselves necessary same-origin requests for the declared dashboard functionality. They do not directly exfiltrate information. The security issue is that the remote script shares their execution context and can access their authenticat ...[truncated 1271 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/server.js:7
Finding

Sensitive Dashboard Is Exposed over Plaintext HTTP on All Network Interfaces by Default

Content
View full analysis
{ const displayHost = host === '0.0.0.0' ? 'YOUR_IP' : host; console.log(`\n🏠 AI COMMANDER DASHBOARD READY`); console.log(`Access URL: http://${displayHost}:${port}/?token=${token}\n`); }); if (require.main === module) { const port = parseInt(process.env.PORT) || 19195; const host = process.env.DASHBOARD_HOST || '0.0.0.0'; const token = process.env.DASHBOARD_TOKEN || crypto.randomBytes(12).toString('hex'); startDashboard({ port, host, token }); } ``` ### Technical Analysis The server binds to `0.0.0.0` by default, making the dashboard reachable through every available network interface. It also serves the dashboard using ordinary HTTP and prints an HTTP URL containing the bearer token. This behavior exceeds the minimum network privileges required for a local companion dashboard. Authentication prevents unauthenticated API access, but it does not provide transport confidentiality. The token is initially placed in the URL and then sent through a custom request header. On an untrusted or shared network, an on-path observer may capture the token, email API responses, or both. The implementation also conflicts with the environment-variable table in `SKILL.md`, which states that the default `DASHBOARD_HOST` is `127.0.0.1`, although a later section documents `0.0.0.0`. This inconsistency could cause operators to unintenti ...[truncated 1534 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (7)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The dashboard is described as exposing inbound emails and browser session status over HTTP, yet the security section omits a clear warning about increased exposure when bound beyond localhost. In this skill context, the data is potentially sensitive, and users may rely on contradictory documentation around bind defaults, making accidental network exposure more plausible.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

This code exposes inbox contents through an HTTP endpoint and binds the server to a network host, but there is no inline comment, docstring, or user-facing warning explaining that user/system data will be transmitted over the network. Under the code-file criteria, network access that transmits potentially sensitive data should have some visible disclosure unless clearly documented as the skill's stated purpose.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
98% confidence
Finding

The environment-variable table says DASHBOARD_TOKEN is required, but later sections state the token is optional and that a fresh random token is generated automatically if it is not set. This is an active contradiction in the skill's documentation about a security-relevant startup behavior.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
94% confidence
Finding

One environment-variable table documents DASHBOARD_HOST defaulting to 127.0.0.1, while the later optional-variables table says the default is 0.0.0.0. This is a direct contradiction about network exposure, which is security-relevant because it changes whether the dashboard is local-only or remotely reachable.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The setup section says 'zero config needed' and 'No configuration required,' which conflicts with the earlier claim that DASHBOARD_TOKEN is required. These statements cannot both be true and create confusion about how the skill authenticates access to the dashboard.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The document declares lang="en", which forces an English locale at the page level without any visible opt-in or language-selection mechanism. Under the stated policy, locale-specific behavior should either be optional or clearly justified.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.