T01 · Skill Instruction Hijacking
- Location
SKILL.md:12- Finding
Mutable External Instructions Can Hijack Agent Policy and Tool Selection
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This installer is not clearly malicious, but it makes persistent Claude changes, installs mutable remote code, and can store trading credentials in plaintext.
Install only if you trust Gate's remote services and the live GitHub/npm sources at install time. Prefer `--no-skills` or explicit `--mcp` selections, avoid entering trading API secrets unless necessary, use narrowly scoped/read-only keys where possible, back up `~/.claude.json` and `~/.claude/skills/`, and review the exact cloned skills and package versions before use.
SKILL.md:12Mutable External Instructions Can Hijack Agent Policy and Tool Selection
scripts/install.sh:176Unverified Remote Skills Are Installed into Persistent Agent State
scripts/install.sh:87Unpinned npm Components Are Automatically Installed and Executed
scripts/merge-mcp-config.js:47Trading API Credentials Are Persisted in Plaintext Configuration
scripts/merge-mcp-config.js:9Malformed or Unreadable Existing Configuration Is Silently Overwritten
The top-level description understates the true behavior of the skill: it is not merely informational installation guidance but a persistent config modifier that installs multiple remote services and introduces credential/OAuth flows. This mismatch reduces informed consent and can cause users to approve broad, security-relevant changes they did not realize were included.
Referenced artifact was not completely inspected
- `SKILL.md` keeps product scope, install behavior, and user-facing guidance.
A hard-coded API key is embedded directly in the configuration file, which means anyone with access to the skill source or installed artifact can recover and reuse it. Exposed credentials can enable unauthorized access, abuse of the remote MCP service, billing impact, and make key rotation difficult if the secret is widely distributed.
The README instructs users to run npx -y gate-mcp without pinning a package version, which means installation will always fetch the latest published package. If the upstream npm package is compromised, typo-squatted, or a malicious version is published, users could execute attacker-controlled code during installation or runtime.
This component description again advertises npx -y gate-mcp without a pinned version, creating the same supply-chain exposure for users following the documented setup. Because this skill is specifically an installer, unpinned execution is more dangerous than a casual reference: it directly influences how users launch privileged local tooling.
The skill performs sensitive installer actions, including modifying persistent Claude configuration and handling environment-based credentials, but it declares no explicit tool scope or permissions boundary. In a skill ecosystem, that makes the effective authority ambiguous and increases the chance the agent uses broader capabilities than the user expects during installation.
Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.
## General Rules
⚠️ STOP — You MUST read and strictly follow the shared runtime rules before proceeding.
Do NOT select or call any tool until all rules are read. These rules have the highest priority.
→ Read [gate-runtime-rules.md](https://github.com/gate/gate-skills/blob/master/skills/gate-runtime-rules.md)
- **Only call MCP tools explicitly listed in this skill.** Tools not documented here must NOT be called, even if they
exist in the MCP server.
Using npx -y gate-mcp without pinning a version causes the installer to fetch and execute whatever package version is current at runtime. That creates a supply-chain risk where a malicious, compromised, or breaking upstream release can be installed automatically and granted MCP execution privileges.
The resource definition again specifies npx -y gate-mcp without an exact version, so the resulting local MCP command is non-deterministic and can change over time. Because MCP servers may access user data and credentials, executing an unpinned package meaningfully raises supply-chain compromise risk.
This resource definition includes a fixed x-api-key plus bearer-token authorization for a remote DEX endpoint, indicating the installer will configure authenticated outbound access to an external service. Embedding and distributing a shared static API key in skill content is risky because it normalizes secret-in-config patterns and can expose or misuse a credential across many installations.
| MCP | **Gate** (Local CEX, `main`) | stdio `npx -y gate-mcp`, env `GATE_API_KEY` / `GATE_API_SECRET` — [gate-mcp](https://github.com/gate/gate-mcp) |
| MCP | **gate-cex-pub** (`cex-public`) | `https://api.gatemcp.ai/mcp`, HTTP, `type`+`url` only (no headers), no auth |
| MCP | **gate-cex-ex** (`cex-exchange`) | `https://api.gatemcp.ai/mcp/exchange`, HTTP, `type`+`url` only; Gate OAuth2 on first use |
| MCP | **Gate-Dex** (`dex`) | `https://api.gatemcp.ai/mcp/dex`, fixed `x-api-key` + `Authorization: Bearer ${GATE_MCP_TOKEN}` |
| MCP | **Gate-Info** (`info`) | `https://api.gatemcp.ai/mcp/info` |
| MCP | **Gate-News** (`news`) | `https://api.gatemcp.ai/mcp/news` |
| Skills | gate-skills | https://github.com/gate/gate-skills (installs all under `skills/`) |
The skill explicitly writes to user-level Claude configuration, creating persistent changes that survive the current session and alter future tool behavior. Persistent configuration of multiple MCP servers is security-relevant because it broadens future trust boundaries and can silently affect later sessions if the user forgets the change was made.
- If the user does not specify which MCPs → install all: `main`, `cex-public`, `cex-exchange`, `dex`, `info`, `news`.
- If the user specifies "only install xxx" → install only the specified MCPs.
### 2. Write Claude Code MCP Config
- User-level config: `~/.claude.json` (Windows: `%USERPROFILE%\.claude.json`). If using directory format, use the corresponding config under `~/.claude/`.
- If it already exists, **merge** into the existing `mcpServers`; do not overwrite other MCPs.
The install instructions do not provide an upfront warning that running the installer will persistently modify ~/.claude.json and copy content into ~/.claude/skills/. For an installer skill, lack of front-loaded disclosure is a safety issue because users may not realize the scope and persistence of the changes before execution.
The skill instructs pulling all subdirectories from a remote repository and copying them into the active Claude skills directory, effectively importing a large, changing set of executable skill content. Bulk installation of unreviewed remote skills expands the trusted code base and creates a broad supply-chain and privilege-escalation surface.
### 3. Install gate-skills (all)
- Pull all subdirectories under **skills/** from https://github.com/gate/gate-skills and copy them to `~/.claude/skills/` (or the corresponding directory for the current environment).
- Add `--no-skills` when using the script to install MCP only without skills.
### 4. Post-Installation Prompt
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.
1. Never overwrite unrelated existing MCP config blocks.
2. If merge conflicts occur, stop and provide manual remediation.
3. Do not claim successful install without verification.
4. Keep secrets out of logs and user-visible output.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# Gate Claude Code One-Click Installer: MCP + all gate-skills
# Usage: install.sh [--mcp main|cex-public|cex-exchange|dex|info|news] ... [--no-skills]
# main = Local stdio gate-mcp (GATE_API_KEY / GATE_API_SECRET)
# cex-public = Remote https://api.gatemcp.ai/mcp (public market data, no auth)
# cex-exchange = Remote https://api.gatemcp.ai/mcp/exchange (CEX private tools, Gate OAuth2)
# Installs all MCPs when no --mcp is passed. DEX uses fixed x-api-key: MCP_AK_8W2N7Q
No suspicious patterns detected.