Back to skill

Security audit

Agieth

Security checks for vulnerabilities and agentic risk

Overview

This skill is mostly a disclosed domain/DNS service client, but it includes high-risk automated crypto-transfer capabilities and external-account mutations without enough guardrails.

Review before installing. Use a least-privilege agieth API key, do not expose a funded wallet private key to the agent environment, prefer manual wallet payment, and require human review for domain registration, DNS deletion, hosting cancellation, and any blockchain transfer. Be aware that the code contains ERC20 transfer functionality not clearly disclosed in the user-facing guide.

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

T09 · Insecure Skill Coding Practices

Error
Location
skill.py:547
Finding

RPC Failover Can Cause Duplicate Blockchain Payments

Content
View full analysis

Vulnerability Details

File Location: skill.py:547-576 and skill.py:616-652
Vulnerability Type: Unsafe transaction retry following an uncertain broadcast result
Risk Level: High

Vulnerable Code

ETH payment implementation:

python
# Try primary RPC first, then fallback on first failure
for idx, rpc_url in enumerate(self.rpc_endpoints):
    try:
        w3 = Web3(Web3.HTTPProvider(rpc_url))
        nonce = w3.eth.get_transaction_count(account.address, "pending")
        gas_price = w3.eth.gas_price

        tx = {
            "from": account.address,
            "to": Web3.to_checksum_address(to_address),
            "value": w3.to_wei(amount_eth, "ether"),
            "gasPrice": gas_price,
            "nonce": nonce,
            "chainId": 1
        }

        tx["gas"] = w3.eth.estimate_gas(tx)
        signed = w3.eth.account.sign_transaction(tx, private_key)
        tx_hash = w3.eth.send_raw_transaction(signed.raw_transaction)
        receipt = w3.eth.wait_for_transaction_receipt(tx_hash, timeout=180)

        return {
            "success": receipt.status == 1,
            "tx_hash": tx_hash.hex(),
            "from": account.address,
            "to": to_address,
            "amount_eth": amount_eth,
            "gas_used": receipt.gasUsed,
            "block_number": receipt.blockNumber,
            "rpc_used": rpc_url,
            "rpc_failover_used": idx > 0,
        }
    except Exception as e:
        last_error = f"{rpc_url}: {e}"
        continue

ERC-20 payment implementation:

python
for idx, rpc_url in enumerate(self.rpc_endpoints):
    try:
        w3 = Web3(Web3.HTTPProvider(rpc_url))
        token = w3.eth.contract(
            address=Web3.to_checksum_address(token_address),
            abi=erc20_abi
        )

        amount_wei = int(amount * (10 ** decimals))
        nonce = w3.eth.get_transaction_count(accoun
...[truncated 3870 chars]
Remediation
View remediation

Remediation Suggestions

  1. Separate transaction phases and error handling. Distinguish errors occurring before broadcast from errors occurring after a transaction hash has been obtained.
  2. Never create a new payment automatically after broadcast uncertainty. Once send_raw_transaction succeeds, preserve the transaction hash and return a pending or unknown status if receipt polling fails.
  3. Poll the original hash through fallback providers. Fallback RPC endpoints should call receipt and transaction lookup methods using the original transaction hash rather than create another transfer.
  4. Rebroadcast only identical signed bytes. If propagation must be retried, submit the exact same signed raw transaction. Reusing the same nonce and payload ensures the retry represents the same logical transaction rather than another payment.
  5. Persist reconciliation data. Record the transaction hash, sender, recipient, value, nonce, chain ID, and signed-transaction identifier before waiting for confirmation.
  6. Require explicit user confirmation for replacement transactions. If the original transaction is conclusively dropped and a replacement is necessary, present its status and require approval before signing another transfer.
  7. Add transaction-state checks. Check the original hash across all configured providers and inspect the account nonce before deciding that a transaction was never accepted.
  8. Add failure-mode tests. Cover successful broadcast followed by receipt timeout, provider disagreement, delayed propagation, process restart, and an original transaction confirming after fallback begins.
  9. Use deterministic monetary types. As an additional payment-safety measure, accept decimal strings or Decimal values instead of floating-point amounts and convert them deterministically into base units before signing.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • 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
98% confidence
Finding

The declared purpose focuses on domains, DNS, and Cloudflare management, but the skill documentation also introduces cryptocurrency payment flows, optional handling of an Ethereum private key, tunnel hosting, and account/balance operations. This mismatch is dangerous because operators may authorize the skill for low-risk infrastructure tasks without realizing it can influence financial transactions and process highly sensitive wallet material.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
95% confidence
Finding

Domain registration is an external, billable, and effectively irreversible action, yet the method executes directly without any built-in confirmation or safety interlock. In an agent-driven workflow, this could lead to accidental purchases, unwanted registrations, or abuse of the authenticated account.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill’s stated purpose is domain/DNS/Cloudflare management, but it also includes wallet generation and direct cryptocurrency transfer functions. This materially expands the capability and risk surface into handling private keys and initiating irreversible financial transactions, which is dangerous for an agent-integrated skill because these actions are unrelated to the declared scope and could enable unauthorized fund movement.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The code loads an Ethereum private key from environment variables and uses it to sign and broadcast ETH/ERC20 transactions. In an agent setting, this creates a direct path from prompt-driven tool use to irreversible on-chain asset transfer without strong authorization boundaries, making accidental or malicious fund exfiltration possible.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The ETH payment function signs and broadcasts an irreversible blockchain transaction immediately, with no explicit user confirmation, transaction simulation, or policy checks. This is especially dangerous in an agent skill because a single tool invocation can directly move funds off-platform with no recovery path.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
98% confidence
Finding

The function explicitly supports pulling a private key from local environment configuration and using it for signing transactions. Accessing highly sensitive wallet material inside an agent-reachable skill is a severe credential-handling flaw because compromise or misuse of the skill can directly convert secret access into asset theft.

Content

Scanner excerpt · skill.py (reported line 529)May include surrounding context.

python
Args:
            to_address: Recipient address (0x...)
            amount_eth: Amount in ETH
            private_key: Sender's private key (uses wallet from .env if not provided)

        Returns:
            Dict with tx_hash, status, and gas_used

Missing User Warnings

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The ERC20 transfer method performs immediate signed token transfers using a locally available private key and accepts arbitrary token and destination addresses. This creates a high-risk exfiltration primitive for any agent or prompt path that can invoke the method, with irreversible financial loss if abused.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
97% confidence
Finding

The skill declares access to environment variables and external network services but does not define any explicit tool scope or permissions boundary. In an agent ecosystem, that omission increases the chance of over-broad execution, secret exposure, and unreviewed outbound requests because consumers cannot easily constrain what the skill is allowed to do.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill automatically consumes environment-derived API credentials and later uses them for outbound API and blockchain-related operations, but there is no visible user disclosure, scoping, or confirmation layer. In an agent context, hidden credential use increases the risk of unintended external actions being taken under privileged accounts.

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 · SKILL.md (reported line 56)May include surrounding context.

md
raise ValueError(
                "AGIETH_API_KEY is required. "
                "Set environment variable or pass api_key parameter. "
                "Get your API key at https://api.agieth.ai/api/v1/keys/create"
            )

        # RPC failover order (primary first, then fallback)

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 213)May include surrounding context.

md
raise ValueError(
                "AGIETH_API_KEY is required. "
                "Set environment variable or pass api_key parameter. "
                "Get your API key at https://api.agieth.ai/api/v1/keys/create"
            )

        # RPC failover order (primary first, then fallback)

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 217)May include surrounding context.

md
raise ValueError(
                "AGIETH_API_KEY is required. "
                "Set environment variable or pass api_key parameter. "
                "Get your API key at https://api.agieth.ai/api/v1/keys/create"
            )

        # RPC failover order (primary first, then fallback)

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.py (reported line 50)May include surrounding context.

python
raise ValueError(
                "AGIETH_API_KEY is required. "
                "Set environment variable or pass api_key parameter. "
                "Get your API key at https://api.agieth.ai/api/v1/keys/create"
            )

        # RPC failover order (primary first, then fallback)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

DNS record deletion is a destructive infrastructure action that can break routing, email delivery, and service availability, but the skill performs it with no visible confirmation or guardrails. For an AI agent, this increases the chance of production outages from prompt mistakes or misuse.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Hosting cancellation changes live service state and may disrupt availability, but the skill exposes it as a direct delete operation without warning or confirmation. In agent use, this can cause avoidable service interruptions from accidental or manipulated requests.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.