Back to skill

Security audit

Brawlnet Arena

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly aligned with a remote bot-combat arena, but it under-discloses autonomous long-running play modes and handles bearer tokens unsafely on the command line.

Review this skill before installing if you are not comfortable sending bot credentials to the BRAWLNET service. Prefer short-lived or disposable tokens, avoid putting real secrets directly in shell commands, and be aware that undocumented play/gatekeeper modes can continue sending authenticated requests and game actions until they finish.

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
client.js:3
Finding

Bearer Authentication Tokens Exposed Through Command-Line Arguments

Content
View full analysis
``` ```bash node client.js action ``` The long-running gatekeeper mode also retains the token in `process.argv` and reuses it when entering the play loop at `client.js:137-140`: ```js if (matchId) { // We reuse the play logic process.argv = [process.argv[0], process.argv[1], 'play', matchId, botId, token]; await run(); } ``` ### Technical Analysis Bearer tokens grant their holder the abi ...[truncated 2624 chars]
Remediation
View remediation
``` The implementation should verify that a token file has restrictive permissions before reading it. If an environment variable is used, documentation should warn that some process-launch environments and CI systems may record environment values. 4. **Avoid retaining secrets in `process.argv`.** Do not rewrite `process.argv` with the token when transitioning from `gatekeeper` to `play`. Refactor the shared play logic into a function and pass credentials through an in-memory parameter: ```js async function play(matchId, botId, token) { // Shared play implementation } ``` 5. **Prevent accidental disclosure.** Redact authorization values from errors, debug logs, telemetry, crash reports, and HTTP tracing. Continue avoiding printing the token in normal output. 6. **Support revocation and rotation.** Document how users can revoke a potentially exposed token and obtain a replacement. Tokens should be short-lived and scoped only to the minimum bot operations required by the Skill. 7. **Validate secure transport.** Continue using HTTPS for the declared API and do not disable TLS certificate verification. ]]>
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 (7)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README advertises auto-registration and real-time telemetry to an external service without clearly warning users that using the skill may create an external account/identity and transmit data over the network. In an agent ecosystem, this can lead to unintended outbound connections, unexpected data disclosure, or actions performed on behalf of the user without informed consent.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill exposes network-capable commands via a Node.js client and an external API base URL, but it does not declare any explicit tool scope such as permissions or allowed-tools. In an agent environment, this can lead to unintended external connectivity, making it easier for the skill to trigger outbound requests without clear sandboxing or operator awareness.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This command sends a bearer token to a remote service without any user-facing disclosure, confirmation, or explanation of where the credential is being transmitted. In a skill ecosystem, hidden credential transmission is risky because users may pass sensitive tokens to third-party infrastructure they do not fully trust, enabling account misuse if the endpoint or surrounding supply chain is compromised.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The manifest describes the skill as the official combat protocol for the arena, which implies an interface for interacting with BRAWLNET. Beyond basic protocol operations like register, join, action, and status, the code implements a full autonomous player (play) and a persistent matchmaking/auto-play controller (gatekeeper) that makes tactical decisions and continuously acts on behalf of the user.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The play loop performs repeated authenticated requests in an autonomous loop, continuously sending the bearer token and issuing actions without additional user awareness once started. In this context, the autonomous behavior makes the risk more serious because a user may initiate one command but unknowingly authorize prolonged remote activity and credential use against an external service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The matchmaking loop repeatedly transmits the bearer token to the remote queue endpoint every 5 seconds until matched, again without explicit warning or bounded retry behavior. This increases credential exposure and can create persistent background communication patterns that users may not expect, especially in a skill presented as a protocol client rather than an autonomous agent runner.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

The inline comment says the code fetches public match status from a GET endpoint, suggesting behavior scoped to the requested matchId. In reality, the code calls /queue with no matchId and returns queue data plus a constructed dashboard URL, which contradicts the documented intent of the comment.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.