CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



GHSA-QPXH-FF8M-C62V

GHSA-QPXH-FF8M-C62V: Gas Draining and Resource Exhaustion in ZenHive mpp Library

Amit Schendel
Amit Schendel
Senior Security Researcher

Sep 26, 2026·8 min read·2 visits

Executive Summary (TL;DR)

Unvalidated access list padding allows attackers to drain native tokens from sponsored gas wallets on EVM-compatible networks.

A critical gas draining vulnerability exists in the ZenHive mpp (Multi-Payment Protocol) library prior to version v0.6.0. By omitting validation of EIP-2930 access lists in custom 0x76 transaction envelopes, the library allows malicious clients to pad transaction payloads with dummy addresses, draining the gas sponsor's hot wallet.

Vulnerability Overview

The Multi-Payment Protocol (mpp) library developed by ZenHive provides Elixir-based multi-payment utilities for Ethereum Virtual Machine (EVM) networks. A core feature of this library is the support for 'Tempo' transactions, which are custom-defined, sponsored payment envelopes utilizing the 0x76 protocol type. Under this model, the server acts as a fee payer or gas sponsor, co-signing user-generated transactions and broadcasting them to the network. The sponsoring server incurs all gas fees associated with the transaction, relying on strict structural and economic policies to prevent abuse.\n\nA critical security flaw was identified in the verification mechanism of the Tempo protocol implementation prior to version v0.6.0. The server-side transaction parser fails to validate the presence or size of an EIP-2930 access list within the client-signed envelope. This missing boundary check exposes the gas-sponsor hot wallet to unrestricted financial drain. Because EIP-2930 access lists carry predefined upfront intrinsic gas fees, an attacker can manipulate the list of addresses to artificially inflate transaction costs.\n\nThe vulnerability falls under the class of Uncontrolled Resource Consumption (CWE-400) and Improper Input Validation (CWE-20). By submitting structurally valid but economically padded transactions, an attacker causes the server's wallet to pay for empty computations. This results in direct financial loss to the service operator and can completely deplete the sponsor's native gas tokens, resulting in a Denial of Service.

Root Cause Analysis

To understand the root cause of this vulnerability, it is necessary to examine how Ethereum Virtual Machine (EVM) nodes calculate gas for EIP-2930 transactions. When a transaction specifies an EIP-2930 access list, the EVM pre-warms the declared addresses and storage keys to reduce execution-time gas costs. However, to offset the overhead of pre-warming, the protocol charges a fixed upfront fee of 2,400 gas for every address and 1,900 gas for every storage key declared. These fees are charged as part of the transaction's intrinsic gas cost, which must be paid fully by the transaction sender before execution.\n\nIn the mpp library's custom 0x76 'Tempo' envelope, the transaction is structured using Recursive Length Prefix (RLP) serialization. The envelope contains several fields, with the fifth index reserved for the EIP-2930 compliant access list. During normal operations, the client constructs the transaction, signs it, and sends it to the mpp server. The server, acting as the fee payer, co-signs the envelope using its own private key and submits it to the EVM network via JSON-RPC, assuming full responsibility for the total transaction fees.\n\nThe vulnerability arises because the server's verification logic before version v0.6.0 completely ignores the access list field during validation. The server parses the RLP envelope but never inspects index 5 to confirm if it is empty. This omission allows a malicious client to supply an access list stuffed with hundreds of dummy addresses. When the server co-signs and broadcasts the transaction, the blockchain network bills the server's hot wallet for the inflated intrinsic gas costs, regardless of whether the transaction logic actually interacts with those addresses.

Code Analysis

The vulnerable version of the library fails to perform checks on the access list field before executing the co-signing logic. In the core transaction processing module, lib/mpp/methods/tempo.ex, the transaction flow evaluates call scopes and immediately proceeds to sign the payload if the scope is valid. There are no functions to analyze gas parameters or structural fields of the RLP envelope, leaving the fee payer exposed to arbitrary transaction parameters.\n\nThe ZenHive development team resolved this issue in commit 5d6338e2334084c5f2a78cfcca474830733ed7e8 by introducing the MPP.Methods.Tempo.FeePayerPolicy module. This module executes a strict validation pass before any co-signing operation occurs. It enforces structural and quantitative checks on gas limits, fee rates, and transaction formatting. The critical patch logic intercepts the transaction payload and specifically inspects the access list field to ensure it is empty.\n\nThe following code block shows the added validation logic within lib/mpp/methods/tempo/fee_payer_policy.ex:\n\nelixir\n# 0x76 RLP envelope field indices\n@access_list_index 5\n\n@spec validate(Transaction.t(), t(), integer()) :: :ok | {:error, String.t()}\ndef validate(%Transaction{} = tx, %__MODULE__{} = policy, now) when is_integer(now) do\n with {:ok, gas_limit} <- field_int(tx, @gas_limit_index, \"gas_limit\"),\n {:ok, max_fee} <- field_int(tx, @max_fee_index, \"max_fee_per_gas\"),\n :ok <- check_gas(gas_limit, policy),\n :ok <- check_max_fee(max_fee, policy),\n :ok <- check_total_fee(gas_limit, max_fee, policy),\n :ok <- check_nonce_key(tx) do\n check_access_list(tx)\n end\nend\n\n@spec check_access_list(Transaction.t()) :: :ok | {:error, String.t()}\ndefp check_access_list(%Transaction{fields: fields}) do\n case Enum.at(fields, @access_list_index) do\n list when is_list(list) and list != [] ->\n {:error, \"fee-payer transaction must not declare an access list (\" <> to_string(length(list)) <> \" entries)\"}\n _ ->\n :ok\n end\nend\n\n\nThis implementation is complete and robust because sponsored transactions handled by the mpp gateway are designed for simple multi-payment functions. These standard payments do not interact with complex, re-entrant smart contracts that require access lists for state warming. By enforcing that the access list must be empty, the library prevents any padding attacks while retaining full compatibility with standard on-chain payment pathways.

Exploitation Methodology

To execute the gas draining attack, an adversary must identify an active mpp-based gateway server that has the fee sponsorship feature enabled. The attacker does not need any administrative privileges or authenticated access, as the gateway is designed to accept client-signed transactions for sponsorship. The adversary constructs a standard multi-payment request but modifies the underlying RLP structure to exploit the lack of validation.\n\nThe attacker generates a series of arbitrary, inactive Ethereum addresses and pairs them with empty storage key arrays to format a valid EIP-2930 access list structure. This payload is inserted into index 5 of the 0x76 transaction envelope. The adversary then signs the envelope with their user key and submits it to the vulnerable mpp server's transaction endpoint. A single transaction payload can include hundreds of dummy addresses, exponentially multiplying the upfront cost.\n\nWhen the unpatched server receives this payload, it validates the call scope, which appears completely legitimate because the target smart contract call is unmodified. The server co-signs the envelope using its sponsored hot wallet key and broadcasts the fully signed transaction to the blockchain RPC node. The EVM network validates the signature and deducts the intrinsic gas fees—including the 2,400 gas fee per dummy address—directly from the server's wallet. The attacker spends zero native tokens, while the sponsor suffers significant, immediate financial loss.\n\nA simplified flow of this attack is described in the diagram below:\n\nmermaid\ngraph LR\n Attacker[\"Attacker\"]\n VulnerableServer[\"Vulnerable mpp Server\"]\n Blockchain[\"EVM Blockchain Node\"]\n \n Attacker -- \"Sends 0x76 Envelope with Padded Access List\" --> VulnerableServer\n VulnerableServer -- \"Co-signs & Broadcasts Transaction\" --> Blockchain\n Blockchain -- \"Deducts Intrinsic Gas (2,400 per address) from Sponsor Wallet\" --> VulnerableServer\n

Impact Assessment

The impact of GHSA-QPXH-FF8M-C62V is categorized as a high-severity economic denial of service and direct financial theft. Because transaction fees on EVM-compatible networks are settled in native gas tokens that possess real-world fiat value, any inflation of transaction fees translates directly into monetary loss for the hosting platform. An attacker can repeatedly execute this process, draining thousands of dollars in native assets within minutes.\n\nBeyond direct financial loss, the vulnerability serves as a highly effective denial-of-service vector against the platform's payment services. EVM accounts must maintain a minimum balance of native tokens to pay for transactions. Once the attacker succeeds in depleting the sponsor's hot wallet, the server is unable to pay for subsequent transaction gas fees. This causes all legitimate client transaction submissions to fail due to insufficient fund errors on-chain.\n\nThis vulnerability is particularly dangerous because there is no symmetric cost for the attacker. The attacker does not pay any gas fees for the rejected or bloated transactions, as the server acts as the transaction sender and co-signer. This complete economic asymmetry allows a low-capability threat actor to automate the attack script, continuously draining the host wallet as long as it contains funds. This makes the vulnerability highly attractive for automated exploitation.

Remediation & Defenses

Remediation of this vulnerability requires upgrading the mpp library to version v0.6.0 or higher. This release integrates the MPP.Methods.Tempo.FeePayerPolicy which is active by default whenever the server acts as a fee payer. To apply the fix, developers must update their Elixir dependencies in the mix.exs configuration file and run the dependency fetch command.\n\nIn mix.exs, ensure the dependency specification reflects the secure version range:\n\nelixir\ndefp deps do\n [\n {:mpp, \"~> 0.6.0\"}\n ]\nend\n\n\nAfter modifying the dependency configuration, developers should execute mix deps.get and compile the application. No code changes are required in the application layer if developers are using the default configuration settings, as the new policy automatically intercepts and validates all inbound Tempo transactions.\n\nFor temporary mitigation on systems where an immediate library upgrade is not feasible, operators can disable the fee-payer feature entirely by setting the fee_payer configuration key to false in their environment configuration. This forces clients to cover their own gas fees and prevents the server wallet from being exposed to the padding attack. Additionally, operators should implement rate-limiting and access control mechanisms on their transaction submission endpoints to detect and block abnormal request volumes.

Fix Analysis (1)

Technical Appendix

CVSS Score
7.5/ 10

Affected Systems

ZenHive mpp (Multi-Payment Protocol) Elixir library

Affected Versions Detail

Product
Affected Versions
Fixed Version
mpp
ZenHive
< 0.6.00.6.0
AttributeDetail
CWE IDCWE-400, CWE-20
Attack VectorNetwork / Remote
CVSS Score7.5 (High)
ImpactWallet Fund Depletion / Denial of Service
Exploit StatusProof of Concept available

MITRE ATT&CK Mapping

T1496Active Abuse of Resources
Impact
T1499Endpoint Denial of Service
Impact
CWE-400
Uncontrolled Resource Consumption

References & Sources

  • [1]GHSA-QPXH-FF8M-C62V Advisory Hub
  • [2]Patch Commit
  • [3]Mpp Library Release v0.6.0

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•35 minutes ago•GHSA-VV77-66RF-PM86
8.8

GHSA-vv77-66rf-pm86: Gas Draining Vulnerability in mpp Multi-Party Payments Library

A critical-severity input validation vulnerability in the Elixir multi-party payment library `mpp` allows unauthenticated remote attackers to exhaust the transaction fee payer's wallet balance. By submitting a crafted Ethereum transaction envelope with artificially inflated gas parameters, an attacker can force the server to co-sign and commit to pay exorbitant fees, leading to severe financial loss and Denial of Service.

Amit Schendel
Amit Schendel
2 views•5 min read
•about 3 hours ago•GHSA-VJ8P-HP9X-GH47
8.8

GHSA-vj8p-hp9x-gh47: Zero-Cost Fee-Payer Wallet Gas Draining in mpp Elixir Library

A high-severity vulnerability exists in the Elixir library `mpp` (Multi-Party Payments) prior to version `0.6.0`. When acting as a sponsored transaction fee payer, the server co-signs and broadcasts user-provided transactions without verifying if the user-specified gas limit is sufficient. An attacker can submit transactions designed to run out of gas and revert. The transaction reversion ensures the attacker pays zero fees, while the sponsor's fee-payer wallet is fully billed for the wasted gas, resulting in a low-cost, high-impact Denial of Service (DoS) vector.

Amit Schendel
Amit Schendel
1 views•6 min read
•about 5 hours ago•CVE-2026-57443
7.5

CVE-2026-57443: Unauthenticated Operations API Information Disclosure in SCBE-AETHERMOORE

An unauthenticated remote information disclosure vulnerability exists in the SCBE-AETHERMOORE geometric AI governance framework. The API endpoint `/api/ops/check-email` allows unauthenticated network actors to trigger administrative subprocesses and retrieve sensitive operator email digests from Gmail or ProtonMail mailboxes due to missing authentication controls and overly permissive CORS configurations.

Alon Barad
Alon Barad
5 views•6 min read
•about 6 hours ago•GHSA-29H2-JR22-FRMH
7.1

GHSA-29H2-JR22-FRMH: Improper Access Control and Handle Substitution in OpenZeppelin Confidential Contracts

A critical access control vulnerability exists in the OpenZeppelin Confidential Contracts library for Fully Homomorphic Encryption (FHE) on EVM networks. Due to missing Access Control List (ACL) verification on encrypted FHE handles returned by untrusted external contracts, malicious actors can perform handle substitution attacks. This allows attackers to harvest unauthorized private FHE handles and leak their underlying plaintext values through logical side-channels in subsequent contract operations.

Amit Schendel
Amit Schendel
4 views•6 min read
•about 7 hours ago•CVE-2026-86439
8.8

CVE-2026-86439: Path Traversal Vulnerability in knowns MCP Document and Memory Storage

A critical path traversal vulnerability (CWE-22) exists in knowns prior to version 0.30.0. The software fails to restrict file path arguments passed to Model Context Protocol (MCP) tools, permitting low-privilege users to escape the designated base storage directories and manipulate arbitrary markdown files on the host filesystem.

Amit Schendel
Amit Schendel
6 views•7 min read
•about 8 hours ago•CVE-2026-61825
8.7

CVE-2026-61825: Stored Cross-Site Scripting (XSS) via data-html-content Sanitizer Bypass in code16/sharp

CVE-2026-61825 is a high-severity, stored Cross-Site Scripting (XSS) vulnerability identified in code16/sharp, a Laravel-based administrative framework. The flaw resides within the administrative backend's rich-text and markdown editor field formatter. By bypassing HTML sanitization via crafted elements containing the data-html-content attribute or iframe srcdoc execution parameters, lower-privileged users can inject and execute arbitrary JavaScript code.

Amit Schendel
Amit Schendel
7 views•5 min read