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·11 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

•about 1 hour ago•CVE-2026-94619
5.9

CVE-2026-94619: Missing Authorization and Unnamespaced Temporary File Reassembly in FileGator UploadController

An authorization bypass and insecure direct object reference (IDOR) vulnerability exists in FileGator versions prior to 7.15.0 within the chunked file upload reassembly handler. When processing multipart uploads in backend/Controllers/UploadController.php, the application fails to namespace the target assembly filename with a user-specific prefix inside the shared temporary storage directory. Authenticated users with upload privileges can manipulate chunk metadata parameters to exfiltrate, corrupt, or delete arbitrary transient files belonging to other users or the system.

Alon Barad
Alon Barad
2 views•9 min read
•about 2 hours ago•CVE-2026-77596
9.6

CVE-2026-77596: Cross-Tenant Authorization Bypass in Kubeflow Pipelines Upload API

CVE-2026-77596 is an authorization bypass vulnerability in the Kubeflow Pipelines API server affecting multi-user deployments prior to version 2.18.0. The HTTP multipart upload handlers prematurely terminate authorization checks and return success when the target namespace parameter is empty or omitted. Because the default configuration allows pipelines without namespaces to function as cluster-wide shared resources, any low-privileged tenant can create shared pipelines or inject arbitrary pipeline versions into existing shared pipelines without undergoing Kubernetes SubjectAccessReview validation. When other tenants execute unpinned recurring runs tracking these shared pipelines, the attacker-supplied workload runs inside the victim tenant's namespace using the victim's service account credentials.

Alon Barad
Alon Barad
4 views•10 min read
•about 3 hours ago•CVE-2026-85737
6.5

CVE-2026-85737: Missing Authorization and Arbitrary File Disclosure in Velocidex Velociraptor sql() VQL Plugin

An authorization bypass vulnerability in Velocidex Velociraptor versions prior to 0.77.2 allows authenticated users with low-privilege query permissions to bypass access controls in the sql() VQL plugin. By supplying crafted MySQL connection strings pointing to an attacker-controlled rogue MySQL server with local-infile enabled, an attacker can read arbitrary files from the Velociraptor server host filesystem with the privileges of the server process.

Alon Barad
Alon Barad
3 views•8 min read
•about 4 hours ago•CVE-2026-97705
7.5

CVE-2026-97705: Unauthenticated Denial of Service in Moleculer TCP Transporter Packet Parser

CVE-2026-97705 (GHSA-h89v-g948-47vp) is a high-severity unauthenticated Denial of Service (DoS) vulnerability affecting the Moleculer microservices framework for Node.js in versions prior to 0.14.36 and 0.15.2. The vulnerability resides in the internal TCP transporter packet parser (`src/transporters/tcp/parser.js`), which decodes the 4-byte packet length field as a signed 32-bit integer using `Buffer.prototype.readInt32BE()`. An unauthenticated attacker with network access to an exposed TCP transporter port can transmit a single malformed packet containing a negative length value or a positive length value less than the 6-byte header size. Due to how Node.js `Buffer.prototype.slice()` processes negative or sub-header offsets, the parser fails to advance the incoming buffer cursor while remaining inside a synchronous `while (packet.length > 0)` loop. Because Node.js relies on a single-threaded event loop, this infinite loop permanently blocks execution, freezing all services and endpoints within the affected process until manual intervention.

Amit Schendel
Amit Schendel
3 views•10 min read
•about 5 hours ago•CVE-2026-108262
6.5

CVE-2026-108262: Arbitrary Host File Overwrite via Tar Symlink Traversal in DDEV

CVE-2026-108262 (GHSA-9hq4-hm3j-jmph) is a path traversal and arbitrary file overwrite vulnerability in the tar archive extraction routine of DDEV versions 1.25.2 and 1.25.3. Resulting from an incomplete fix for CVE-2026-32885, the Untar function in pkg/archive/archive.go validates absolute symbolic link targets by rebasing them against the extraction destination directory, but subsequently creates the symbolic link on disk using the raw, unvalidated absolute path. When subsequent entries in the archive write through the planted symbolic link, the host operating system resolves the link directly to the host filesystem, allowing an attacker to overwrite arbitrary files with the privileges of the user executing DDEV.

Amit Schendel
Amit Schendel
5 views•10 min read
•about 6 hours ago•CVE-2026-119298
4.2

CVE-2026-119298: Overwrite Confirmation Bypass in schollz/croc via Unvalidated Text Artifact Prefix

CVE-2026-119298 (GHSA-x89h-7h96-v88f) is a file overwrite confirmation bypass vulnerability in schollz/croc prior to version 11.5.2. The receive-side file validation logic in src/croc/croc.go improperly exempted any incoming file whose basename began with the prefix 'croc-stdin-' from interactive overwrite prompts and automatic collision renaming, failing to verify if the transfer session was actually an internal text transfer. An unauthenticated remote peer participating in a transfer session can exploit this flaw to silently overwrite, truncate, or replace matching pre-existing files in the receiver's working directory.

Amit Schendel
Amit Schendel
4 views•9 min read