Back to skill

Security audit

skill-feedback-collector

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a real feedback tool, but its default network control panel can expose history and let reachable clients steer the agent.

Review carefully before installing. Only run it on localhost or a trusted, firewalled network; set a strong FEEDBACK_TOKEN; avoid putting secrets in feedback; clear feedback-history.json regularly; and do not let queued browser/API tasks bypass the agent's normal safety and confirmation rules.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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 (4)

T01 · Skill Instruction Hijacking

Error
Location
SKILL.md:27
Finding
Unauthenticated Remote Task Queue Can Inject Instructions into the AI Agent<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:27-29`; `src/index.ts:295-318`, `src/index.ts:415-421`, `src/index.ts:555-576` **Vulnerability Type**: Remote instruction injection through attacker-controlled MCP tool output **Risk Level**: Critical ### Vulnerable Code `SKILL.md:27-29`: ```markdown 3. The response from `ask_human_feedback` is your next instruction. Execute it, then call `ask_human_feedback` again when done. This creates a productive feedback loop. 4. If the task queue returns a task automatically (queue was non-empty), execute that task and call `ask_human_feedback` again when complete. The queue feeds tasks until empty. ``` `src/index.ts:295-318`: ```ts if (req.url === "/api/queue" && req.method === "POST") { const body = await readBody(req); try { const data = JSON.parse(body); if (data.action === "add" && typeof data.task === "string" && data.task.trim()) { taskQueue.push(data.task.trim()); broadcastQueueState(); } else if (data.action === "remove" && typeof data.index === "number") { if (data.index >= 0 && data.index < taskQueue.length) { taskQueue.splice(data.index, 1); broadcastQueueState(); } } else if (data.action === "clear") { taskQueue.length = 0; broadcastQueueState(); } else if (data.action === "reorder" && Array.isArray(data.tasks)) { taskQueue.length = 0; taskQueue.push(...data.tasks.filter((t: unknown) => typeof t === "string" && (t as string).trim())); broadcastQueueState(); } else if (data.action === "autoMode" && typeof data.enabled === "boolean") { autoMode = data.enabled; broadcastQueueState(); } res.writeHead(200, { "Content-Type": "application/json", ...cors }); res.end(JSON.stringify({ ok: true, tasks: [...taskQueue], autoMode })); } catch { res.writeHead(400, { "Content-Type": "application/json", ...cors }); res.end(JSON.stringify({ error: "Invalid JSON" })); } retur ...[truncated 3379 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove instructions that require the Agent to execute feedback or queue output automatically. 2. Explicitly label all browser, HTTP, WebSocket, and queue content as untrusted user input. 3. Require the Agent to apply its normal authorization, safety, and tool-use policies to every returned task. 4. Require explicit confirmation through the original trusted Agent conversation before acting on queued instructions that access data, modify files, invoke tools, or perform destructive operations. 5. Bind task queues to authenticated users and isolated Agent sessions so one client cannot inject tasks into another session. 6. Attach provenance metadata to tool output instead of returning attacker-controlled text as an unqualified instruction. 7. Introduce an allowlist of permitted queue operations or use a structured task schema rather than arbitrary natural-language commands. 8. Display queued tasks to the trusted operator and require approval before dispatch. 9. Add queue length, task length, and rate limits. 10. Treat authentication as mandatory, but do not rely on authentication alone: authenticated browser content must still be considered untrusted input. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
src/index.ts:90
Finding
Network Service Exposes Agent Controls and Conversation History without Authentication by Default<![CDATA[ ## Vulnerability Details **File Location**: `src/index.ts:14`, `src/index.ts:90-98`, `src/index.ts:174-318`, `src/index.ts:364-421`, `src/index.ts:454-462` **Vulnerability Type**: Missing authentication on a service bound to all network interfaces **Risk Level**: High ### Vulnerable Code `src/index.ts:14`: ```ts const AUTH_TOKEN = process.env.FEEDBACK_TOKEN || ""; ``` `src/index.ts:90-98`: ```ts function checkAuth(req: http.IncomingMessage): boolean { if (!AUTH_TOKEN) return true; const url = new URL(req.url || "/", `http://localhost:${WS_PORT}`); const tokenParam = url.searchParams.get("token"); if (tokenParam === AUTH_TOKEN) return true; const authHeader = req.headers.authorization; if (authHeader === `Bearer ${AUTH_TOKEN}`) return true; return false; } ``` `src/index.ts:164-172`: ```ts if (req.url?.startsWith("/api/")) { if (!checkAuth(req)) { res.writeHead(401, { "Content-Type": "application/json", ...cors }); res.end(JSON.stringify({ error: "Unauthorized. Provide ?token=xxx or Authorization: Bearer xxx" })); return; } } ``` `src/index.ts:364-371`: ```ts wss.on("connection", (rawWs, req) => { if (AUTH_TOKEN && !checkAuth(req)) { rawWs.close(4001, "Unauthorized"); return; } const ws = rawWs as TrackedSocket; ``` `src/index.ts:454-462`: ```ts httpServer.listen(WS_PORT, "0.0.0.0", () => { console.error( `[feedback-collector] UI & WebSocket server listening on http://0.0.0.0:${WS_PORT}` ); if (AUTH_TOKEN) { console.error(`[feedback-collector] Auth enabled. Use ?token=${AUTH_TOKEN} or Authorization header.`); } }); ``` ### Technical Analysis The service binds to `0.0.0.0`, exposing it on every available network interface. Authentication is optional, and `checkAuth()` authorizes every request when `FEEDBACK_TOKEN` is empty. The WebSocket handler uses the same optional-authentication model. Consequently, the default configuration makes all sensitive API and WebSocket capabilities a ...[truncated 2042 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Bind to `127.0.0.1` by default and require an explicit configuration option to listen on external interfaces. 2. Refuse to start on a non-loopback interface unless a strong authentication secret is configured. 3. Generate a cryptographically random authentication secret during setup rather than accepting an empty default. 4. Enforce authentication consistently on every sensitive HTTP route and every WebSocket upgrade. 5. Use authenticated sessions with secure, `HttpOnly`, `SameSite` cookies where practical. 6. Do not include bearer tokens in URLs because URLs may leak through browser history, logs, screenshots, proxies, and referrer data. 7. Apply per-session authorization so authenticated users cannot access unrelated Agent sessions. 8. Restrict CORS to an explicit trusted origin rather than allowing arbitrary origins. 9. Add rate limiting, failed-authentication throttling, audit logging, and connection limits. 10. Recommend firewall restrictions as defense in depth, not as a substitute for application authentication. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
client/index.html:358
Finding
Bundled Browser Client Does Not Propagate the Documented Authentication Token<![CDATA[ ## Vulnerability Details **File Location**: `client/index.html:358-359`, `client/index.html:405-406`, `client/index.html:462-480`, `client/index.html:505-506`, `client/index.html:533-539`, `client/index.html:566-568`; `README.md:76-79` **Vulnerability Type**: Broken authentication integration and insecure token workflow **Risk Level**: Medium ### Vulnerable Code `client/index.html:358-359`: ```js var baseUrl = location.origin; var wsUrl = (location.protocol === "https:" ? "wss:" : "ws:") + "//" + location.host; ``` `client/index.html:405-406`: ```js function loadHistory(){ fetch(baseUrl + "/api/history") ``` `client/index.html:462-480`: ```js } else { fetch(baseUrl + "/api/feedback", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ text: t }) }).then(function(r){ return r.json(); }) .then(function(d){ if(d.ok){ pushLog("user", t); clearQuestion(); } }) .catch(function(){}); } function toggleMode(enabled){ if(transport === "ws" && ws && ws.readyState === WebSocket.OPEN){ ws.send(JSON.stringify({ type: "toggle", enabled: enabled })); } else { fetch(baseUrl + "/api/toggle", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ enabled: enabled }) }).catch(function(){}); } } ``` `client/index.html:505-506`: ```js exportBtn.addEventListener("click", function(){ window.open(baseUrl + "/api/history/export", "_blank"); }); ``` `client/index.html:533-539`: ```js } else { fetch(baseUrl + "/api/queue", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(msg) }).then(function(r){ return r.json(); }) .then(function(d){ if(d.tasks) renderQueue(d.tasks); }) .catch(function(){}); } ``` `client/index.html:566-568`: ```js setConn("err", "Connecting (WebSocket)..."); try{ ws = new WebSocket(wsUrl); }catch(e){ fallbackToPoll(); return; } ``` The documented acc ...[truncated 2203 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace URL-query bearer authentication with a proper authenticated session. 2. If query-token bootstrapping must be supported, read the token once, exchange it for a secure session cookie, and immediately remove it from the address bar with `history.replaceState`. 3. Send authenticated HTTP requests using an appropriate secure mechanism, preferably an `HttpOnly`, `Secure`, `SameSite` cookie. 4. Authenticate WebSocket upgrades using the same session cookie or a short-lived, single-use WebSocket ticket. 5. Ensure every client operation—history, export, feedback, toggle, queue, polling, and WebSocket—uses the authenticated session. 6. Detect HTTP 401 and WebSocket authorization failures and present a clear authentication error instead of silently retrying or falling back. 7. Add integration tests that start the server with authentication enabled and exercise the complete browser workflow. 8. Avoid logging bearer tokens or including them in URLs, browser history, or exported diagnostic information. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
src/index.ts:128
Finding
Unbounded HTTP Request Body Buffering Allows Remote Memory Exhaustion<![CDATA[ ## Vulnerability Details **File Location**: `src/index.ts:128-133`, invoked at `src/index.ts:242-243`, `src/index.ts:270-271`, and `src/index.ts:295-296` **Vulnerability Type**: Unbounded request-body allocation and denial of service **Risk Level**: Medium ### Vulnerable Code `src/index.ts:128-133`: ```ts function readBody(req: http.IncomingMessage): Promise<string> { return new Promise((resolve) => { const chunks: Buffer[] = []; req.on("data", (c: Buffer) => chunks.push(c)); req.on("end", () => resolve(Buffer.concat(chunks).toString("utf-8"))); }); } ``` The unbounded helper is used by multiple remotely reachable endpoints: ```ts if (req.url === "/api/feedback" && req.method === "POST") { const body = await readBody(req); ``` ```ts if (req.url === "/api/toggle" && req.method === "POST") { const body = await readBody(req); ``` ```ts if (req.url === "/api/queue" && req.method === "POST") { const body = await readBody(req); ``` ### Technical Analysis `readBody()` retains every received chunk in an array and then allocates another buffer with `Buffer.concat()`. It does not enforce a maximum body size, reject an excessive `Content-Length`, limit request duration, or stop reading after a threshold. An attacker can therefore send a very large POST body or maintain multiple concurrent uploads. Memory consumption includes the retained chunks and the concatenated copy. Sufficient input can cause severe garbage-collection pressure, event-loop degradation, process termination due to an out-of-memory condition, or host-level resource exhaustion. Authentication does not fully mitigate this coding flaw because authenticated or compromised clients can still exploit it. Under the default empty-token configuration, it is remotely exploitable by any client that can reach the port. ### Attack Path 1. The server starts and exposes the HTTP interface. 2. An attacker opens one or more POST requests to `/api/feedback`, `/api/toggle`, or `/a ...[truncated 860 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Enforce endpoint-specific request size limits before buffering content. Feedback and toggle requests should normally require only a few kilobytes. 2. Reject requests whose declared `Content-Length` exceeds the configured limit. 3. Track accumulated bytes while streaming and immediately stop processing and destroy the request when the limit is exceeded. 4. Return HTTP `413 Payload Too Large` for oversized requests. 5. Add request-header and body timeouts to mitigate slow-stream attacks. 6. Limit concurrent requests and apply per-client rate limiting. 7. Enforce maximum feedback-text and queue-task lengths after JSON parsing. 8. Add global queue-length and history-entry-size limits. 9. Handle request `error`, `aborted`, and premature-close events so buffers and waiter state are released promptly. 10. Add tests covering oversized bodies, chunked transfer encoding, concurrent uploads, and slow request streams. ]]>
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
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (30)

Credential Access

High
Category
Privilege Escalation
Content
feedback-history*.json

*.log
.env
role.md
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
| Env Variable | Default | Description |
|---|---|---|
| `FEEDBACK_PORT` | `18061` | HTTP and WebSocket port |
| `FEEDBACK_TOKEN` | (empty) | Optional access token for the UI |

## Workflow
Confidence
94% confidence
Finding
The skill documents an optional `FEEDBACK_TOKEN` while also stating the server binds to `0.0.0.0` by default and is reachable over HTTP/WebSocket. If deployed without the token or firewall restrictions, unauthorized users on the network could connect to the UI, read task summaries, inject responses, and steer the agent through the feedback loop.

Known Vulnerable Dependency: fast-uri==3.1.0 — 7 advisory(ies): CVE-2026-13676 (fast-uri vulnerable to host confusion via failed IDN canonicalization); CVE-2026-18446 (fast-uri vulnerable to host confusion via backslash authority introducer); CVE-2026-75975 (fast-uri vulnerable to server-side request forgery via malformed IPv6 normalizat) +4 more

High
Category
Supply Chain
Confidence
89% confidence
Finding
fast-uri 3.1.0 has multiple host parsing and canonicalization issues, including SSRF-relevant confusion bugs. This matters more in an MCP skill that may process URLs, callbacks, or remote endpoints through its SDK stack, because malformed attacker-controlled URLs could bypass host validation and cause unintended network access.

Known Vulnerable Dependency: hono==4.12.7 — 16 advisory(ies): CVE-2026-56762 (Hono missing validation of cookie name on write path in setCookie()); CVE-2026-47676 (Hono: app.mount() strips mount prefix using undecoded path, causing incorrect ro); CVE-2026-47675 (Hono: Cookie helper does not sanitize sameSite and priority, allowing Set-Cookie) +13 more

High
Category
Supply Chain
Confidence
91% confidence
Finding
hono 4.12.7 is associated with numerous advisories covering cookie handling, routing, and path/mount behavior. Because this skill explicitly presents a browser UI and pauses for human input, routing and cookie flaws in the HTTP framework are more relevant than in a pure local library, potentially affecting session integrity, route protection, or request handling.

Known Vulnerable Dependency: ip-address==10.1.0 — 2 advisory(ies): CVE-2026-69192 (ip-address: Address4 decodes leading-zero octets as decimal while resolvers deco); CVE-2026-42338 (ip-address has XSS in Address6 HTML-emitting methods)

High
Category
Supply Chain
Confidence
80% confidence
Finding
ip-address 10.1.0 includes address parsing inconsistencies and an HTML-emitting XSS issue. In this dependency tree it is brought in by express-rate-limit, so exploitability depends on whether the application surfaces parsed address output or relies on this parser for network trust decisions; if it does, address confusion could weaken SSRF/IP-allowlist protections.

Known Vulnerable Dependency: path-to-regexp==8.3.0 — 2 advisory(ies): CVE-2026-4923 (path-to-regexp vulnerable to Regular Expression Denial of Service via multiple w); CVE-2026-4926 (path-to-regexp vulnerable to Denial of Service via sequential optional groups)

High
Category
Supply Chain
Confidence
88% confidence
Finding
path-to-regexp 8.3.0 is flagged for ReDoS/DoS conditions involving crafted route patterns or matching behavior. Since this skill likely runs an HTTP interface for browser-based human feedback, a route-matching denial of service could affect availability if exposed to untrusted clients, though it is less severe when bound only to localhost.

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
93% confidence
Finding
ws 8.19.0 is flagged for memory disclosure and memory exhaustion DoS issues. This is especially relevant for a human-in-the-loop feedback collector with a browser UI and task queue, because WebSocket communication is a plausible transport for live updates; if reachable by an attacker, it can lead to service instability or potential data exposure from process memory.

Known Vulnerable Dependency: ws==8.19.0 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
98% confidence
Finding
The package depends on ws in a context where WebSocket handling is part of the core feature, and version 8.19.0 is flagged with advisories for uninitialized memory disclosure and memory exhaustion DoS. Because this skill collects human feedback through a browser UI over WebSockets, exploitation of the WebSocket layer is especially relevant and can lead to information exposure or service disruption.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
The README presents all user-facing instructions and usage examples in Chinese, and does not indicate that other languages are available or that Chinese is required for a justified region-specific purpose. This can violate language/locale policy when users are not given a choice or explicit opt-in.

Lp3

Medium
Category
MCP Least Privilege
Confidence
83% confidence
Finding
The skill exposes environment-driven behavior (`FEEDBACK_PORT`, `FEEDBACK_TOKEN`) and a network-facing service, but the manifest does not declare any explicit tool scope or permission boundaries. In practice this makes the skill's capabilities less transparent to the agent/runtime and increases the chance it is activated or deployed without appropriate review of its network exposure and secret handling.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The description says to use the skill for broad, routine situations such as completing tasks, uncertainty, confirmation, or asking instead of guessing. That wide trigger surface can cause the skill to activate in many normal workflows, unnecessarily exposing task content and prompts to the browser UI, local history file, and any reachable client connected to the feedback service.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The document explicitly sets the page language to zh-CN, which imposes a specific locale choice. Under the policy, forcing a language or locale without opt-in or clear region-specific justification is a natural-language policy concern.

Session Persistence

Medium
Category
Rogue Agent
Content
</div>
      <div class="queue-body">
        <div class="queue-input-row">
          <input type="text" id="queueInput" placeholder="Add a task to the queue...">
          <button id="queueAddBtn">Add</button>
        </div>
        <ul class="queue-list" id="queueList">
Confidence
80% 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.

Missing User Warnings

Medium
Confidence
83% confidence
Finding
This code presents queued tasks as being for "auto-execution," which implies later automated actions that could affect system state, but the UI provides no visible warning, confirmation, or explanatory text about what those tasks will do. For a code file, safety-relevant automated execution behavior should have some user-facing disclosure when exposed in the interface.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
AI and human feedback text is stored on disk in a persistent JSON file with no visible consent, retention, or sensitivity controls. Because this skill is specifically designed to collect interactive human input, it is likely to capture secrets, internal task details, and personal data that could later be exposed from disk or backups.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The export endpoint returns the full stored feedback history, which may contain sensitive AI and human conversation content. In this skill context, the endpoint increases exfiltration risk because the service is network-accessible and designed to aggregate potentially sensitive task discussions over time.

Missing User Warnings

Medium
Confidence
97% confidence
Finding
The server logs the authentication token directly, exposing the shared secret to anyone with access to stdout, process logs, container logs, or centralized logging systems. Since that token protects both HTTP API and WebSocket access, disclosure can lead to unauthorized control of feedback mode, queue operations, and access to stored history.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The tool contract says it waits for human feedback, but when the queue is non-empty it returns a queued task automatically without any human response. In a human-in-the-loop control skill, this semantic mismatch can bypass confirmation gates and cause downstream agents to treat machine-supplied queue items as approved human input.

Vague Triggers

Low
Confidence
87% confidence
Finding
The usage guidance gives positive examples for many common scenarios but lacks clear guardrails and negative examples. Without stronger constraints, agents may overuse the skill and send unnecessary sensitive context to the feedback channel or enter an unintended confirmation loop, increasing exposure rather than directly creating code execution risk.

Missing User Warnings

Low
Confidence
77% confidence
Finding
The export button directly opens the history export endpoint, which likely transfers conversation history out of the current view, but there is no inline warning or explanatory text about what data will be exported. This is a user-data-affecting operation and the code does not provide any visible disclosure beyond the button label.

Known Vulnerable Dependency: @hono/node-server==1.19.11 — 2 advisory(ies): CVE-2026-39406 (@hono/node-server: Middleware bypass via repeated slashes in serveStatic); GHSA-frvp-7c67-39w9 (Node.js Adapter for Hono: Path traversal in `serve-static` on Windows via encode)

Low
Category
Supply Chain
Confidence
86% confidence
Finding
The lockfile pins @hono/node-server 1.19.11, and the listed advisories affect static file serving and path handling. Even though this skill is a feedback collector rather than a generic file server, MCP/browser-facing tooling commonly exposes HTTP endpoints, so middleware bypass or Windows path traversal in the server adapter can become reachable if static assets or local UI files are served.

Known Vulnerable Dependency: body-parser==2.2.2 — 1 advisory(ies): CVE-2026-12590 (body-parser vulnerable to denial of service when invalid limit value silently di)

Low
Category
Supply Chain
Confidence
78% confidence
Finding
body-parser 2.2.2 is flagged for a denial-of-service condition related to invalid limit handling. In this skill, the issue is likely only reachable if attacker-controlled HTTP request bodies are accepted by a web endpoint, which is plausible for a browser-based feedback UI but generally results in availability impact rather than code execution or data compromise.

Known Vulnerable Dependency: qs==6.15.0 — 3 advisory(ies): CVE-2026-82417 (qs: Denial of Service via Attacker Controlled isBuffer); CVE-2026-8723 (qs has a remotely triggerable DoS: qs.stringify crashes with TypeError on null/u); CVE-2026-82562 (qs array-limit bypass via bracket-key comma parsing)

Low
Category
Supply Chain
Confidence
77% confidence
Finding
qs 6.15.0 has several denial-of-service and parsing edge-case advisories. In this context the likely impact is limited to request/query parsing instability in the browser-facing service, which is still a real availability concern if an attacker can send crafted requests.

Unpinned Dependencies

Low
Category
Supply Chain
Content
],
  "license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.12.1",
    "ws": "^8.18.0"
  },
  "devDependencies": {
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.12.1",
    "ws": "^8.18.0"
  },
  "devDependencies": {
    "@types/node": "^22.15.0",
Confidence
95% confidence
Finding
The ws dependency is specified with a caret range, which can resolve to vulnerable versions such as 8.19.0, and the static finding already links that package line to known high-severity advisories. In this skill, ws is central to the browser/UI feedback channel, so a vulnerable WebSocket library directly affects the exposed network-facing component and can enable memory disclosure or denial of service.

Static analysis

No suspicious patterns detected.