Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-59695

CVE-2026-59695: ZenHive mpp Fee-Payer Wallet DoS Attack

CVE-2026-59695 is a denial of service vulnerability in ZenHive mpp that allows attackers to drain the fee-payer wallet by specifying arbitrarily high gas prices. This article covers technical details, affected versions, and mitigation.

Updated:

CVE-2026-59695 Overview

CVE-2026-59695 is an improper input validation flaw [CWE-1284] in the ZenHive mpp Elixir library. When the library runs with fee_payer: true, the function MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs client-supplied fields of the 0x76 AASigned envelope verbatim. The server does not validate max_fee_per_gas or max_priority_fee_per_gas against reasonable bounds. An unauthenticated remote attacker can submit a transaction with arbitrarily large gas ceilings. The server co-signs and broadcasts the transaction, then pays the inflated per-gas rates from its own wallet. Affected versions include mpp from 0.2.0 before 0.6.0.

Critical Impact

A single crafted request can drain the fee-payer wallet, disabling gas sponsorship for legitimate payment requests.

Affected Products

  • ZenHive mpp Elixir library 0.2.0 through versions prior to 0.6.0
  • Deployments configured with fee_payer: true
  • Services relying on Tempo AASigned envelope co-signing for gas sponsorship

Discovery Timeline

  • 2026-07-17 - CVE-2026-59695 published to NVD
  • 2026-07-17 - Last updated in NVD database

Technical Details for CVE-2026-59695

Vulnerability Analysis

The mpp library implements a fee-payer pattern where a server co-signs and pays gas for client-initiated transactions. The vulnerability sits in MPP.Tempo.Transaction.cosign_fee_payer/3, which processes the 0x76 AASigned envelope submitted by clients. The server preserves the client-supplied max_fee_per_gas and max_priority_fee_per_gas fields, applies its co-signature, and broadcasts the transaction.

Because the effective on-chain effective_gas_price derives from these ceilings, the fee-payer wallet is billed at whatever rate the attacker names. The library performs no upper-bound check on gas ceilings, total fee budget, access list padding, or validity window before signing. An attacker does not need authentication, credentials, or user interaction to exploit this behavior.

Root Cause

The root cause is missing bounds validation on client-controlled numeric inputs before the sponsor signs the transaction. The library trusted client-supplied envelope fields as authoritative economic parameters. No sponsor-side ceiling existed for max_fee_per_gas, max_priority_fee_per_gas, max_gas, max_total_fee, or the validity window.

Attack Vector

An unauthenticated remote client crafts an AASigned 0x76 envelope containing an inflated max_fee_per_gas and max_priority_fee_per_gas. The client submits the envelope to any endpoint that invokes cosign_fee_payer/3. The server co-signs the envelope and broadcasts it. On-chain settlement charges the fee-payer wallet the inflated per-gas rate, transferring value out of the sponsor wallet in a single transaction.

text
# Patch excerpt from lib/mpp/methods/tempo.ex introducing FeePayerPolicy
     secp256k1 private key for the fee payer account
   * `"fee_token"` — (required when `fee_payer: true`) hex address of a USD-denominated
     TIP-20 token to use for fee payment (e.g., pathUSD)
+  * `"fee_payer_policy"` — (optional, `fee_payer: true` only) map of sponsor
+    ceilings overriding the per-chain defaults: `"max_gas"`,
+    `"max_fee_per_gas"`, `"max_priority_fee_per_gas"`, `"max_total_fee"` (wei),
+    and `"max_validity_window_seconds"` (seconds). Bounds the client-supplied
+    gas fields and validity window before the server co-signs so a malicious
+    client cannot drain the fee-payer wallet via inflated gas price, total fee
+    budget, or a padded access list, nor hold a co-signed sponsorship
+    broadcastable far into the future. See `MPP.Methods.Tempo.FeePayerPolicy`.

Source: GitHub Commit 5d6338e

Detection Methods for CVE-2026-59695

Indicators of Compromise

  • Sudden drop in fee-payer wallet balance following a single co-signed transaction
  • Broadcasted transactions with max_fee_per_gas or max_priority_fee_per_gas orders of magnitude above prevailing network rates
  • Co-signed 0x76 AASigned envelopes originating from unauthenticated or unexpected clients
  • Failure of subsequent legitimate sponsorship requests due to insufficient wallet balance

Detection Strategies

  • Instrument cosign_fee_payer/3 call sites to log incoming max_fee_per_gas, max_priority_fee_per_gas, max_gas, and validity window values.
  • Alert when submitted gas ceilings exceed a configured multiple of the current network base fee.
  • Correlate on-chain fee-payer wallet debits with the specific request IDs that produced them.

Monitoring Recommendations

  • Track fee-payer wallet balance in real time and alert on unexpected large decreases.
  • Compare effective_gas_price billed on chain against expected per-chain defaults.
  • Monitor request telemetry for outlier gas fields and repeated submissions from the same origin.

How to Mitigate CVE-2026-59695

Immediate Actions Required

  • Upgrade mpp to version 0.6.0 or later, which introduces MPP.Methods.Tempo.FeePayerPolicy bounds enforcement.
  • Configure a fee_payer_policy with explicit ceilings for max_gas, max_fee_per_gas, max_priority_fee_per_gas, max_total_fee, and max_validity_window_seconds.
  • Rotate fee-payer wallet keys if abuse is suspected and audit recent on-chain activity.

Patch Information

The fix is delivered in commit 5d6338e and documented in the GitHub Security Advisory GHSA-vv77-66rf-pm86. Upgrade mpp to 0.6.0 or later. Additional context is available in the CNA advisory and the OSV report.

Workarounds

  • Disable fee_payer: true mode until the library is upgraded and a policy is configured.
  • Place an application-layer proxy in front of the co-signing endpoint that rejects envelopes exceeding sponsor-defined gas ceilings.
  • Cap fee-payer wallet balance to the minimum required for expected sponsorship volume to limit blast radius.
bash
# Example fee_payer_policy configuration bounding client-supplied gas fields
config = %{
  "fee_payer" => true,
  "fee_token" => "0x...",
  "fee_payer_policy" => %{
    "max_gas" => 500_000,
    "max_fee_per_gas" => 100_000_000_000,
    "max_priority_fee_per_gas" => 2_000_000_000,
    "max_total_fee" => 50_000_000_000_000_000,
    "max_validity_window_seconds" => 300
  }
}

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.