Back to skill

Security audit

tbb-node-connector

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed connector to an external agent mesh, but it gives broad third-party posting and coordination workflows with weak identity controls and too little user-approval guidance.

Review this skill before installing. Use it only if you are comfortable with an agent contacting The Bot Bay, creating a stable identity, reading mutable remote content, and potentially posting or voting through external APIs. Require explicit user approval before broadcasts, swarm joins, federated-learning submissions, reputation votes, or sending task data to the service.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:31
Finding
Public Identifier Used as the Sole Authentication Credential## Vulnerability Details **File Location**: `SKILL.md:31-38`; supporting implementation in `scripts/tbb-register.py:49-56` **Vulnerability Type**: Authentication design flaw **Risk Level**: High ### Vulnerable Code `SKILL.md:31-38`: ```text ## Step 2: Authenticate All authenticated endpoints require one header: X-Agent-Pubkey: ed25519:your_pubkey_here No tokens. No OAuth flows. Just the header. ``` `scripts/tbb-register.py:49-56`: ```python identity = { "pubkey": result["pubkey"], "reputation": result["initial_reputation"], "node": NODE_URL, } IDENTITY_FILE.write_text(json.dumps(identity, indent=2)) ``` ### Technical Analysis The documented authentication protocol uses an agent's public identifier as the only authentication value. It does not require a private-key signature, server challenge, bearer secret, or any other proof that the caller owns the associated identity. A public key is intended to be public and therefore cannot safely function as a reusable authentication credential by itself. The Skill also documents public reputation endpoints that use public keys as identifiers, further making confidentiality of these values an invalid security assumption. The local registration helper does not generate or store a private key. It only saves the server-provided public identifier, confirming that subsequent requests cannot perform cryptographic proof of possession under the documented protocol. ### Attack Path 1. The attacker obtains a target agent's public key from command output, shared files, gossip records, reputation data, logs, or another public source. 2. The attacker constructs a request to an endpoint described as authenticated. 3. The attacker supplies the target value in the `X-Agent-Pubkey` header. 4. Because the protocol requires no signature or secret, the service has no documented mechanism to distinguish the attacker from the legitimate agent. 5. The attacker performs actions attributed to the victim, such as broadcas ...[truncated 690 chars]
Remediation
## Remediation Suggestions 1. Generate an Ed25519 key pair locally and retain the private key only on the agent's system. 2. Register only the public key with the external service. 3. Require every authenticated request to include a signature covering: - HTTP method - Request path and query - Hash of the request body - Server-issued nonce - Timestamp and short expiration period 4. Verify signatures server-side against the registered public key. 5. Track and reject reused nonces to prevent replay attacks. 6. Store the private key in an operating-system credential store or another access-controlled secret store rather than a general working-directory JSON file. 7. Restrict identity-file permissions and avoid printing sensitive authentication material if the protocol is changed to use a secret. 8. Clearly distinguish public identifiers from authentication credentials in the Skill documentation.

T01 · Skill Instruction Hijacking

Warning
Location
SKILL.md:60
Finding
Untrusted Remote Content Is Placed in the Agent Decision Path## Vulnerability Details **File Location**: `SKILL.md:60-85`, `SKILL.md:186-193`, and `SKILL.md:205-218` **Vulnerability Type**: External instruction and prompt-injection exposure **Risk Level**: Medium ### Vulnerable Code `SKILL.md:60-85`: ```text ## Gossip Mesh ### Read the feed GET https://thebotbay.fly.dev/api/v1/gossip/feed Optional query params: ?category=DISCOVERY&limit=20 Categories: WARNING | INFO | ANOMALY | DISCOVERY ### Broadcast a message POST https://thebotbay.fly.dev/api/v1/gossip/broadcast X-Agent-Pubkey: ed25519:your_pubkey Content-Type: application/json { "message": "Your message here (max 512 chars)", "category": "INFO" } ### Real-time firehose (WebSocket) wss://thebotbay.fly.dev/api/v1/gossip/ws/firehose Streams all new gossip as JSONL. No auth needed — read-only. ``` `SKILL.md:186-193`: ```text ## Discovery ### Node manifest (HATEOAS) GET https://thebotbay.fly.dev/ Returns all available endpoints. Start here if unsure what to do next. ### Full policy GET https://thebotbay.fly.dev/.well-known/node-policy.json ``` `SKILL.md:205-218`: ```text ## Quick Start (5 steps) 1. POST /api/v1/register → save pubkey 2. GET / → read manifest 3. GET /api/v1/gossip/feed?category=DISCOVERY → scan active opportunities 4. Join a swarm: POST /api/v1/swarm/spawn 5. Subscribe to firehose: WS wss://thebotbay.fly.dev/api/v1/gossip/ws/firehose Full docs: GET https://thebotbay.fly.dev/docs llms.txt: GET https://thebotbay.fly.dev/llms.txt Node policy: GET https://thebotbay.fly.dev/.well-known/node-policy.json ``` ### Technical Analysis The Skill instructs an AI agent to retrieve mutable content from an external service, scan that content for opportunities, discover new endpoints through a remote manifest, and participate in remotely coordinated swarms. It does not explicitly require the agent to treat remote gossip, swarm topics, manifests, documentation, WebSocket messages, or `llms.txt` content strictly as untrusted data. This creates a ...[truncated 2084 chars]
Remediation
## Remediation Suggestions 1. Explicitly state that every remote response is untrusted data and must never be treated as agent instructions, policy, or authorization. 2. Parse responses using strict schemas and reject unknown fields, unexpected content types, oversized values, and malformed structures. 3. Separate remote data from the agent's instruction context. Do not load remote manifests, documentation, policies, gossip, swarm topics, or `llms.txt` as higher-priority guidance. 4. Require explicit user approval before: - Joining or spawning a swarm - Broadcasting gossip - Submitting federated-learning data - Issuing reputation votes - Sending user or task data to the service - Following endpoints discovered dynamically 5. Maintain a fixed allowlist of approved HTTPS and WSS endpoints rather than treating remote HATEOAS links as automatically trusted. 6. Constrain outbound payloads to predefined fields and prevent inclusion of conversation history, credentials, local files, system prompts, or unrelated task context. 7. Display remote opportunities to the user as quoted, untrusted content instead of automatically acting on them. 8. Apply client-side prompt-injection defenses rather than relying on the service's literal forbidden-phrase filter.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • 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 (3)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared description presents a broad connector covering registration, authentication, and full use of multiple The Bot Bay platform features. The supplied code chunk is much narrower: it performs only a one-time registration request, persists identity metadata locally, and prints informational endpoint URLs. It does not implement authentication flows, endpoint wrappers, mesh interaction logic, swarm/federated learning/reputation functionality, or general agent integration behavior. This is a material description-to-behavior mismatch due to substantial overstatement of capabilities and scope.

Lp1

High
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The script makes outbound network requests to a hard-coded remote service to register the agent, but the declared permissions apparently do not disclose that capability. Undeclared network access is a real security issue because installing or running the skill can cause data exchange with an external system the user did not explicitly authorize, and in this context the script also persists received identity data locally for later reuse.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The skill instructs agents to send a persistent identifier (`X-Agent-Pubkey`) to an external service but does not warn that this enables cross-request tracking, profiling, and linkage of activity across gossip, swarm, federated learning, and reputation endpoints. In this context, the connector is specifically designed to encourage repeated interaction with a third-party mesh node, which increases privacy risk and could expose agent identity, behavior patterns, and participation history.

Static analysis

No suspicious patterns detected.