other
- Location
clawrtc/cli.py:320- Finding
Undisclosed third-party installation telemetry contradicts the privacy disclosure
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a real mining and wallet skill, but its code contradicts its privacy and TLS promises in ways users should review before installing.
Install only if you intentionally want to run a crypto miner and are comfortable with wallet-linked hardware fingerprinting. Before using it, review the plaintext miner endpoint, hidden install telemetry, MAC/hostname collection, cloud metadata probes, optional auto-start service, and BCOS admin-key path. Avoid running it on cloud hosts or machines with sensitive credentials, and do not use BCOS certification/admin keys until TLS verification and disclosure issues are fixed.
clawrtc/cli.py:320Undisclosed third-party installation telemetry contradicts the privacy disclosure
clawrtc/data/miner.py:376Hostname, MAC addresses, wallet identifiers, and hardware fingerprints are transmitted over plaintext HTTP
clawrtc/cli.py:918BCOS certification disables TLS verification while transmitting an administrator credential
clawrtc/data/fingerprint_checks.py:435Hardware fingerprinting actively probes the cloud metadata service and requests an AWS IMDSv2 token
clawrtc/cli.py:747RTC wallet exports containing private keys are created without restrictive permissions
clawrtc/cli.py:46Standard installation omits strong signing modules and silently falls back to a legacy pseudo-signature
clawrtc/cli.py:375Optional persistent mining services continuously transmit host data after login or reboot
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
try:
import urllib.request
req = urllib.request.Request(f"{NODE_URL}/api/miners")
with urllib.request.urlopen(req, timeout=10) as resp:
miners = json.loads(resp.read())
log(f"Active miners on network: {len(miners)}")
except Exception:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
try:
import urllib.request
req = urllib.request.Request(f"{NODE_URL}/api/miners")
with urllib.request.urlopen(req, timeout=10) as resp:
miners = json.loads(resp.read())
log(f"Active miners on network: {len(miners)}")
except Exception:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
try:
import urllib.request
req = urllib.request.Request(f"{NODE_URL}/api/miners")
with urllib.request.urlopen(req, timeout=10) as resp:
miners = json.loads(resp.read())
log(f"Active miners on network: {len(miners)}")
except Exception:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
data=payload,
headers={"Content-Type": "application/json"}
)
urllib.request.urlopen(req, timeout=5)
except Exception:
pass
threading.Thread(target=_ping, daemon=True).start()
BCOS verification disables TLS certificate and hostname validation before fetching purported verification data. A man-in-the-middle can spoof the server response and make untrusted certificates appear verified, undermining the security promise of the verification feature.
ctx.verify_mode = ssl.CERT_NONE
req = urllib.request.Request(url)
with urllib.request.urlopen(req, context=ctx, timeout=15) as resp:
data = json.loads(resp.read().decode())
if not data.get("ok"):
This request sends an admin key in the X-Admin-Key header while TLS verification is explicitly disabled. An active network attacker can intercept the key, modify the attestation request, or impersonate the server, leading to credential theft and unauthorized certification actions.
},
method="POST",
)
with urllib.request.urlopen(req, context=ctx, timeout=30) as resp:
data = json.loads(resp.read().decode())
if data.get("ok"):
The certificate PDF is downloaded with TLS verification disabled, allowing content spoofing or malicious file substitution. While less severe than admin-key exposure, it can still mislead users or deliver untrusted artifacts presented as official certificates.
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
with urllib.request.urlopen(req, context=ctx, timeout=30) as resp:
pdf_data = resp.read()
out_path = os.path.join(path, f"{cert_id}.pdf")
Using subprocess.run with shell=True in a shared helper is a classic unsafe default because future and current callers can pass interpolated strings that the shell will parse. In this file, command strings include quoted paths and generated values, so an attacker controlling environment-derived paths or arguments may achieve command execution.
def run_cmd(cmd, check=True, capture=False):
"""Run a shell command."""
try:
result = subprocess.run(
cmd, shell=True, check=check,
capture_output=capture, text=True
)
The consent text explicitly claims data is sent only to the RustChain node, but installation also silently sends telemetry to bottube.ai. Misrepresenting outbound data flows is dangerous because it defeats informed consent and is a strong trust violation, especially in an installer that already requests persistence and network access.
os.system() and os exec-family calls run shell commands with the process's full privileges, enabling arbitrary command execution.
wallet = open(wallet_file).read().strip() if os.path.exists(wallet_file) else ""
log(f"Starting miner in foreground (Ctrl+C to stop)...")
log(f"Tip: Use 'clawrtc start --service' for background auto-restart")
os.execvp(python_bin, [python_bin, miner_py] + (["--wallet", wallet] if wallet else []))
def cmd_mine(args):
os.system() and os exec-family calls run shell commands with the process's full privileges, enabling arbitrary command execution.
if system == "Linux":
sf = os.path.expanduser("~/.config/systemd/user/clawrtc-miner.service")
if os.path.exists(sf):
os.execlp("journalctl", "journalctl", "--user", "-u", "clawrtc-miner", "-f", "--no-pager", "-n", "50")
else:
log_file = os.path.join(INSTALL_DIR, "miner.log")
if os.path.exists(log_file):
os.system() and os exec-family calls run shell commands with the process's full privileges, enabling arbitrary command execution.
else:
log_file = os.path.join(INSTALL_DIR, "miner.log")
if os.path.exists(log_file):
os.execlp("tail", "tail", "-f", log_file)
else:
warn("No logs found. Start the miner first: clawrtc start")
elif system == "Darwin":
os.system() and os exec-family calls run shell commands with the process's full privileges, enabling arbitrary command execution.
else:
log_file = os.path.join(INSTALL_DIR, "miner.log")
if os.path.exists(log_file):
os.execlp("tail", "tail", "-f", log_file)
else:
warn("No logs found. Start the miner first: clawrtc start")
elif system == "Darwin":
The CLI's stated purpose is mining/attestation, yet it also includes a BCOS repo scanner, certificate generation, admin-key handling, and network upload workflow. This scope expansion increases attack surface, introduces credential-handling paths unrelated to the advertised function, and makes the package more dangerous in agent contexts where users may not expect these capabilities.
BCOS certification reads an admin key from an environment variable or local file and transmits it in an HTTP header without clear user-facing warning. In a skill/agent context, silent credential use is risky because operators may not realize a local secret will be sent over the network, and elsewhere this flow is further weakened by disabled TLS checks.
Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.
def coinbase_swap_info(args):
"""Show USDC→wRTC swap instructions and Aerodrome pool info."""
print(f"""
{GREEN}{BOLD}USDC → wRTC Swap Guide{NC}
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.
5. Bridge wRTC to native RTC at https://bottube.ai/bridge
{DIM}Or use the RustChain API:{NC}
curl -s https://bulbous-bouffant.metalseed.net/wallet/swap-info
""")
This finding points to documentation/comments describing intentional access to the cloud metadata endpoint, which reinforces that the later network behavior is deliberate rather than incidental. While the comment itself is not executable, in context it signals a design that treats privileged instance-local metadata probing as acceptable, increasing the severity of the implemented requests.
- VMware, VirtualBox, KVM, QEMU, Xen, Hyper-V, Parallels
- AWS EC2 (Nitro/Xen), GCP, Azure, DigitalOcean
- Linode, Vultr, Hetzner, Oracle Cloud, OVH
- Cloud metadata endpoints (169.254.169.254)
Updated 2026-02-21: Added cloud provider detection after
discovering AWS t3.medium instances attempting to mine.
The anti-emulation routine actively probes the cloud metadata service at 169.254.169.254, which goes beyond passive hardware fingerprinting and introduces network-discovery behavior. In cloud environments this can contact sensitive instance-local services and may retrieve provider-identifying data or tokens, creating SSRF-like access to privileged metadata endpoints without user consent.
The code constructs an HTTP request to http://169.254.169.254/, a well-known cloud metadata address reachable only from the local host environment. Contacting this special endpoint is SSRF-like behavior against a privileged local service and can leak provider or instance metadata that should not be queried by an unrelated fingerprint routine.
pass
# --- Cloud metadata endpoint check ---
# AWS, GCP, Azure, DigitalOcean all use 169.254.169.254
try:
import urllib.request
req = urllib.request.Request(
This literal metadata URL is used in a live request, making it a concrete privileged local-service access path. In cloud environments, metadata endpoints can expose sensitive information about the instance and role configuration, so probing them from application code materially increases risk.
try:
import urllib.request
req = urllib.request.Request(
"http://169.254.169.254/",
headers={"Metadata": "true"}
)
resp = urllib.request.urlopen(req, timeout=1)
The IMDSv2 token request targets AWS's protected metadata token endpoint, which is especially sensitive because successful token acquisition can be a precursor to broader metadata access. Even though this code only checks for status 200, it still performs an unauthorized probe against a privileged cloud control surface unrelated to local hardware validation.
try:
import urllib.request
token_req = urllib.request.Request(
"http://169.254.169.254/latest/api/token",
headers={"X-aws-ec2-metadata-token-ttl-seconds": "5"},
method="PUT"
)
The file is explicitly a cryptocurrency miner with dual-mining support and detection of xmrig/zephyrd, not merely an incidental reference. In an agent-skill ecosystem, embedded cryptomining logic is highly dangerous because it can abuse host CPU resources, generate unauthorized network traffic, and pair naturally with the undisclosed telemetry and insecure remote communications present elsewhere in the file.
#!/usr/bin/env python3
"""
RustChain Windows Wallet Miner
Full-featured wallet and miner for Windows
Includes Zephyr (RandomX) dual-mining integration.
See: https://github.com/Scottcjn/rustchain-bounties/issues/461
"""
import os
import sys
import time
import json
import hashlib
import platform
import threading
import statistics
import uuid
import subprocess
import re
try:
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
TK_AVAILABLE = True
_TK_IMPORT_ERROR = ""
except Exception as e:
TK_AVAILABLE = False
_TK_IMPORT_ERROR = str(e)
tk = None
ttk = None
messagebox = None
scrolledtext = None
import requests
from datetime import datetime
from pathlib i
The miner automatically sends attestation and enrollment-related data to remote endpoints with no meaningful user-facing disclosure or informed consent. This is particularly dangerous here because the file is not a generic admin tool but a crypto-mining client that starts repeated background network communication to a hard-coded node, making covert telemetry and wallet-associated tracking plausible.
The attestation payload includes sensitive hardware identifiers such as MAC addresses, hostname, CPU details, architecture, and device model, which can be used to fingerprint a user across installs and networks. In this skill's context—a cryptocurrency miner that silently phones home to a hard-coded external node over HTTP—this collection is especially dangerous because it enables persistent device tracking and deanonymization without meaningful user awareness or consent.
Detected: malicious.crypto_mining, suspicious.dynamic_code_execution, suspicious.exposed_secret_literal (+1 more)