Back to skill

Security audit

Trading upbit skill

Security checks for vulnerabilities and agentic risk

Overview

This is a disclosed Upbit trading bot, but it needs review because it can run unattended real trades and may manage existing account holdings while some safety documentation and sizing controls are inconsistent.

Review before installing. Use dry-run first, restrict Upbit API key permissions and funds, verify whether the bot should be allowed to sell holdings already in the account, and do not rely on the documented percent-based budget split until the implementation is fixed or confirmed. Pin dependencies and use a lockfile before live deployment.

Vulnerability Patterns
  • 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
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • 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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (34)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · .gitignore (reported line 3)May include surrounding context.

text
# secrets
config.json
.env

# node
node_modules

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The code chunk’s primary purpose is indicator calculation, not automated trading. While indicators like RSI, MACD, Bollinger Bands, and ATR could support a trading bot, this snippet only provides analytical helpers and a test CLI. It lacks any exchange access, trading workflow, market scanning, volume ranking, portfolio allocation, or breakout-specific execution logic described in the declaration. Therefore, the description materially overstates and misrepresents what this code actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description is about automated Upbit trading features, but the supplied code does not implement trading, market monitoring, cron-run execution, or budget splitting. Instead, it performs a static local security scan over project files to detect unexpected remote endpoints and verify an allowlisted Upbit host. This is a materially different primary purpose and introduces undeclared filesystem access and auditing behavior unrelated to the stated trading functionality.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description presents a full automated Upbit trading skill with operational features like run-once commands, TopVolume monitoring, and budget allocation logic. The supplied code chunk does not implement those capabilities. It only contains a standalone strategy function that computes a breakout target and basic signal from candle inputs. While this is loosely related to breakout trading, it is materially narrower than the declared purpose and lacks the exchange-specific, automation, monitoring, and budgeting functionality described.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The declared description presents an automated Upbit trading skill with specific trading strategy and monitoring capabilities. The supplied code chunk instead is a standalone test script for inserting or updating mock position records in a local positions.json file. Its primary purpose is test data setup for sell tests, not executing or supporting the described trading strategy in any visible way. This is a material mismatch in purpose and behavior.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 18)May include surrounding context.

md
- `scripts/execution/upbitClient.js` (Upbit HTTP client)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The README documents two different environment variable name pairs for the same Upbit credentials: UPBIT_OPEN_API_ACCESS_KEY/UPBIT_OPEN_API_SECRET_KEY in the security section and UPBIT_ACCESS_KEY/UPBIT_SECRET_KEY in the configuration section. In a trading bot that handles live exchange keys, this inconsistency can cause operators to believe secrets are being injected securely when the application may not read them, leading them to fall back to storing credentials in config.json or running with misconfigured authentication.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding

The manifest declares required environment-variable access but does not expose a clear tool scope such as permissions or allowed-tools. In a skill that handles exchange API credentials and can place trades, unclear capability scoping increases the chance that the platform or user grants broader access than intended and makes review harder.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest requires UPBIT_ACCESS_KEY and UPBIT_SECRET_KEY, but the security guidance tells users to provide UPBIT_OPEN_API_ACCESS_KEY and UPBIT_OPEN_API_SECRET_KEY. This mismatch can cause failed authentication, unsafe debugging, or users placing secrets into config files or other less secure locations when the documented method does not work.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The command documentation for worker_once says it processes BUY/SELL events and updates positions, but does not prominently warn that it may place real trades unless dry-run is enabled. In a trading skill, insufficient warning materially increases the risk of accidental financial loss from operator misuse.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · README.md (reported line 34)May include surrounding context.

md
* 업비트 공용 시세 조회 모듈 (market.js)
 */

const BASE_URL = 'https://api.upbit.com/v1';

/**
 * 마켓 코드 조회 (전체 종목 리스트)

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · SKILL.md (reported line 41)May include surrounding context.

md
* 업비트 공용 시세 조회 모듈 (market.js)
 */

const BASE_URL = 'https://api.upbit.com/v1';

/**
 * 마켓 코드 조회 (전체 종목 리스트)

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/data/marketData.js (reported line 7)May include surrounding context.

js
* 업비트 공용 시세 조회 모듈 (market.js)
 */

const BASE_URL = 'https://api.upbit.com/v1';

/**
 * 마켓 코드 조회 (전체 종목 리스트)

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/execution/upbitClient.js (reported line 24)May include surrounding context.

js
* 업비트 공용 시세 조회 모듈 (market.js)
 */

const BASE_URL = 'https://api.upbit.com/v1';

/**
 * 마켓 코드 조회 (전체 종목 리스트)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The cancelOrder method issues a DELETE request to cancel an order, which is an irreversible or safety-critical trading action. Unlike the buy/sell methods, it has no logging, confirmation prompt, or inline warning comment indicating that cancellation will be performed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This file includes natural-language descriptions and runtime log messages in Korean, such as the header comments and multiple operator-facing status strings. Because the skill does not offer a language or locale choice, it effectively forces a specific language, which matches the policy-violation criteria for locale/language restrictions.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The help output says "config.json required (do not commit)", while the file header at L013-L014 states config.json is optional and non-secret defaults can come from config.example.json. This contradiction can mislead operators about the skill's intended configuration model.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

The cron setup examples require --tz "Asia/Seoul", which imposes a specific locale setting in the skill instructions. The README does not present this as an optional example or offer users a choice of timezone, so it can conflict with organizational language/locale policies.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
96% confidence
Finding

The manifest uses a caret range for axios instead of pinning an exact version, which allows different installations to resolve to different patch/minor releases. In a trading automation skill that handles network requests and likely processes sensitive exchange/API interactions, this weakens supply-chain reproducibility and makes it harder to guarantee that a known-safe version is installed.

Content

Scanner excerpt · package.json (reported line 17)May include surrounding context.

json
"license": "ISC",
  "type": "commonjs",
  "dependencies": {
    "axios": "^1.13.5",
    "jsonwebtoken": "^9.0.3",
    "uuid": "^13.0.0"
  },

Unverifiable Dependency: axios has 16 known advisory(ies) (CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
92% confidence
Finding

axios has multiple known advisories, and because the manifest does not pin an exact version, it is not possible to verify from this file whether the installed release is affected. In a trading bot, an HTTP client issue can be more consequential because it may interact with market data, orders, credentials, or internal network paths.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

jsonwebtoken is declared with a caret range, so consumers may install different releases over time. Because JWT libraries are security-sensitive and this skill likely uses exchange authentication, non-deterministic dependency resolution can expose the skill to vulnerable or behavior-changing versions without code changes.

Content

Scanner excerpt · package.json (reported line 18)May include surrounding context.

json
"type": "commonjs",
  "dependencies": {
    "axios": "^1.13.5",
    "jsonwebtoken": "^9.0.3",
    "uuid": "^13.0.0"
  },
  "bin": {

Unverifiable Dependency: jsonwebtoken has 4 known advisory(ies) (CVE-2022-23539 (jsonwebtoken unrestricted key type could lead to legacy keys usage ); CVE-2015-9235 (Verification Bypass in jsonwebtoken); CVE-2022-23541 (jsonwebtoken's insecure implementation of key retrieval function could lead to F) +1 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
95% confidence
Finding

jsonwebtoken has a history of security advisories, and the unpinned declaration prevents verifying whether a safe release is actually installed. In the context of an automated trading skill, flaws in JWT handling can directly affect authentication integrity, potentially enabling token misuse, verification bypass, or unauthorized API access.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

uuid is also specified with a caret range, permitting version drift across environments. While lower risk than an auth or HTTP client package, unpinned dependencies still increase supply-chain uncertainty and can pull in flawed releases unexpectedly.

Content

Scanner excerpt · package.json (reported line 19)May include surrounding context.

json
"dependencies": {
    "axios": "^1.13.5",
    "jsonwebtoken": "^9.0.3",
    "uuid": "^13.0.0"
  },
  "bin": {
    "trading-upbit-skill": "skill.js"

Unverifiable Dependency: uuid has 1 known advisory(ies) (CVE-2026-41907 (uuid: Missing buffer bounds check in v3/v5/v6 when buf is provided)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
90% confidence
Finding

uuid has at least one known advisory, and the absence of an exact pinned version means the installed package cannot be validated from this manifest alone. The direct security impact is likely lower than for auth/network libraries, but it still represents unverifiable supply-chain risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The file's natural-language comments are written exclusively in Korean, which imposes a specific language choice without any indication that the skill is region-specific or that users can opt into that locale. Under the policy rule for language/locale constraints, this is a natural-language policy concern rather than a code-security issue.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec, suspicious.exposed_secret_literal

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/tests/run_worker_once.js:17

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/execution/upbitClient.js:91

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/workers/eventWorker.js:21

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
scripts/workers/monitor.js:18