Back to skill

Security audit

Agent Network

Security checks for vulnerabilities and agentic risk

Overview

This is a real agent-networking skill, but it exposes powerful unauthenticated network controls and shares agent data too broadly for default installation.

Review before installing. Use only in an isolated or firewalled environment, avoid sensitive conversations or private skills, and prefer waiting for a version with authenticated local APIs, loopback-only binding, opt-in external discovery, real peer authentication/encryption, safer HTML rendering, and updated dependencies.

Vulnerability Patterns
  • 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
  • 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 (5)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
index.js:109
Finding
Unauthenticated Network-Accessible Control API<![CDATA[ ## Vulnerability Details **File Location**: `index.js:109-116`, `index.js:135-164`, `index.js:205-226`, `index.js:244-322`, `index.js:333-355`, `index.js:378-380` **Vulnerability Type**: Missing authentication and authorization, unrestricted CORS, and unrestricted network binding **Risk Level**: Critical ### Vulnerable Code ```javascript startHttpServer() { this.httpServer = http.createServer(async (req, res) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Content-Type', 'application/json'); const sendError = (msg) => { res.end(JSON.stringify({ error: msg })); }; const sendSuccess = (data) => { res.end(JSON.stringify(data)); }; ``` Sensitive message history is returned without authenticating the caller: ```javascript else if (req.url.startsWith('/api/messages') && req.method === 'GET') { const urlObj = require('url').parse(req.url, true); const peerId = urlObj.query.peer; const messages = this.db.all(` SELECT * FROM messages WHERE (from_agent = ? AND to_agent = ?) OR (from_agent = ? AND to_agent = ?) ORDER BY created_at ASC `, [this.nodeId, peerId, peerId, this.nodeId]); sendSuccess(messages); } ``` The same unauthenticated server permits outbound messaging and other state-changing operations: ```javascript else if (req.url === '/api/send' && req.method === 'POST') { let body = ''; req.on('data', chunk => body += chunk); req.on('end', async () => { const { to, message } = JSON.parse(body); await this.core.sendMessage(to, message); sendSuccess({ success: true }); }); } ``` The server is started without specifying a loopback address: ```javascript this.httpServer.listen(this.config.port + 1, () => { console.log(`HTTP API server listening on port ${this.config.port + 1}`); }); ``` ### Technical Analysis The HTTP API has no authentication, session validation, API token, authorization checks, or caller identity controls. It exp ...[truncated 2071 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Bind the API explicitly to a loopback address: ```javascript this.httpServer.listen(this.config.port + 1, '127.0.0.1', callback); ``` 2. Require a cryptographically random authentication token on every endpoint. 3. Separate read-only status operations from privileged mutation operations and enforce endpoint-specific authorization. 4. Replace wildcard CORS with an exact allowlist. For an Electron-only API, consider disabling browser CORS access entirely. 5. Add CSRF protection if browser-originated requests remain supported. 6. Enforce `Content-Type`, HTTP method, JSON schema, and maximum body length before processing requests. 7. Add rate limiting, request timeouts, and audit logging. 8. Avoid returning full local paths or private message records unless explicitly requested by an authenticated user. 9. Prefer Electron IPC with narrowly scoped handlers instead of a broadly accessible local HTTP control plane. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
ui/index.html:301
Finding
Stored Cross-Site Scripting Through Peer, Message, and Skill Data<![CDATA[ ## Vulnerability Details **File Location**: `ui/index.html:301-323`, `ui/index.html:335-354`, `ui/index.html:368-382`, `ui/index.html:411-425`, `ui/index.html:447`; privileged bridge at `preload.js:4-91` **Vulnerability Type**: Stored XSS caused by unsanitized insertion into `innerHTML` **Risk Level**: High ### Vulnerable Code Peer-controlled identifiers are inserted into HTML and inline event handlers: ```javascript container.innerHTML = allPeers.map(c => { const id = c.peer_id || c.agent_id || c.id; const isConnected = c.status === 'accepted'; const isDiscovered = c.status === 'discovered' || c.type; const type = c.type || 'websocket'; return ` <div class="chat-item" onclick="openChat('${id}')"> <div class="chat-avatar">${isConnected ? '🤖' : '📡'}</div> <div style="flex:1;"> <div style="font-weight:bold;font-size:12px;">${id.substring(0, 20)}${id.length > 20 ? '...' : ''}</div> <div style="font-size:10px;color:#999;"> ${isConnected ? '✅ 已连接' : isDiscovered ? `🔍 ${type}发现` : '⏳ 待通过'} ${c.version ? ' v' + c.version : ''} </div> </div> </div> `}).join(''); ``` Skill metadata is also rendered without HTML escaping: ```javascript container.innerHTML = skills.map(s => ` <div class="card"> <div class="card-header"> <span class="card-title">${s.name}</span> <span class="card-badge">${s.price || 0}积分</span> </div> <div class="card-desc">${s.description || '暂无描述'}</div> <div class="card-meta"> <span class="rating">⭐ ${(s.avg_rating || 0).toFixed(1)}</span> <span>📥 ${s.downloads || 0}</span> </div> <div class="action-row" style="margin-top:8px;"> <button class="btn btn-primary btn-small" onclick="downloadSkill('${s.id}')">下载</button> <button class="btn btn-secondary btn-small" onclick="openRateModal('${s.id}', '${s.name}')">评分</button> </div> </div> `).join(''); ``` Stored message content is rendered directly: ```javascrip ...[truncated 3596 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Stop using `innerHTML` for untrusted values. 2. Build elements with `document.createElement()` and assign user-controlled data through `textContent`. 3. Register event listeners through `addEventListener()` rather than generating inline `onclick` attributes. 4. If HTML rendering is genuinely required, sanitize it with a well-maintained allowlist sanitizer configured to remove scripts, event handlers, dangerous URLs, and active SVG content. 5. Add a restrictive Content Security Policy that blocks inline scripts and event handlers. 6. Validate peer IDs, skill IDs, versions, and other identifiers against strict allowlisted formats. 7. Reduce the preload bridge to narrowly scoped methods and validate all arguments in the trusted process. 8. Do not expose broad message-reading or state-changing capabilities to arbitrary renderer scripts. 9. Add regression tests containing hostile HTML in every remotely controlled field. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
lib/network.js:159
Finding
Unauthenticated and Unencrypted P2P Protocol Permits Identity Spoofing and Database Poisoning<![CDATA[ ## Vulnerability Details **File Location**: `lib/network.js:45-54`, `lib/network.js:159-222`, `lib/network.js:258-278`, `lib/network.js:290-312`; `lib/core.js:33-59`, `lib/core.js:85-129` **Vulnerability Type**: Missing peer authentication, missing message integrity, plaintext WebSockets, and untrusted state processing **Risk Level**: High ### Vulnerable Code The WebSocket server accepts network connections without authentication: ```javascript async start() { return new Promise((resolve, reject) => { this.wss = new WebSocket.Server({ port: this.port }); this.wss.on('listening', () => { console.log(`P2P server listening on port ${this.port}`); // Start discovering HTTP agents this.startHTTPAgentDiscovery(); resolve(); }); this.wss.on('error', (err) => { console.error('P2P server error:', err); reject(err); }); this.wss.on('connection', (ws, req) => { this.handleConnection(ws, req); }); }); } ``` A caller-selected `peerId` is trusted during the handshake: ```javascript handleMessage(ws, message) { const { type, peerId, payload } = message; switch (type) { case 'handshake': this.connections.set(peerId, { ws, info: payload, type: 'websocket' }); this.emit('peer_connected', peerId, payload); console.log(`Peer connected: ${peerId}`); if (this.config.autoGreet && payload.name) { setTimeout(() => { this.sendGreeting(peerId); }, 1000); } break; case 'message': this.handlePeerMessage(peerId, payload); break; case 'discover_request': this.handleDiscoverRequest(ws, peerId); break; case 'skill_share': this.handleSkillShare(peerId, payload); break; default: if (this.messageHandlers.has(type)) { this.messageHandlers.get(type)(payload, peerId); } } } ``` Outbound connections explicitly use plain ...[truncated 3233 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Use `wss://` with correctly validated certificates for transport confidentiality and integrity. 2. Implement cryptographic peer identities and signed challenge-response authentication. 3. Bind each accepted identity to one authenticated connection and reject conflicting identity claims. 4. Sign the canonical representation of every security-relevant message. 5. Verify the signature, sender identity, recipient, timestamp, and nonce before processing or storing a message. 6. Add replay protection and reject stale or duplicate messages. 7. Define strict schemas for every message type and reject unknown properties or invalid types. 8. Enforce connection limits, per-peer rate limits, maximum frame sizes, and processing timeouts. 9. Require explicit authorization before changing appreciation, connection, marketplace, or reputation state. 10. Correct the documentation until the claimed cryptographic protections are actually implemented. ]]>

T05 · Unauthorized Access and Privilege Escalation

Error
Location
lib/skills.js:23
Finding
Directory Traversal in Skill Publication Reads Files Outside the Skills Root<![CDATA[ ## Vulnerability Details **File Location**: `index.js:306-317`; `lib/skills.js:23-38` **Vulnerability Type**: Path traversal and missing canonical-path containment validation **Risk Level**: High ### Vulnerable Code The HTTP endpoint accepts an arbitrary path from an unauthenticated caller: ```javascript else if (req.url === '/api/publish' && req.method === 'POST') { let body = ''; req.on('data', chunk => body += chunk); req.on('end', async () => { const { skillPath, price, metadata } = JSON.parse(body); const skillId = await this.skills.publish(skillPath, price, metadata); // Share with P2P network await this.core.shareSkill(skillId, metadata.name || skillPath, metadata.description, price); sendSuccess({ success: true, skillId }); }); } ``` The value is joined to the skills root without checking the canonical result: ```javascript // Publish a skill async publish(skillPath, price = 0, metadata = {}) { const skillDir = path.join(this.skillsDir, skillPath); if (!fs.existsSync(skillDir)) { throw new Error('Skill not found: ' + skillPath); } const skillMdPath = path.join(skillDir, 'SKILL.md'); let description = ''; if (fs.existsSync(skillMdPath)) { const content = fs.readFileSync(skillMdPath, 'utf-8'); // Extract first 200 chars as description description = content.substring(0, 200); } ``` The extracted content is persisted as the skill description: ```javascript this.db.run( `INSERT INTO skills (id, owner_agent, name, description, category, price, created_at) VALUES (?, ?, ?, ?, ?, ?, ?)`, [ skillId, this.nodeId, metadata.name || path.basename(skillPath), description, metadata.category || 'general', price, new Date().toISOString() ] ); ``` ### Technical Analysis `skillPath` is attacker-controlled. `path.join()` normalizes traversal segments but does not enforce that the resulting path remains inside `this.skillsDir`. Values containing sufficie ...[truncated 1571 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Accept a validated skill identifier instead of a caller-supplied filesystem path. 2. Reject absolute paths, null bytes, path separators where unnecessary, and all `.` or `..` traversal components. 3. Canonicalize both the skills root and candidate directory with `fs.realpath()`. 4. Verify containment using the canonical root plus a path separator: ```javascript const root = await fs.promises.realpath(this.skillsDir); const candidate = await fs.promises.realpath(path.join(root, skillId)); if (candidate !== root && !candidate.startsWith(root + path.sep)) { throw new Error('Invalid skill path'); } ``` 5. Perform the same containment check on `SKILL.md`. 6. Reject symlinks or explicitly verify that their resolved target remains inside the root. 7. Authenticate and authorize the publication endpoint. 8. Avoid exposing raw filesystem errors or using them as distinguishable directory-existence responses. ]]>

other

Warning
Location
index.js:41
Finding
Automatic External Registration and Metadata Broadcast Without Explicit Opt-In<![CDATA[ ## Vulnerability Details **File Location**: `index.js:41-75`; `lib/evomap.js:4-10`, `lib/evomap.js:52-85`; `lib/nostr.js:4-10`, `lib/nostr.js:32-52`, `lib/nostr.js:95-115` **Vulnerability Type**: Unconsented external network registration and identity metadata disclosure **Risk Level**: Medium ### Vulnerable Code Starting the service automatically connects and broadcasts through Nostr: ```javascript // Start Nostr network try { this.nostr = new NostrClient(); await this.nostr.connect(); // Broadcast presence await this.nostr.broadcast(); console.log(`✓ Nostr connected, pubkey: ${this.nostr.getPublicKey().substring(0, 8)}...`); } catch(e) { console.log(` Nostr error: ${e.message}`); } ``` It also registers with EvoMap, discovers third-party agents, and sends automatic handshakes: ```javascript // Initialize EvoMap client try { this.evomap = new EvoMapClient(this.nodeId); await this.evomap.hello(['chat', 'skills', 'p2p'], { services: ['p2p', 'chat', 'skills'] }); console.log('✓ EvoMap registered'); // Auto-handshake with discovered agents const agents = await this.evomap.discoverAgents(); console.log(`Discovered ${agents.length} agents from EvoMap network`); for (const agent of agents.slice(0, 3)) { setTimeout(async () => { try { await this.evomap.handshake(agent.node_id); console.log(`🤝 Auto-handshake sent to ${agent.node_id}`); this.core.db.run(`INSERT OR IGNORE INTO connections (peer_id, status, connected_at) VALUES (?, 'accepted', ?)`, [agent.node_id, Date.now()]); } catch(e) {} }, Math.random() * 3000 + 1000); } } catch(e) { console.log(` EvoMap error: ${e.message}`); } ``` The external EvoMap destination is hard-coded: ```javascript const EVOMAP_API = 'https://evomap.ai'; class EvoMapClient { constructor(nodeId) { this.nodeId = nodeId || 'node_' + crypto.randomBytes(4).toString('hex'); this.baseUrl = EVOMAP_API; } ``` Five Nostr relays are contacted ...[truncated 2598 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Disable all external discovery and presence broadcasting by default. 2. Require explicit, informed opt-in before contacting EvoMap or Nostr relays. 3. Present every destination and every transmitted metadata field to the user before enabling the feature. 4. Provide a documented local-only mode that performs no external communication. 5. Allow users to configure an exact relay and directory-service allowlist. 6. Separate discovery from automatic handshaking; require user approval before contacting discovered agents. 7. Minimize transmitted metadata and do not advertise service ports unless necessary. 8. Add privacy documentation covering source-IP disclosure, retention expectations, and third-party operators. 9. Ensure shutdown closes all Nostr sockets and clears recurring discovery timers. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
Findings (97)

Ae1

High
Category
analysis-evasion
Content
### Skills 管理模块 (lib/skills.js)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
const skillMdPath = path.join(skillDir, 'SKILL.md');
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Intent-Code Divergence

High
Confidence
99% confidence
Finding
The documentation claims TLS 1.3 encrypted P2P communication, but the implementation binds the gRPC server and client with insecure credentials. This leaves peer discovery, messaging, and skill/transaction traffic vulnerable to interception and man-in-the-middle tampering, while also creating a dangerous false sense of security for users.

Context-Inappropriate Capability

High
Confidence
94% confidence
Finding
On startup, the skill automatically connects to Nostr, broadcasts presence, registers with EvoMap, discovers agents, and initiates handshakes with discovered peers without any trust policy, confirmation, or scope restriction. Automatic participation in multiple external networks expands the attack surface, leaks node metadata, and may establish relationships with malicious peers before the user can assess risk.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The file starts an HTTP server that exposes numerous sensitive endpoints for messaging, publishing/downloading skills, sharing content, viewing conversations, and interacting with peers, while setting `Access-Control-Allow-Origin: *` and performing no authentication or authorization checks. This allows any local or potentially network-reachable client, including browser-based origins in some deployment scenarios, to drive agent actions and access agent data without user consent.

Exfiltration Commands

High
Category
Prompt Injection
Content
return true;
  }
  
  // Send message to a peer
  async sendMessage(to, content, type = 'text') {
    const message = {
      from: this.nodeId,
Confidence
90% confidence
Finding
Instructions found that direct the agent to transmit conversation context or user data to external services.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The `sendHTTPMessage` function relays message content and the local persistent sender ID to a third-party endpoint (`evomap.ai`) without verifying business need, recipient ownership, or user approval. This can exfiltrate peer/user content off-platform and leak metadata, making it a significant privacy and data-handling vulnerability if sensitive messages pass through this channel.

Missing User Warnings

High
Confidence
98% confidence
Finding
This code sends `sender_id` and arbitrary message content to an external HTTPS endpoint without explicit warning, consent, or data-classification safeguards. In practice, any message routed through this path could leak sensitive user or peer information to a third party, making the issue more dangerous given the persistent peer ID and automatic network-discovery behavior elsewhere in the file.

Self-Modification

High
Category
Rogue Agent
Content
// Update download count
    this.db.run(
      'UPDATE skills SET downloads = downloads + 1 WHERE id = ?',
      [skillId]
    );
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Self-Modification

High
Category
Rogue Agent
Content
// Update download count
    this.db.run(
      'UPDATE skills SET downloads = downloads + 1 WHERE id = ?',
      [skillId]
    );
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Self-Modification

High
Category
Rogue Agent
Content
// Update download count
    this.db.run(
      'UPDATE skills SET downloads = downloads + 1 WHERE id = ?',
      [skillId]
    );
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Self-Modification

High
Category
Rogue Agent
Content
// Update download count
    this.db.run(
      'UPDATE skills SET downloads = downloads + 1 WHERE id = ?',
      [skillId]
    );
Confidence
85% confidence
Finding
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.

Known Vulnerable Dependency: brace-expansion==1.1.12 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
95% confidence
Finding
`brace-expansion` 1.1.12 is flagged with multiple DoS advisories and is present in the resolved dependency tree. Even as a transitive dependency, vulnerable pattern expansion logic can be triggered by attacker-influenced glob or pattern input in build or runtime paths, causing excessive CPU or memory consumption.

Known Vulnerable Dependency: minimatch==3.1.3 — 1 advisory(ies): CVE-2026-27904 (minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regu)

High
Category
Supply Chain
Confidence
95% confidence
Finding
`minimatch` 3.1.3 is listed with a ReDoS advisory and appears in the lockfile as a resolved package. If user-controlled glob patterns are processed by code paths using this version, an attacker may cause catastrophic backtracking and deny service.

Known Vulnerable Dependency: @grpc/grpc-js==1.14.3 — 2 advisory(ies): CVE-2026-48068 (@grpc/grpc-js: A malformed request can cause a server crash); CVE-2026-48069 (@grpc/grpc-js: An incoming malformed compressed message can cause a client or se)

High
Category
Supply Chain
Confidence
98% confidence
Finding
`@grpc/grpc-js` 1.14.3 is a direct production dependency and is flagged for malformed-request and malformed-compressed-message crash issues. Because this skill is named `agent-network` and includes networking libraries, the vulnerable gRPC stack is especially relevant and could enable remote denial of service against clients or servers using it.

Known Vulnerable Dependency: @xmldom/xmldom==0.8.11 — 15 advisory(ies): CVE-2026-83608 (xmldom: DocType `name` Injection Bypasses requireWellFormed); CVE-2026-41673 (xmldom: Uncontrolled recursion in XML serialization leads to DoS); CVE-2026-83605 (xmldom: Attribute name injection via setAttribute() bypasses requireWellFormed) +12 more

High
Category
Supply Chain
Confidence
94% confidence
Finding
`@xmldom/xmldom` 0.8.11 is present with numerous advisories including injection and recursion-based DoS issues. Although it is a dev dependency through plist tooling, XML parser vulnerabilities can still be dangerous in build or packaging workflows that ingest untrusted project metadata or files.

Known Vulnerable Dependency: app-builder-lib==24.13.3 — 1 advisory(ies): CVE-2026-54672 (electron-updater: Uncontrolled search path elements within `AppImage` built by `)

High
Category
Supply Chain
Confidence
84% confidence
Finding
`app-builder-lib` 24.13.3 is flagged due to a vulnerability in the Electron updater/appimage ecosystem. In this lockfile it is a development packaging dependency, so exposure depends on whether produced artifacts or updater logic are used downstream, but the issue should still be treated as real supply-chain risk.

Known Vulnerable Dependency: brace-expansion==2.0.2 — 4 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-14257 (brace-expansion: DoS via unbounded expansion length causing an out-of-memory pro) +1 more

High
Category
Supply Chain
Confidence
94% confidence
Finding
`brace-expansion` 2.0.2 is another vulnerable version in the dependency graph with multiple DoS advisories. Multiple installed vulnerable copies increase the chance that at least one reachable code path can be abused via attacker-controlled pattern input.

Known Vulnerable Dependency: builder-util-runtime==9.2.4 — 1 advisory(ies): CVE-2026-54673 (electron-updater: Cross-origin redirect leaks `PRIVATE-TOKEN` and mixed-case `Au)

High
Category
Supply Chain
Confidence
88% confidence
Finding
`builder-util-runtime` 9.2.4 is flagged for token leakage across redirects in updater-related flows. This is not core runtime logic for the listed direct dependencies, but if the packaged app uses updater features, credentials or authorization headers may be exposed to unintended origins.

Known Vulnerable Dependency: brace-expansion==5.0.3 — 5 advisory(ies): CVE-2026-13149 (brace-expansion: DoS via exponential-time expansion of consecutive non-expanding); CVE-2026-33750 (brace-expansion: Zero-step sequence causes process hang and memory exhaustion); CVE-2026-45149 (brace-expansion: Large numeric range defeats documented `max` DoS protection) +2 more

High
Category
Supply Chain
Confidence
95% confidence
Finding
`brace-expansion` 5.0.3 is also flagged with multiple DoS issues, indicating vulnerable instances exist across several major versions in the tree. This broadens exposure and suggests the dependency set has not been recently audited for hostile-input handling in glob expansion.

Known Vulnerable Dependency: minimatch==9.0.6 — 2 advisory(ies): CVE-2026-27904 (minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regu); CVE-2026-27903 (minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adja)

High
Category
Supply Chain
Confidence
95% confidence
Finding
`minimatch` 9.0.6 carries ReDoS issues and is present in the resolved tree. Any code path or tooling that accepts untrusted patterns could be forced into excessive backtracking and high CPU usage.

Known Vulnerable Dependency: electron==28.3.3 — 16 advisory(ies): CVE-2026-34776 (Electron: Out-of-bounds read in second-instance IPC on macOS and Linux); CVE-2026-70609 (Electron: DevTools JavaScript Injection via Unsanitized Dock State Parameter); CVE-2026-34767 (Electron: HTTP Response Header Injection in custom protocol handlers and webRequ) +13 more

High
Category
Supply Chain
Confidence
93% confidence
Finding
`electron` 28.3.3 is a development dependency with numerous advisories, including IPC and injection issues. Because Electron embeds a large privileged runtime, shipping or testing with a vulnerable version can materially increase client-side attack surface, especially if untrusted content is loaded or custom protocols are used.

Known Vulnerable Dependency: extract-zip==2.0.1 — 2 advisory(ies): CVE-2026-19693 (extract-zip allows arbitrary file writes through symlink archive entries); CVE-2026-56876 (extract-zip unvalidated symlink path traversal)

High
Category
Supply Chain
Confidence
92% confidence
Finding
`extract-zip` 2.0.1 is flagged for symlink-based arbitrary write/path traversal issues. In Electron installation or tooling contexts, processing a malicious archive could result in files being written outside the intended extraction directory.

Known Vulnerable Dependency: minimatch==10.2.2 — 2 advisory(ies): CVE-2026-27904 (minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regu); CVE-2026-27903 (minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adja)

High
Category
Supply Chain
Confidence
95% confidence
Finding
`minimatch` 10.2.2 is also flagged for ReDoS, adding another vulnerable matcher version to the tree. The presence of multiple vulnerable matcher versions increases maintenance risk and potential reachability through different toolchains.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
89% confidence
Finding
`form-data` 4.0.5 is flagged for CRLF injection via unescaped multipart field names and filenames. If any code constructs multipart requests using attacker-influenced field metadata, this could enable request smuggling or header injection toward downstream services.

Static analysis

No suspicious patterns detected.