Back to skill

Security audit

ETH价格预测

Security checks for vulnerabilities and agentic risk

Overview

This paid ETH prediction skill has real billing and market-data behavior, but it exposes a billing API key and can charge for advertised features that are not implemented.

Review this before installing or running. The skill can contact SkillPay and Binance, may deduct 0.003 USDT per run, publishes a reusable billing credential that should be revoked, and advertises ETF/on-chain features that the code does not actually provide. Do not rely on the output as investment advice, and avoid running unsupported commands until billing validation and feature claims are fixed.

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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/skillpay.js:6
Finding

Hardcoded SkillPay Billing API Credential

Content
View full analysis

Vulnerability Details

File Location: scripts/skillpay.js:5-7, with credential use at scripts/skillpay.js:14-25 and scripts/skillpay.js:33-41
Vulnerability Type: Hardcoded reusable API credential
Risk Level: High

Vulnerable Code

js
const BILLING_API_URL = 'https://skillpay.me';
const BILLING_API_KEY = process.env.SKILLPAY_API_KEY || 'sk_a267a27a1eb8381a762a9a6cdb1ea7d722f9f45f345b7319cfd3cccd9fae35c5';
const SKILL_ID = '31b2db37-8f69-41c4-b5c6-d9cab1d75dab';

The credential is transmitted in billing requests:

js
const resp = await fetch(`${BILLING_API_URL}/api/v1/billing/charge`, {
  method: 'POST',
  headers: {
    'X-API-Key': BILLING_API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    user_id: userId,
    skill_id: SKILL_ID,
    amount: amount,
  }),
});

It is also used to create payment links:

js
const resp = await fetch(`${BILLING_API_URL}/api/v1/billing/payment-link`, {
  method: 'POST',
  headers: {
    'X-API-Key': BILLING_API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ user_id: userId, amount }),
});

Technical Analysis

The source code contains a complete, live-looking SkillPay API credential as a fallback whenever SKILLPAY_API_KEY is not defined. This contradicts the manifest's declaration that the environment variable is required and causes the application to continue with a package-wide shared secret rather than failing securely.

Because the Skill package must be distributed to users for execution, the fallback credential cannot remain confidential. Any party with access to the package can read the key without executing or reverse-engineering the application. The extracted key can then be supplied directly in the X-API-Key header to SkillPay endpoints outside the intended program.

Sending a runtime-provided credential to the declared billing service is necessary for the paid-service model. The excessive behavior is embedding a r ...[truncated 1572 chars]

Remediation
View remediation

Remediation Suggestions

  1. Revoke and rotate the exposed credential immediately; removing it from future versions does not invalidate copies already distributed.
  2. Remove the fallback secret and fail closed when the environment variable is absent:
js
const BILLING_API_KEY = process.env.SKILLPAY_API_KEY;

if (!BILLING_API_KEY) {
  throw new Error('SKILLPAY_API_KEY is required');
}
  1. Supply the replacement credential only through a managed runtime secret store or protected environment configuration.
  2. Restrict the replacement credential to the minimum required Skill ID, endpoints, operation types, charge amount, and request rate where supported.
  3. Do not grant administrative, refund, account-management, or unrelated billing permissions to a client-distributed credential.
  4. Prefer a server-mediated design in which the Skill receives a narrowly scoped, short-lived token rather than a persistent shared API key.
  5. Review SkillPay access and billing logs for use of the exposed key from unexpected clients, addresses, Skill IDs, amounts, or time periods.
  6. Add automated secret scanning to the release process and block publication when credential patterns are detected.

other

Warning
Location
scripts/predict.js:62
Finding

Unsupported ETF Command Is Silently Charged as a Daily Prediction

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:30; scripts/predict.js:62 and scripts/predict.js:89-91
Vulnerability Type: Deceptive billing and command-validation failure
Risk Level: Medium

Vulnerable Code

The documentation advertises an ETF-flow command:

bash
node scripts/predict.js etf

The command parser only recognizes weekly; all other arguments, including etf, are silently mapped to daily:

js
const args = process.argv.slice(2);
const timeframe = args[0] === 'weekly' ? 'weekly' : 'daily';

Billing then occurs before the unsupported request is rejected or validated:

js
const userId = 'user_' + Date.now();

console.log('\n⏳ 检查余额并扣费...');
const chargeResult = await chargeUser(userId, SKILL_PRICE);

There is no ETF-specific execution branch or ETF data source after the charge. Execution proceeds by retrieving Binance price data and generating the ordinary technical prediction.

Technical Analysis

The documented interface tells users that node scripts/predict.js etf displays ETF capital flows. However, the parser recognizes only the weekly argument. Any other value is converted to the daily timeframe without an error.

As a result, an ETF request passes through the normal paid flow and incurs the configured 0.003 USDT charge. After payment, the program returns a daily technical analysis based on Binance market data rather than ETF-flow information.

The wider documentation also advertises Gas fees, DeFi total value locked, on-chain data, and ETF flow analysis. The audited implementation only retrieves ETH/USDT and ETH/BTC public market data from Binance and computes local technical indicators. No implementation for the additional advertised sources exists in the reviewed files.

Attack Path

  1. A user reads SKILL.md and sees the documented ETF-flow command.
  2. The user invokes node scripts/predict.js etf.
  3. The parser evaluates the argument as not equal to weekly and assigns daily.

...[truncated 939 chars]

Remediation
View remediation

Remediation Suggestions

  1. Validate the requested command before initiating any charge.
  2. Reject unknown and unimplemented commands explicitly:
js
const command = process.argv[2] || 'daily';
const supportedCommands = new Set(['daily', 'weekly']);

if (!supportedCommands.has(command)) {
  console.error(`Unsupported command: ${command}`);
  process.exit(1);
}

const timeframe = command;
  1. Remove the ETF command and unsupported on-chain claims from SKILL.md until they are fully implemented.
  2. If ETF mode is implemented, use a distinct execution branch and verify that the required ETF data was successfully obtained before charging or finalizing the charge.
  3. Clearly identify every data source actually used in each prediction.
  4. Use transactional billing: validate the command first, retrieve and validate required data, then charge immediately before delivering the result.
  5. Add refund or charge-reversal handling when downstream data retrieval or prediction generation fails after payment.
  6. Add automated tests confirming that unsupported arguments never trigger chargeUser.
  7. Add integration tests verifying that each documented command returns the documented feature rather than silently falling back to another mode.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (15)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The reported behavior includes external billing API calls, payment-link generation, and credential use, while lacking the core advertised price-prediction capability. In the context of a paid financial skill, this is dangerous because it can function more like a monetization wrapper than the promised service, exposing users to charges and exposing operators to misuse of secrets or deceptive-service concerns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The reported behavior includes external billing API calls, payment-link generation, and credential use, while lacking the core advertised price-prediction capability. In the context of a paid financial skill, this is dangerous because it can function more like a monetization wrapper than the promised service, exposing users to charges and exposing operators to misuse of secrets or deceptive-service concerns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The reported behavior includes external billing API calls, payment-link generation, and credential use, while lacking the core advertised price-prediction capability. In the context of a paid financial skill, this is dangerous because it can function more like a monetization wrapper than the promised service, exposing users to charges and exposing operators to misuse of secrets or deceptive-service concerns.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The reported behavior includes external billing API calls, payment-link generation, and credential use, while lacking the core advertised price-prediction capability. In the context of a paid financial skill, this is dangerous because it can function more like a monetization wrapper than the promised service, exposing users to charges and exposing operators to misuse of secrets or deceptive-service concerns.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The file contains a hardcoded fallback live API key in source code, which is a real secret exposure issue. Anyone with access to the codebase, logs, bundles, or published artifact could extract the key and use the billing service, potentially causing fraudulent charges, service abuse, or compromise of billing data.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code not only reads an API key from the environment but also embeds a fallback secret directly in the file, which defeats secret-management controls. This increases the chance of accidental disclosure and makes the compromise persistent across environments if operators forget to override it.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
82% confidence
Finding

The skill declares access to an environment variable and appears to require networked behavior, but it does not define any explicit tool scope or allowed-tools restrictions. In a paid, externally connected skill, missing capability boundaries increases the chance of overbroad execution, unintended external calls, or secret exposure beyond the documented purpose.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The skill states that each invocation costs money but then presents runnable commands without a clear warning that execution may immediately trigger a charge. This is dangerous because users may unknowingly incur costs, especially when examples are formatted as standard usage commands that appear safe to try.

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 uses Chinese in comments and user-facing signal strings such as '超卖 → 看涨' and '放量上涨 → 看涨' throughout the prediction output. Under the policy, forcing a specific language without user opt-in is a natural-language locale violation unless the constraint is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The code hard-codes the locale 'zh-CN' for time formatting, and the surrounding help/output text is also exclusively in Chinese. This imposes a specific language/locale on users without offering a choice or documenting a justified region-specific constraint.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
83% confidence
Finding

The header comment states the skill is 'ETH预测器专用', indicating a Chinese-language or locale-specific targeting. There is no surrounding text offering language choice or documenting a justified regional constraint, which can violate language/locale policy requirements.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The billing request transmits a user identifier to an external billing API, creating a privacy and compliance risk if users are not informed and the transfer is not minimized. In a paid prediction skill this may be functionally necessary, but the lack of visible notice, consent handling, or data minimization still makes it a legitimate security/privacy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The description, headings, and operational guidance are presented exclusively in Chinese, which effectively forces a specific language on users. The file does not offer an alternative language or explain that the skill is intentionally limited to a Chinese-speaking audience.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

The package description is written only in Chinese ("ETH价格预测 - 日/周级别涨跌方向"), which can imply a language-specific skill experience without any documented user opt-in or stated regional limitation. Under the policy, language constraints should either be optional for the user or clearly justified as region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code's natural-language documentation is entirely in Chinese, including the skill description and function comments, with no indication that the skill is region-specific or that users can choose another language. Under the policy, forcing a specific language without opt-in is a locale/language policy concern.

Content

No source excerpt is available for this finding.