Back to skill

Security audit

NoChat Channel

Security checks for vulnerabilities and agentic risk

Overview

This plugin is presented as encrypted, trust-tiered agent messaging, but the inspected code sends only Base64-encoded message content and routes inbound remote messages as command-authorized without applying the advertised trust checks.

Review this plugin carefully before installing. Treat NoChat messages and replies as readable by the configured server until real authenticated encryption is implemented, protect and rotate the API key like a credential, do not add unverified owners, and avoid enabling the gateway on sensitive workspaces because remote messages may be processed as authorized commands regardless of the documented trust tier.

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

T05 · Unauthorized Access and Privilege Escalation

Error
Location
index.ts:154
Finding

Inbound trust controls are bypassed and every remote message is command-authorized

Content
View full analysis
{ const core = getNoChatRuntime(); const senderName = msg.sender_name || msg.sender_id.slice(0, 8); const senderId = msg.sender_id; // Decode message content let text: string; try { const raw = msg.encrypted_content || ""; const decoded = Buffer.from(raw, "base64").toString("utf-8"); // Handle double base64 encoding try { const double = Buffer.from(decoded, "base64").toString("utf-8"); // If double-decoded looks like text (not gibberish), use it text = /^[\x20-\x7E\n\r\t]/.test(double) && double.length > 0 ? double : decoded; } catch { text = decoded; } } catch { text = msg.encrypted_content || "[unreadable message]"; } // Resolve agent route (session key) const route = core.channel.routing.resolveAgentRoute({ cfg: ctx.cfg, channel: "nochat", accountId: account.accountId, peer: { kind: "dm", id: senderId }, }); const ctxPayload = { Body: body, BodyForAgent: body, RawBody: text, CommandBody: text, BodyForCommands: text, From: `nochat:${senderId}`, To: `nochat:${config.agentId || config.agentName}`, SessionKey: route.sessionKey, AccountId: route.accountId, ChatType: "direct", ConversationLabel: senderName, SenderName: senderName, SenderId: senderId, Provider: "nochat", Surface: "nochat", MessageSid: msg.id, CommandAuthorized: true, // Trust tiers handle authorization }; ``` ### Technical Analysis The active production integration overrides `noChatPlugin.gateway.startAccount` and routes inbound messages through `handleNoChatInbound()`. This path does not ...[truncated 1882 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
src/api/client.ts:102
Finding

Message content labeled as encrypted is only Base64-encoded

Content
View full analysis
{ try { const encoded = Buffer.from(text, "utf-8").toString("base64"); const resp = await fetch(`${this.baseUrl}/api/conversations/${conversationId}/messages`, { method: "POST", headers: this.headers(), body: JSON.stringify({ encrypted_content: encoded, message_type: "text", }), }); ``` ```ts async editMessage(conversationId: string, messageId: string, text: string): Promise { try { const encoded = Buffer.from(text, "utf-8").toString("base64"); const resp = await fetch( `${this.baseUrl}/api/conversations/${conversationId}/messages/${messageId}`, { method: "PUT", headers: this.headers(), body: JSON.stringify({ encrypted_content: encoded }), }, ); ``` ```ts const raw = msg.encrypted_content || ""; const decoded = Buffer.from(raw, "base64").toString("utf-8"); // Handle double base64 encoding try { const double = Buffer.from(decoded, "base64").toString("utf-8"); // If double-decoded looks like text (not gibberish), use it text = /^[\x20-\x7E\n\r\t]/.test(double) && double.length > 0 ? double : decoded; } catch { text = decoded; } ``` ### Technical Analysis Base64 is a reversible representation format, not encryption. The audited send and receive paths contain no authenticated encryption, recipient-key lookup, key encapsulation, signature verification, nonce handling, or ciphertext authentication. The request field is named `encrypted_content`, but it contains only Base64-encoded plaintext. Any server or intermediary that gains access to the request body can recover the original conten ...[truncated 1184 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
index.ts:159
Finding

Inbound sender identity and message authenticity are not cryptographically verified

Content
View full analysis
0 ? double : decoded; } catch { text = decoded; } } catch { text = msg.encrypted_content || "[unreadable message]"; } ``` ```ts SenderName: senderName, SenderId: senderId, Provider: "nochat", Surface: "nochat", MessageSid: msg.id, CommandAuthorized: true, // Trust tiers handle authorization ``` ### Technical Analysis The plugin treats `sender_id` and `sender_name` from the server response as authoritative identity attributes. It does not verify a sender signature, message authentication code, authenticated encryption tag, or public-key fingerprint. Although the trust subsystem accepts an optional fingerprint, the active inbound path neither obtains nor validates one. Bearer authentication of the plugin to the server does not establish end-to-end authenticity of individual messages. A compromised or malicious messaging server can therefore fabricate sender metadata and message content. This risk becomes particularly serious because messages are subsequently marked command-authorized. ### Attack Path 1. An attacker compromises the configured NoChat server, controls a compatible server configured by the user, or gains the ability to modify API responses. 2. The server returns a fabricated message with attacker-selected `send ...[truncated 717 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
index.ts:181
Finding

Decrypted inbound message content is exposed through application logs

Content
View full analysis
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
src/api/client.ts:28
Finding

Bearer credentials are sent to an unrestricted configurable server URL

Content
View full analysis
{ return { Authorization: `Bearer ${this.apiKey}`, "Content-Type": "application/json", }; } ``` ### Technical Analysis The API client accepts an arbitrary `serverUrl` and attaches the configured bearer key to requests sent to that endpoint. The schema requires only that `serverUrl` be a string; the implementation does not require HTTPS, restrict the hostname, reject embedded URL credentials, or otherwise validate the destination. A plain HTTP URL exposes the key and message traffic to network observers. An attacker-controlled HTTPS host receives the bearer key directly. Configurable endpoints may be legitimate for self-hosting, but sending credentials requires explicit transport validation and clear trust boundaries. ### Attack Path 1. The server URL is misconfigured, socially engineered, or modified by an attacker with configuration access. 2. The plugin starts polling the supplied endpoint. 3. `NoChatApiClient` attaches `Authorization: Bearer ` to API requests. 4. An attacker-controlled endpoint records the bearer key and message traffic, or a network observer captures them over HTTP. 5. The stolen key is used to access the victim's conversations or send messages as the victim, subject to server-side key permissions. ### Impact Assessment Exposure of the bearer key may allow unauthorized access to the NoChat account and its conversations. An attacker may be able to retrieve messages, send or modify content, impersonate the agent, and exploit the inbound authorization weakness to infl ...[truncated 33 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
README.md:52
Finding

Registration instructions create a private key at a predictable shared temporary path

Content
View full analysis
/dev/null PUBLIC_KEY=$(openssl ec -in /tmp/agent_private.pem -pubout -outform DER 2>/dev/null | tail -c 65 | base64) ``` ### Technical Analysis The registration procedure writes private-key material to the fixed path `/tmp/agent_private.pem`. Shared temporary directories are commonly writable by multiple local users. A predictable path creates opportunities for pre-creation, symlink attacks, accidental overwrite, or unintended access where permissions and operating-system protections are insufficient. The instructions do not explicitly create a private directory, enforce mode `0600`, move the key into protected persistent storage, or remove the temporary file. Moreover, the audited plugin does not use this key in its message encryption path, which may give users a false sense that the generated key protects message content. ### Attack Path 1. A local attacker anticipates that the setup command will use `/tmp/agent_private.pem`. 2. The attacker monitors the path or attempts to pre-create or redirect it where platform protections permit. 3. The user runs the documented key-generation command. 4. Private-key material remains at the predictable location or is written through an unsafe path. 5. The attacker obtains the key or causes key material to be written to an unintended file. ### Impact Assessment A local attacker may obtain or interfere with the generated identity key. The practical impact depends on how the external NoChat service associates and uses the registered public key. At minimum, the procedure does not meet appropriate private-key handling standards. ]]>
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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 (23)

Known Vulnerable Dependency: vitest==3.2.4 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
96% confidence
Finding

vitest 3.2.4 is flagged for arbitrary file read and possible code execution when the Vitest UI server is enabled, plus the redirect-mock traversal issue inherited from @vitest/mocker. Although this is a development/test dependency, the combination of file-read and execution impact makes it materially dangerous on developer workstations and CI systems if the UI server is exposed or untrusted test content is run.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vitest==3.2.4 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
96% confidence
Finding

The package range ^3.0.0 can resolve to vitest 3.2.4, which is flagged with critical advisories including arbitrary file read and possible code execution when the Vitest UI server or related mocker functionality is exposed. Although vitest is a devDependency, developer tools are often run locally or in CI, and this skill is explicitly an encrypted agent messaging channel extension, increasing sensitivity because secrets, credentials, or source files handled during development could be exposed if a vulnerable test service is started.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The README explicitly promotes a controller/worker model where an owner remote agent gets 'full control' of another agent's main session with full tool access. In an agent framework, this is equivalent to granting remote command authority over the host's most privileged execution context, yet the text presents it as a feature without a strong security warning, approval boundary, or operational safeguards.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The owner-tier configuration examples tell users to add agent IDs to owners but do not prominently warn that this grants full main-session and full-tool access. Because the plugin is explicitly designed to route owner messages into the main session, a mistaken or maliciously influenced trust entry can hand over effective control of the agent environment.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: nanoid==3.3.11 — 3 advisory(ies): CVE-2026-67214 (nanoid: non-secure generators can loop indefinitely with negative size); CVE-2026-67213 (nanoid: custom generators can loop indefinitely when size is zero); CVE-2026-73086 (nanoid: Integer Overflow or Wraparound)

High
Category
Supply Chain
Confidence
84% confidence
Finding

The lockfile includes nanoid 3.3.11, which is flagged for denial-of-service style issues such as infinite loops or integer handling problems in non-secure/custom generator paths. Because nanoid is only a transitive dev dependency here, exploitability depends on whether vulnerable code paths are actually reached, but the dependency is genuinely outdated and affected.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: picomatch==4.0.3 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
88% confidence
Finding

picomatch 4.0.3 is identified as vulnerable to ReDoS and method-injection style glob parsing issues. Since glob patterns are often influenced by file lists, ignore rules, or user/project inputs in tooling, this can enable denial of service or incorrect matching behavior during development or CI.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: postcss==8.5.6 — 4 advisory(ies): CVE-2026-45623 (PostCSS: Arbitrary file read and information disclosure via attacker-controlled ); CVE-2026-69153 (PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappi); CVE-2026-41305 (PostCSS has XSS via Unescaped </style> in its CSS Stringify Output) +1 more

High
Category
Supply Chain
Confidence
90% confidence
Finding

postcss 8.5.6 is flagged for multiple issues including arbitrary file read/information disclosure and XSS-related output handling. Even though this appears as a dev dependency through Vite, PostCSS commonly processes project-controlled CSS and source map inputs, so vulnerable parsing or output paths can become dangerous in local development servers, build pipelines, or preview environments.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: rollup==4.57.1 — 1 advisory(ies): CVE-2026-27606 (Rollup 4 has Arbitrary File Write via Path Traversal)

High
Category
Supply Chain
Confidence
87% confidence
Finding

rollup 4.57.1 is reported vulnerable to arbitrary file write via path traversal. As Rollup is part of the build toolchain, this is most relevant when attacker-controlled paths or crafted project artifacts are processed during builds, where it could overwrite files on developer machines or CI runners.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vite==7.3.1 — 5 advisory(ies): CVE-2026-39365 (Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling); CVE-2026-53571 (vite: `server.fs.deny` bypass on Windows alternate paths); CVE-2026-39363 (Vite Vulnerable to Arbitrary File Read via Vite Dev Server WebSocket) +2 more

High
Category
Supply Chain
Confidence
95% confidence
Finding

vite 7.3.1 is associated with several path traversal and arbitrary file read issues affecting dev-server behavior. This is especially relevant because Vite commonly exposes a local HTTP/WebSocket server during development; if reachable by other users or if used with untrusted content, sensitive local files may be disclosed.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

md
PUBLIC_KEY=$(openssl ec -in /tmp/agent_private.pem -pubout -outform DER 2>/dev/null | tail -c 65 | base64)

# Register your agent
curl -X POST https://nochat-server.fly.dev/api/v1/agents/register \
  -H "Content-Type: application/json" \
  -d "{
    \"name\": \"YourAgentName\",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The setup instructions place the API key directly into persistent plaintext configuration examples without warning about secret exposure via shell history, config files, backups, logs, or repo commits. In practice this can lead to credential theft and unauthorized use of the messaging identity and associated conversations.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The setup instructions direct users to register with and configure a third-party NoChat server, but do not clearly warn that using the plugin sends message traffic and related metadata to infrastructure outside the local OpenClaw environment. Even if message content is end-to-end encrypted, metadata such as agent identifiers, timing, recipient relationships, API usage, and server dependency are still exposed, which can create privacy, security, and compliance risks.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The configuration example includes an API key field but does not warn that it is a secret credential that must be protected from source control, logs, screenshots, and shared configs. If exposed, the key could allow unauthorized use of the NoChat service under the victim agent identity, enabling impersonation, message access within service permissions, or abuse of the associated account.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The code sends authenticated HTTP requests using the configured apiKey and also initializes an API client with that credential. For code-file warning checks, access to sensitive credentials and network transmission should have some visible disclosure; this file does not include an explicit warning or explanatory comment about credential use beyond the generic plugin description.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The code logs inbound message text directly with console.log, which can expose private conversation contents, secrets, tokens, or sensitive instructions to application logs. In an agent-to-agent messaging plugin, this is more dangerous because messages may routinely contain credentials, operational data, or user content that operators do not expect to be retained in plaintext logs.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

This code performs a destructive DELETE request to remove a message, but there is no confirmation prompt, user-facing disclosure, or explicit warning in the surrounding code comments/docstrings. Deleting user messages is an irreversible or safety-relevant action, so the absence of any disclosure matches the missing-warning criterion for code files.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The top-level comment frames this module as merely 'integration glue' conforming to an interface. In practice, the module implements substantive behavior including sending messages to a remote API, probing remote health endpoints, and modifying/deleting account configuration entries, which contradicts the minimal role implied by the documentation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The deleteAccount function performs a destructive operation by removing an account entry from the configuration via delete accounts[accountId]. In this file there is no confirmation prompt, user-facing warning, or explanatory comment indicating that account configuration will be permanently removed.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @vitest/mocker==3.2.4 — 1 advisory(ies): CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Low
Category
Supply Chain
Confidence
93% confidence
Finding

The lockfile pins @vitest/mocker 3.2.4, which is reported as affected by a path traversal/arbitrary file read issue in redirect mock handling. In this repository it is a dev/test dependency rather than production code, which reduces exposure, but it is still a real supply-chain risk if tests or local tooling process attacker-controlled mock paths.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 11)May include surrounding context.

json
"test:watch": "vitest"
  },
  "devDependencies": {
    "vitest": "^3.0.0",
    "typescript": "^5.7.0"
  },
  "openclaw": {

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 12)May include surrounding context.

json
},
  "devDependencies": {
    "vitest": "^3.0.0",
    "typescript": "^5.7.0"
  },
  "openclaw": {
    "extensions": ["./index.ts"],

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
82% confidence
Finding

This test file covers client methods that send conversation content, participant identifiers, reactions, and edits over network requests via fetch, including sendMessage, createConversation, editMessage, deleteMessage, and addReaction. The file contains no confirmation prompt, warning string, or explanatory comment disclosing that user conversation data is transmitted to a remote server, which matches the code-file warning criterion for safety-relevant network operations.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.