Back to skill

Security audit

RustChain MCP

Security checks for vulnerabilities and agentic risk

Overview

The skill matches its stated blockchain/video/messaging purpose, but it handles sensitive tokens and posting actions with insecure network settings and includes an under-disclosed promotional outreach script.

Review this before installing if you will provide API keys, relay tokens, admin keys, wallet signatures, or allow an agent to post publicly or spend RTC gas. Prefer a version that enables TLS verification, pins dependencies, clearly labels state-changing tools, and removes or separately discloses the evangelist outreach script.

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

T09 · Insecure Skill Coding Practices

Error
Location
rustchain_mcp/server.py:53
Finding

Disabled TLS Certificate Verification in MCP Network Client

Content
View full analysis
httpx.Client: global _client if _client is None: _client = httpx.Client(timeout=RUSTCHAIN_TIMEOUT, verify=False) return _client ``` This shared client is subsequently used for sensitive calls, including: ```python r = get_client().post( f"{BEACON_URL}/relay/message", json=envelope, headers={"Authorization": f"Bearer {relay_token}"}, ) ``` ### Technical Analysis Setting `verify=False` disables HTTPS certificate-chain and hostname validation for every request made through the shared MCP client. Encryption without peer authentication does not establish that the client is communicating with the intended RustChain, BoTTube, or Beacon server. The affected request surface includes: - BoTTube API keys used for uploads, comments, and votes. - Beacon relay tokens used for heartbeats and messages. - Beacon administrative keys used for gas deposits. - Private agent message content. - Wallet addresses, signatures, public keys, memos, and transaction metadata. - Agent registration details and webhook URLs. The remote operations themselves are consistent with the Skill's declared functionality. However, disabling certificate verification is not necessary for those operations and weakens the security boundary protecting all transmitted credentials and data. ### Attack Path 1. An attacker obtains a network interception position, such as control of an untrusted Wi-Fi access point, proxy, compromised router, or DNS/network route. 2. The attacker intercepts a connection to a configured RustChain, BoTTube, or Beacon endpoint. 3. The attacker presents an arbitrary or self-signed TLS certificate. 4. Because the client uses `verify=False`, the certificate is accepted wi ...[truncated 1024 chars]
Remediation
View remediation
httpx.Client: global _client if _client is None: _client = httpx.Client(timeout=RUSTCHAIN_TIMEOUT) return _client ``` 2. Replace the default IP-address endpoint with a trusted hostname whose certificate contains the matching DNS name. 3. If a private certificate authority is required, configure an explicit CA bundle: ```python _client = httpx.Client( timeout=RUSTCHAIN_TIMEOUT, verify="/path/to/trusted-ca.pem", ) ``` 4. Reject plaintext `http://` endpoints for requests that carry credentials or financial data. 5. Consider an allowlist for production endpoints, especially for calls using relay tokens or administrative keys. 6. Use short-lived, narrowly scoped credentials and provide token revocation and rotation procedures. 7. Add automated tests asserting that certificate errors are not ignored. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
rustchain_langchain/tools.py:36
Finding

Disabled TLS Certificate Verification in LangChain Tools

Content
View full analysis
dict: """Make GET request with error handling.""" r = requests.get(url, params=params, timeout=timeout, verify=False) r.raise_for_status() return r.json() def _post(url: str, json_data: dict, headers: dict = None, timeout: int = 30) -> dict: """Make POST request with error handling.""" r = requests.post(url, json=json_data, headers=headers, timeout=timeout, verify=False) r.raise_for_status() return r.json() ``` The vulnerable POST helper transmits the BoTTube API key: ```python data = _post( f"{BOTTUBE_URL}/api/v1/videos", json_data={"title": title, "video_url": video_url, "description": description, "tags": tags}, headers={"Authorization": f"Bearer {api_key}"}, ) ``` ### Technical Analysis Both generic HTTP helpers explicitly disable TLS certificate validation. The `_post` helper is used to transmit a bearer API key and user-provided upload metadata. The `_get` helper also transmits wallet identifiers, search queries, and other user-supplied parameters without authenticating the remote HTTPS service. Because `BOTTUBE_URL`, `RUSTCHAIN_NODE`, and `BEACON_URL` are configurable, redirection to alternative endpoints is an expected administrative feature. It does not justify disabling TLS validation. The code should securely validate whichever endpoint the operator intentionally configures. ### Attack Path 1. A user configures or uses the LangChain tools with a valid `BOTTUBE_API_KEY`. 2. The tools initiate an HTTPS upload request using `_post`. 3. A network-positioned attacker intercepts the request and presents an untrusted certificate. 4. The `requests` client accepts the certificate because `verify=False`. 5. The attacker capt ...[truncated 617 chars]
Remediation
View remediation
dict: r = requests.get(url, params=params, timeout=timeout) r.raise_for_status() return r.json() def _post(url: str, json_data: dict, headers: dict = None, timeout: int = 30) -> dict: r = requests.post(url, json=json_data, headers=headers, timeout=timeout) r.raise_for_status() return r.json() ``` 2. Use a specific trusted CA bundle if the RustChain deployment relies on private PKI. 3. Validate that credential-bearing endpoints use HTTPS. 4. Optionally restrict credential-bearing calls to an operator-configured hostname allowlist. 5. Use a dedicated `requests.Session` with secure defaults and centralized timeout configuration. 6. Add tests that confirm self-signed, expired, and hostname-mismatched certificates are rejected. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
evangelist_agent.py:49
Finding

Disabled TLS Verification Exposes Moltbook API Credential

Content
View full analysis
Remediation
View remediation

other

Warning
Location
evangelist_agent.py:218
Finding

Bundled Autonomous Agent Performs Recurring Unsolicited Promotional Outreach

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Output HandlingUnvalidated Output Injection, Cross-Context Output, Unbounded Output
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (25)

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The shared HTTP client is created with TLS certificate verification explicitly disabled via verify=False, which allows man-in-the-middle interception and spoofing of HTTPS endpoints. In this skill, the server handles wallet operations, relay tokens, API keys, and agent messaging to remote services, so a network attacker could tamper with responses or capture sensitive data and credentials.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
74% confidence
Finding

The README promotes persistent agent-facing capabilities such as wallet creation, registration, messaging, and gas management, implying that the MCP server may establish durable identities or state across sessions without explaining lifecycle, storage, or consent boundaries. In an agent environment, undocumented persistence can lead to unintended identity reuse, lingering credentials, or actions being performed under a previously created wallet or agent identity.

Content

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

md
## What Can Agents Do?

### RustChain (Blockchain)
- **Create wallets** — Zero-friction wallet creation for AI agents (no auth needed)
- **Check balances** — Query RTC token balances for any wallet
- **View miners** — See active miners with hardware types and antiquity multipliers
- **Monitor epochs** — Track current epoch, rewards, and enrollment

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The README advertises capabilities that can send messages, transfer tokens, upload content, comment publicly, and spend RTC gas without clearly warning users that these actions may have financial cost, privacy impact, or irreversible public side effects. In an agent skill context, this is dangerous because users or autonomous agents may invoke these tools assuming they are informational, leading to unintended spending, posting, or data disclosure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill advertises capabilities that can move blockchain assets, register identities, send agent-to-agent messages, upload videos, comment, and vote, but it provides no warning about transactional, financial, reputational, or irreversible side effects. This is especially risky because users or downstream agents may invoke these tools assuming they are informational, while the actual actions can spend funds, publish public content, or alter on-chain state.

Content

No source excerpt is available for this finding.

Unbounded Output

Medium
Category
Output Handling
Confidence
80% confidence
Finding

Output size or generation rate is not bounded. Unbounded output enables denial-of-service through resource exhaustion, log flooding, or context-window stuffing.

Content

Scanner excerpt · evangelist_agent.py (reported line 40)May include surrounding context.

python
BOTTUBE_KEY = os.environ.get("BOTTUBE_API_KEY", "")

INTERVAL_SECONDS = 3600  # 1 hour between runs
MAX_PINGS_PER_RUN = 5    # Don't spam

logging.basicConfig(
    level=logging.INFO,

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
99% confidence
Finding

The global HTTP client disables TLS certificate verification with verify=False, which allows man-in-the-middle interception and tampering of all HTTPS traffic to the configured services. In this skill, that affects agent discovery, health/stat fetching, outbound pings, and authenticated Moltbook posting, so an attacker on the network path could spoof data, redirect outreach, or steal API bearer tokens.

Content

Scanner excerpt · evangelist_agent.py (reported line 49)May include surrounding context.

python
)
log = logging.getLogger("evangelist")

client = httpx.Client(timeout=30, verify=False)


# ── Discovery ─────────────────────────────────────────────────

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The agent automatically discovers third-party agents and sends unsolicited outbound pings without explicit operator confirmation, recipient allowlisting, or meaningful consent controls. In context, this creates abuse and spam potential, can damage reputation, and could be used to mass-contact arbitrary identifiers returned by untrusted discovery sources.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill description is broad and lacks clear invocation boundaries or user-intent constraints, so an agent could invoke it in loosely related conversations about crypto, balances, miners, or network status without the user explicitly asking to use this service. Even though the exposed operations are read-only, ambiguous activation can still cause unintended data lookups, unnecessary external requests, and disclosure of user-supplied miner identifiers to a third-party endpoint.

Content

No source excerpt is available for this finding.

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
99% confidence
Finding

Disabling TLS certificate verification on all GET requests makes HTTPS connections vulnerable to man-in-the-middle interception and spoofing. An attacker on the network path can tamper with responses, harvest queried data, or redirect the tool to malicious content while the client incorrectly treats the connection as trusted.

Content

Scanner excerpt · rustchain_langchain/tools.py (reported line 38)May include surrounding context.

python
def _get(url: str, params: dict = None, timeout: int = 30) -> dict:
    """Make GET request with error handling."""
    r = requests.get(url, params=params, timeout=timeout, verify=False)
    r.raise_for_status()
    return r.json()

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% 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 · rustchain_langchain/tools.py (reported line 45)May include surrounding context.

python
def _post(url: str, json_data: dict, headers: dict = None, timeout: int = 30) -> dict:
    """Make POST request with error handling."""
    r = requests.post(url, json=json_data, headers=headers, timeout=timeout, verify=False)
    r.raise_for_status()
    return r.json()

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
99% confidence
Finding

Disabling TLS verification on POST requests is especially dangerous because it exposes both transmitted payloads and sensitive headers such as bearer tokens to interception or modification. In this file, that risk directly affects authenticated actions like video upload and agent messaging, allowing credential theft, request tampering, or forged responses.

Content

Scanner excerpt · rustchain_langchain/tools.py (reported line 45)May include surrounding context.

python
def _post(url: str, json_data: dict, headers: dict = None, timeout: int = 30) -> dict:
    """Make POST request with error handling."""
    r = requests.post(url, json=json_data, headers=headers, timeout=timeout, verify=False)
    r.raise_for_status()
    return r.json()

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The upload tool sends user-supplied title, video URL, description, and tags to an external service and includes a bearer API key in the request, but the callable tool interface provides no explicit runtime disclosure or confirmation step before transmission. In an agent setting, this can cause users or upstream agents to unintentionally exfiltrate sensitive content or trigger authenticated actions on a third-party platform without informed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The chat tool forwards arbitrary user messages to an external Beacon agent service without surfacing a clear notice that the content leaves the local environment. In agent workflows, users may provide secrets, internal prompts, or proprietary data, which could be transmitted to a third-party service unexpectedly.

Content

No source excerpt is available for this finding.

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
98% confidence
Finding

Using verify=False as the default transport behavior is an unsafe default because every tool call inherits insecure TLS handling without user awareness. Given the skill's purpose—interacting with blockchain, video-platform, and agent-relay APIs that may carry authentication headers, relay tokens, admin keys, and signed transaction data—this default materially increases the risk of credential theft, request/response tampering, and misdirection to attacker-controlled services.

Content

Scanner excerpt · rustchain_mcp/server.py (reported line 56)May include surrounding context.

python
def get_client() -> httpx.Client:
    global _client
    if _client is None:
        _client = httpx.Client(timeout=RUSTCHAIN_TIMEOUT, verify=False)
    return _client

Rp1

Low
Category
MCP Rug Pull
Confidence
60% confidence
Finding

pip install without ==version installs the latest release, which could include malicious changes.

Content

No source excerpt is available for this finding.

Rp1

Low
Category
MCP Rug Pull
Confidence
60% confidence
Finding

pip install without ==version installs the latest release, which could include malicious changes.

Content

No source excerpt is available for this finding.

Rp1

Low
Category
MCP Rug Pull
Confidence
60% confidence
Finding

pip install without ==version installs the latest release, which could include malicious changes.

Content

No source excerpt is available for this finding.

Rp1

Low
Category
MCP Rug Pull
Confidence
60% confidence
Finding

pip install without ==version installs the latest release, which could include malicious changes.

Content

No source excerpt is available for this finding.

Rp1

Low
Category
MCP Rug Pull
Confidence
60% confidence
Finding

pip install without ==version installs the latest release, which could include malicious changes.

Content

No source excerpt is available for this finding.

Rp1

Low
Category
MCP Rug Pull
Confidence
60% confidence
Finding

pip install without ==version installs the latest release, which could include malicious changes.

Content

No source excerpt is available for this finding.

Rp1

Low
Category
MCP Rug Pull
Confidence
88% confidence
Finding

The installation command uses an unpinned package version, which makes builds non-reproducible and exposes users to supply-chain risk if a future package release is compromised or introduces unsafe behavior. In the context of an MCP server that can interact with wallets, tokens, messaging, and content platforms, even a documentation-level install command can lead users to deploy a more privileged tool than they reviewed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
84% confidence
Finding

The post templates contain fixed English marketing copy and there is no configuration for locale selection or any documented justification for restricting output to English. This is a natural-language policy issue because the skill forces a language choice implicitly.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The skill sends canned outreach text in English and the generated onboarding posts are also English-only, with no indication that language is selectable or user-controlled. Under the stated policy, forcing a specific language without opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: fastmcp has 14 known advisory(ies) (CVE-2025-69196 (FastMCP OAuth Proxy token reuse across MCP servers); GHSA-c2jp-c369-7pvx (FastMCP Auth Integration Allows for Confused Deputy Account Takeover); CVE-2025-64340 (FastMCP has a Command Injection vulnerability - Gemini CLI) +11 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
89% confidence
Finding

The dependency specification fastmcp>=2.0 is not pinned to a known-safe version, so installs may resolve to a release affected by published FastMCP advisories. In an MCP server package that exposes agent tooling and likely handles authentication, tool execution, and network-facing protocol traffic, this uncertainty is more dangerous because consumers may unknowingly deploy a vulnerable transitive runtime.

Content

No source excerpt is available for this finding.

Unverifiable Dependency: httpx has 2 known advisory(ies) (CVE-2021-41945 (Improper Input Validation in httpx); CVE-2021-41945 (Encode OSS httpx <=1.0.0.beta0 is affected by improper input validation in `http)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
78% confidence
Finding

The dependency httpx>=0.25 is also unpinned, so the exact installed version cannot be verified against known advisories from the manifest alone. Although the cited httpx issues are older and may not affect modern resolved versions, leaving the package unconstrained still creates supply-chain and reproducibility risk, especially for a networked server component that depends on HTTP request handling.

Content

No source excerpt is available for this finding.