Back to skill

Security audit

Ops Deck

Security checks for vulnerabilities and agentic risk

Overview

This skill is a coherent ops dashboard, but its setup can persistently expose sensitive local operations data on network-reachable services without authentication despite claiming to be local-only.

Review carefully before installing. Only run this bound to `127.0.0.1` unless you add authentication, restricted CORS, firewall rules, and a hardened production frontend. Do not place secrets, tokens, private keys, raw cron payloads, or unnecessary internal topology in the JSON files. Treat PM2 boot persistence as an opt-in production step after access controls are configured.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:190
Finding

Persistent Unauthenticated API Exposure of Sensitive Operational Data

Content
View full analysis
{ const data = JSON.parse(fs.readFileSync('./cron-jobs.json', 'utf8')); res.json(data); }); // Agent intel (CRUD) app.get('/api/agent-intel', (req, res) => { /* ... */ }); app.post('/api/agents/intel', (req, res) => { /* ... */ }); // Security audit (read from file, updated by daily cron) app.get('/api/security-audit', (req, res) => { const data = JSON.parse(fs.readFileSync('./security-audit/audit-data.json', 'utf8')); res.json(data); }); // Architecture app.get('/api/architecture', (req, res) => { /* ... */ }); // Backlog app.get('/api/backlog', (req, res) => { const data = JSON.parse(fs.readFileSync('./backlog.json', 'utf8')); res.json(data); }); app.listen(8005, () => console.log('Ops Deck API on :8005')); ``` ```bash pm2 start ecosystem.config.cjs pm2 save pm2 startup # auto-start on boot ``` The documented dashboard also exposes cron payload and delivery details: ```text Visual calendar of all scheduled agent tasks. See what runs when, last status, next run, error streaks. Click to view payload and delivery config. ``` ### Technical Analysis The example API does not implement authentication or authorization. Calling `app.listen(8005)` without specifying a host normally causes Node.js to listen on an unspecified address, potentially making the API reachable through non-loopback interfaces. The global `cors()` middleware permits cross-origin browser access without restricting origins. The affected endpoints expose information about scheduled jobs, security controls, infrastructure architecture, agent intelligence, ...[truncated 2282 chars]
Remediation
View remediation
{ console.log('Ops Deck API on http://127.0.0.1:8005'); }); ``` 2. Require authentication for every endpoint and enforce authorization separately for read and write operations. 3. Restrict CORS to the exact trusted dashboard origin rather than calling unrestricted `cors()`: ```javascript app.use(cors({ origin: 'http://127.0.0.1:5173', methods: ['GET', 'POST'], credentials: true })); ``` 4. Do not expose raw cron payloads, delivery configuration, agent configuration, or secrets. Add schema-based allowlists and redact tokens, credentials, internal addresses, and command arguments. 5. Apply CSRF protection to state-changing endpoints when cookie-based authentication is used. 6. Add rate limiting, request-size limits, security headers, structured access logging, and robust error handling. 7. Make PM2 startup an explicit opt-in production step after the user has configured authentication, host binding, and firewall controls. 8. Document how to disable and remove persistence, including the relevant `pm2 unstartup`, `pm2 delete`, and `pm2 save` workflow. 9. If remote access is required, place the API behind an authenticated TLS reverse proxy and firewall port 8005 from direct external access. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:254
Finding

Frontend Development Server Is Exposed Beyond the Claimed Local-Only Boundary

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
SKILL.md:169
Finding

Unpinned and Mutable Third-Party Dependency Installation

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
Findings (1)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill documents a dashboard that aggregates cron schedules, security audit status, architecture maps, and backlog data, all of which can reveal sensitive operational details if exposed through the local API or UI. Although the file states the dashboard reads static JSON and has no direct system access, it does not sufficiently warn users that these JSON files may contain secrets, internal topology, service ports, task payloads, or security posture data that should be minimized and access-controlled.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.