Skip to main content

ZenHive mpp CVE-2026-88255

| EUVDEUVD-2026-80256 MEDIUM
Improper Validation of Unsafe Equivalence in Input (CWE-1289)
2026-09-16 EEF GHSA-p7v4-jpp9-2m3q
6.3
CVSS 4.0 · Vendor: EEF
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Craft one signed Tempo transaction
  2. Delivery
    Re-encode recovery id as v=27 and v=0
  3. Exploit
    Submit both, generating two raw-keyed reserve slots
  4. Execution
    Both bypass dedup and reach broadcast
  5. Impact
    Obtain second valid Payment-Receipt for one payment

Vulnerability Assessment

Weakness
CWE
ASVS 5.0
V15 - Secure Coding and Architecture Hardware access control
Exploitation Conditions

Requires that the target deploys ZenHive mpp (0.2.0 to before 0.16.2) with the Tempo (MPP.Methods.Tempo) payment method reachable by remote clients, and that the credential replay store is carved out for Tempo (as it is by default in lib/mpp/replay.ex), leaving reserve_hash_atomic/2 as the only dedup gate. The attacker needs a single validly signed transaction and submits it twice using both accepted recovery-id encodings (v=27 and v=0) so store_key/1 on tx.raw yields two distinct keys. LIMITING FACTORS: no authentication or user interaction is needed (PR:N/UI:N), but success depends on downstream node behavior (AT:P) - the harmful double-receipt only occurs against a node that answers with the canonical hash for an already-known transaction, while a node that enforces nonce-reuse rejection fails closed and yields no impact. Impact is bounded to a duplicate Payment-Receipt for one on-chain payment; no confidentiality or availability loss.

Impact

This is a genuine but moderate-severity logic flaw, not a critical one, and the multi-source signals agree on that. The vendor CVSS 4.0 base score is 6.3 (Medium) with vector AV:N/AC:L/AT:P/PR:N/UI:N and impact confined to VI:L (low integrity) with VC:N/VA:N - i.e. no confidentiality or availability loss, only a bounded integrity/business-logic effect (a duplicate Payment-Receipt for a single on-chain payment). No EPSS score, no CISA KEV listing, and no public exploit code are present in the input, so exploitation is theoretical at this time. The AT:P (attack requirement) metric is well-justified: the description states the double-receipt outcome only materializes on a node that answers with the canonical hash for an already-known transaction, whereas a node enforcing nonce-reuse rejection fails closed - so real impact is conditional on backend/node behavior. The 'Information Disclosure' tag in the input directly conflicts with the CVSS impact metrics (VC:N - no confidentiality impact); this is an integrity/dedup-bypass issue, not disclosure, and the tag appears mislabeled. Overall this is a lower-priority Medium: real for operators running ZenHive mpp in a payment path, but not a widespread or actively-exploited threat.

Exploit ScenarioDerived

An unauthenticated remote client crafts one validly signed Tempo transaction and submits it twice through the MPP payment flow - once encoded with recovery id v=27 and once with v=0. Because the pre-broadcast dedup reserve is keyed on the raw caller-supplied hex rather than a canonicalized transaction, the two encodings produce two distinct reserve keys that both pass the gate; against a node that returns the canonical hash for an already-known transaction, the attacker receives two valid Payment-Receipts for a single on-chain payment. No public exploit code is identified in the provided data.

This Month Plan within 30 days. Why: MEDIUM severity (CVSS 4.0-6.9).
Patch available 0.4% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – Sep 16, 2026

Duplicate-submission gate bypass in the Tempo payment method of ZenHive mpp (versions 0.2.0 through 0.16.1) lets an unauthenticated remote client pass the pre-broadcast dedup reservation twice using a single signed transaction - once with recovery id v=27 and once with v=0 - because the reserve key is derived from the caller-supplied raw transaction hex rather than a canonical form of the transaction. The post-broadcast mark then writes the canonical hash key that the raw-keyed reserve never reads, so the two encodings never collide. Impact is real but bounded and conditional: a node that rejects nonce reuse fails closed and produces no harm, while a node that returns the canonical hash for an already-known transaction can issue a second valid Payment-Receipt for a single on-chain payment; confidentiality and availability are unaffected, and no public exploit code has been identified at time of analysis.

RemediationAI

Vendor-released patch: upgrade to ZenHive mpp 0.16.2 or later, which reworks the Tempo Store dedup semantics and canonical keying (fix references https://github.com/ZenHive/mpp/commit/e12bd4a1cea2e97c2a01fc059c48e5594a7b4a43 and https://github.com/ZenHive/mpp/commit/f8904666061fbab695874856d8fcd02c471dfe1b, alongside advisory https://github.com/ZenHive/mpp/security/advisories/GHSA-8x7x-5j8g-8hcx); depending on how you resolve dependencies, pin the mix dependency to "~> 0.16.2" and confirm the running release reports 0.16.2 via Application.spec/2. If an immediate upgrade is not possible: (1) supply a custom MPP.Tempo.Store implementation whose atomic check_and_mark/2 keys on a canonical, normalized transaction hash (for example keccak256 over a re-encoded transaction, or a value that collapses the v=27 and v=0 recovery-id forms to the same identity) rather than on tx.raw, and ensure put/2 errors are propagated instead of ignored - the trade-off is extra hashing/normalization work per request and a store dependency the library otherwise avoids; (2) until such a store is deployed, restrict or disable the Tempo payment method on internet-facing endpoints (for example route only authenticated/internal clients to the Tempo 402 flow, or block the endpoint entirely) so unauthenticated clients cannot reach the reserve path - the trade-off is loss of Tempo payments for those clients; (3) do not rely on the downstream node's nonce-reuse rejection as a control, since the failure mode depends on node behavior and a node returning the canonical hash for a known transaction yields a duplicate receipt; note also that setting "store" to nil (the library default) leaves mpp stateless and removes even the weak reserve gate, so it is not a compensating control, and removing the dedup store post-upgrade is likewise not recommended.

Affected VersionsENISA

mpp f8904666061fbab695874856d8fcd02c471dfe1b <e12bd4a1cea2e97c2a01fc059c48e5594a7b4a43
mpp 0.2.0 <0.16.2

Affected Packages

euvd mpp fix: 0.16.2

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 1 package in euvd

Checking this CVE against your own stacks and servers is part of the Basic plan and up.

Technical ContextAI · show details

ZenHive mpp is an Elixir library implementing machine-payment flows, and MPP.Methods.Tempo is its EVM-style (Tempo chain) payment method supporting two credential paths: "hash" and "transaction". The transaction path uses reserve_hash_atomic/2 to atomically reserve a pre-broadcast dedup slot so a signed transaction cannot be broadcast twice, with the store key produced by store_key/1 from tx.raw. The deserializer stores the caller's hex verbatim and accepts both recovery-id encodings (legacy v=27 and typed/EIP-155-style v=0), so the same signed transaction presented in two syntactically distinct but semantically equivalent forms yields two different reserve keys and passes the gate twice. Compounding the defect, the plug-level credential replay store in lib/mpp/replay.ex is deliberately carved out for Tempo, making this reserve the only gate, and the post-broadcast mark records the canonical on-chain hash under a key that the raw-hex reserve never reads - hence the two subsystems never reconcile. This is CWE-1289 (Improper Validation of Unsafe Equivalence in Input): the code treats non-canonical but semantically equivalent inputs as distinct identities. The vendor's later rework (CHANGELOG for the Tempo Store dedup fix) documents that the hash path intentionally marks only after on-chain verification while the transaction path reserves atomically before broadcast, and that reserve_hash_atomic/2 previously also swallowed put/2 errors via a non-atomic get+put fallback - both of which are corrected in the fixed release.

Know when Mpp gets its next vulnerability

  • Watch products and get an email when something new is published
  • Check this CVE against your own stack and servers
  • Exploit and PoC references, threat intelligence from 22 sources

No credit card · 7-day full trial

Severity by source

Vendor (EEF) PRIMARY 6.3 MEDIUM
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N
vuln.today AI 3.7 LOW

Unauthenticated network submission (PR:N/AV:N), but successful double-receipt depends on specific node/backend behavior (AC:H); impact is a bounded integrity effect (I:L) with no confidentiality or availability loss.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:N
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N

Primary rating from Vendor (EEF).

CVSS VectorVendor: EEF

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
Low
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

DescriptionCVE.org

Improper Validation of Unsafe Equivalence in Input in ZenHive mpp allows an unauthenticated remote client to pass the Tempo duplicate-submission gate twice with one signed transaction.

MPP.Methods.Tempo reserves the pre-broadcast dedup slot on the caller-supplied hex in reserve_hash_atomic/2, keyed through store_key/1 on tx.raw rather than on a canonical form of the transaction. The deserializer stores the caller's hex verbatim and accepts both recovery-id encodings, so one signed transaction submitted once with v=27 and once with v=0 yields two distinct reserve keys, and both pass the reserve and reach the broadcast path. The plug-level credential replay store is deliberately carved out for tempo in lib/mpp/replay.ex, leaving this reserve as the only gate, and the post-broadcast mark writes the canonical hash key that the raw-keyed reserve never reads.

What the duplicate submission yields depends on the node: a nonce-reuse rejection fails closed, while a node that answers with the canonical hash for an already-known transaction returns a second valid Payment-Receipt for a single on-chain payment.

This issue affects mpp: from 0.2.0 before 0.16.2.

Threat Intelligence Overview

EPSS Score
0.4%
Top 67% exploitable
Prevalence
Rare
young niche Elixir payment library, negligible production footprint
Data Quality
7 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment GitHub VulDB

How this decision was reached

The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.

SignalValue
Severity MEDIUM
CISA KEV No
Public POC No
EPSS 0.4%
Patch available Yes
Active threat No
Deciding rule
MEDIUM severity (CVSS 4.0-6.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision· derived
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact· derived
Medium
Technical Impact
Partial

Priority Score

32
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +32
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

More in Mpp

View all
CVE-2026-82750 HIGH POC
8.3 Sep 06

Missing validation of the EIP-7702 aa_authorization_list field in ZenHive mpp's Tempo payment sponsorship module allows

CVE-2026-82751 HIGH POC
8.3 Sep 06

Gas-cost inflation and unauthorized access key provisioning in ZenHive mpp (versions 0.2.0 through 0.15.x) allows any un

CVE-2026-67581 HIGH
8.7 Aug 19

Replay of settled EVM blockchain transaction hashes against ZenHive mpp versions 0.3.0-0.6.2 allows unauthenticated remo

CVE-2026-73541 HIGH
8.3 Aug 19

Concurrent sponsored-payment flooding in ZenHive mpp (versions 0.2.0 through 0.12.0) allows an unauthenticated remote cl

CVE-2026-59694 HIGH
8.3 Jul 17

Economic resource exhaustion in the ZenHive mpp Elixir library (versions 0.2.0 through 0.5.x) lets an unauthenticated re

CVE-2026-59695 HIGH
8.3 Jul 17

Fee-payer wallet draining in ZenHive mpp (Elixir) 0.2.0-0.5.x lets an unauthenticated remote client empty the sponsor's

CVE-2026-73136 HIGH
8.2 Aug 19

Capture-replay authentication bypass in ZenHive mpp versions 0.6.1-0.6.3 allows unauthenticated network attackers to cla

CVE-2026-59252 HIGH
8.2 Jul 17

Wallet-draining denial of service in ZenHive mpp (Elixir library) versions 0.2.0 through 0.5.x affects deployments confi

CVE-2026-87119 HIGH
8.2 Sep 22

Replay of a captured Tempo subscription credential in ZenHive mpp 0.14.0 through 0.16.1 lets an attacker who already hol

CVE-2026-89420 HIGH
7.1 Sep 22

ZenHive mpp versions 0.14.0 through 0.16.1 fail to charge clients that hold an open payment channel, allowing an authent

CVE-2026-89186 MEDIUM
6.3 Sep 16

ZenHive mpp (MPP.Plug payment middleware for Elixir/Phoenix) versions 0.1.0 through 0.16.1 can allow a shared HTTP cache

CVE-2026-73829 MEDIUM
6.3 Aug 19

Payment-replay protection in ZenHive mpp's Tempo hash-credential path is defeated by a TOCTOU race condition, allowing a

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy