Back to skill

Security audit

ORBCAFE Pivot + AINav

Security checks for vulnerabilities and agentic risk

Overview

This skill is a small documentation-only helper for ORBCAFE pivot tables and voice navigation, with one production-safety note around its local WebSocket example.

Before installing or using this skill, treat the voice WebSocket URL as a development placeholder. For real applications, configure the ASR endpoint outside the copied recipe, use authenticated secure transport for non-local endpoints, show clear microphone state and consent, and require confirmation for sensitive voice-triggered actions.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
references/recipes.md:41
Finding
Hardcoded Plaintext WebSocket Endpoint in Voice Navigation Recipe<![CDATA[ ## Vulnerability Details **File Location**: `references/recipes.md:41-50` **Vulnerability Type**: Hardcoded plaintext ASR WebSocket endpoint **Risk Level**: Medium ### Vulnerable Code ```tsx <CAINavProvider onVoiceSubmit={async (text) => { await routeByIntent(text); }} onVoiceError={(err) => console.error(err)} longPressMs={200} wsUrl="ws://localhost:8765" > {children} </CAINavProvider>; ``` ### Technical Analysis The voice-navigation recipe assigns the ASR endpoint using a hardcoded `ws://localhost:8765` URL. The `ws://` scheme does not provide transport encryption or endpoint authentication. The example also provides no mechanism for authenticating the ASR service. This contradicts the project's own requirement in `references/guardrails.md:18`, which states that the WebSocket URL and ASR authentication must come from application configuration rather than hardcoded values. Because this file is an implementation recipe intended to be copied into generated applications, developers may deploy the pattern without validating the endpoint, enforcing secure transport, or authenticating the receiving service. Although the example points to localhost, a process under another user's control or a compromised local process may bind to the expected port. If developers replace the host but retain the plaintext scheme, network-positioned attackers may intercept or modify the WebSocket traffic. ### Attack Path 1. A developer copies the voice-navigation recipe into an application. 2. The application opens an unauthenticated plaintext connection to `ws://localhost:8765`. 3. An attacker-controlled or compromised local process listens on port `8765`, or the endpoint is changed to a remote host while retaining `ws://`. 4. The application connects to the untrusted service without validating its identity. 5. Voice-related data sent through the ASR channel may be observed, retained, or manipulated by the attacker. 6. Manipulated ASR responses may be ...[truncated 824 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Load the ASR endpoint from validated application configuration rather than embedding it in the recipe. 2. Require `wss://` for every non-local endpoint and reject plaintext transport in production. 3. Authenticate the ASR service using an appropriate short-lived credential or authenticated session mechanism. 4. Validate the configured URL against an explicit allowlist of trusted schemes and hosts. 5. Fail closed when the endpoint, transport security, or authentication configuration is absent or invalid. 6. Avoid placing reusable secrets directly in client-side source code. Obtain short-lived connection credentials from a trusted backend when necessary. 7. Validate ASR responses before passing them to `routeByIntent`, and require explicit user confirmation and authorization checks for sensitive actions. 8. Replace the recipe with a configuration-driven example, such as: ```tsx const asrUrl = getRequiredAsrWebSocketUrl(); if (isProduction && !asrUrl.startsWith('wss://')) { throw new Error('A secure ASR WebSocket endpoint is required'); } <CAINavProvider onVoiceSubmit={async (text) => { await routeByIntent(validateVoiceIntent(text)); }} onVoiceError={handleVoiceError} longPressMs={200} wsUrl={asrUrl} > {children} </CAINavProvider>; ``` ]]>
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
Confidence
90% confidence
Finding
The example captures spoken input, converts it to text, and forwards that text to a WebSocket endpoint without showing any consent flow, privacy notice, or transport security requirement. Because voice input often contains sensitive personal or business data, this pattern can lead developers to implement silent collection and transmission of user speech, especially since the sample uses insecure ws:// rather than authenticated and encrypted transport.

Static analysis

No suspicious patterns detected.