Back to skill

Security audit

Roblox

Security checks for vulnerabilities and agentic risk

Overview

This Roblox CLI largely matches its stated purpose, but its documented launch command downloads and runs an unpinned runtime while a powerful Roblox API key may be present.

Review before installing. Use a Roblox API key limited to only the needed experiences and permissions, prefer separate read-only and write-capable keys, and avoid running the documented `npx -y bun` form with secrets exposed unless you trust the current npm-resolved runtime. A pinned or preinstalled Bun runtime plus explicit confirmation for write commands would materially reduce risk.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
SKILL.md:32
Finding
Unpinned Runtime Package Is Downloaded and Executed on Every Invocation<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:32-34` **Vulnerability Type**: Supply-chain risk from unpinned remote package execution **Risk Level**: Medium ### Vulnerable Code ```markdown The skill is invoked via: ```bash npx -y bun ${SKILL_DIR}/scripts/cli.ts [command] [subcommand] [args] [options] ``` ``` The same unpinned `npx -y bun` invocation is repeated in the usage examples at `SKILL.md:40-72`. ### Technical Analysis The documented execution mechanism instructs users or agents to run the npm package named `bun` through `npx` without specifying an exact version or enforcing package integrity. The `-y` option suppresses the installation confirmation. Consequently, the code executed before the local CLI starts is determined dynamically by the package registry at invocation time. The project contains no lockfile or integrity metadata that constrains this downloaded runtime package to the version reviewed during the audit. This behavior creates a supply-chain trust boundary: compromise of the relevant package, registry account, package distribution infrastructure, or dependency resolution path could cause arbitrary third-party code to run. That code would execute in the same process environment in which the Skill expects `ROBLOX_API_KEY` to be available. This is distinct from the Skill's intentional Roblox API traffic. The API client sends the key only in an `x-api-key` header to fixed HTTPS endpoints under `apis.roblox.com`, which is necessary for the declared functionality. The tests replace `globalThis.fetch` with mocks and use non-production fixture keys. ### Attack Path 1. An attacker compromises or maliciously modifies the npm package resolved by `npx -y bun`, its publishing account, or the applicable package-resolution infrastructure. 2. A user or agent follows the documented command while `ROBLOX_API_KEY` is set. 3. `npx` downloads the currently resolved package without interactive confirmation and without an exact revie ...[truncated 1122 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not download a runtime package dynamically for each Skill invocation. Prefer a separately installed, trusted Bun executable: ```bash bun ${SKILL_DIR}/scripts/cli.ts [command] [subcommand] [args] [options] ``` 2. Declare the required Bun version in installation documentation and verify it before execution: ```bash bun --version ``` 3. If npm-based acquisition is unavoidable, pin an exact reviewed version rather than using an unconstrained package: ```bash npx -y bun@<exact-reviewed-version> ${SKILL_DIR}/scripts/cli.ts [command] [subcommand] [args] [options] ``` 4. Commit and enforce a lockfile with integrity hashes where the selected package manager supports it. Installation should use immutable or frozen-lockfile mode. 5. Install and verify the runtime before exposing `ROBLOX_API_KEY` to the process. Avoid placing sensitive credentials in the environment of package-installation steps. 6. Restrict the Roblox API key to only the required permissions and experiences. Use separate read-only and write-capable keys where operationally possible, and rotate the key if supply-chain compromise is suspected. 7. Update all command examples at `SKILL.md:40-72` so they no longer encourage repeated unpinned package retrieval. ]]>
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (15)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The declared purpose is specifically about managing game passes and developer products. This code does not interact with passes or developer products; its primary behavior is to list games associated with the API key owner. That is a materially different capability and resource focus, so the description does not accurately represent the supplied code chunk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding
The implemented behavior is consistent with Roblox game pass management: listing passes, fetching a pass by ID, creating a pass, and updating a pass. However, the declared description says the skill manages both game passes and developer products via the Open Cloud API. In this code chunk, only game pass operations are present; there is no developer product functionality. That makes the description broader than the demonstrated behavior. No unrelated or suspicious capabilities are present beyond game pass management.

Lp3

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding
The skill explicitly requires an environment secret and performs networked API actions, but it does not declare a restrictive tool scope such as allowed tools or permissions. That increases the chance the skill can be executed with broader capabilities than intended, making secret exposure or unintended outbound actions harder to govern in the hosting agent environment.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding
Using `npx -y bun` without a pinned version causes execution to depend on whatever package/version is resolved at runtime. If the upstream package changes or a supply-chain compromise occurs, the skill may run attacker-controlled code with access to the Roblox API key and network capabilities.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
This code exposes `passes create`, `passes update`, `products create`, and `products update` commands that will modify remote Roblox resources, but the visible help text does not warn that these commands make live changes. In this file there is no confirmation prompt, cautionary log, or inline disclosure before dispatching the write operations, so a user may invoke destructive or unintended changes without clear notice.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"type": "module",
  "dependencies": {},
  "devDependencies": {
    "@types/node": "^25.4.0"
  }
}
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Static analysis

No suspicious patterns detected.