Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessCraft one signed Tempo transaction
-
DeliveryRe-encode recovery id as v=27 and v=0
-
ExploitSubmit both, generating two raw-keyed reserve slots
-
ExecutionBoth bypass dedup and reach broadcast
-
ImpactObtain 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. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – 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
Affected Packages
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
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
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.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
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
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.
What every action level means
SSVC AssessmentENISA
Priority Score
Missing validation of the EIP-7702 aa_authorization_list field in ZenHive mpp's Tempo payment sponsorship module allows
Gas-cost inflation and unauthorized access key provisioning in ZenHive mpp (versions 0.2.0 through 0.15.x) allows any un
Replay of settled EVM blockchain transaction hashes against ZenHive mpp versions 0.3.0-0.6.2 allows unauthenticated remo
Concurrent sponsored-payment flooding in ZenHive mpp (versions 0.2.0 through 0.12.0) allows an unauthenticated remote cl
Economic resource exhaustion in the ZenHive mpp Elixir library (versions 0.2.0 through 0.5.x) lets an unauthenticated re
Fee-payer wallet draining in ZenHive mpp (Elixir) 0.2.0-0.5.x lets an unauthenticated remote client empty the sponsor's
Capture-replay authentication bypass in ZenHive mpp versions 0.6.1-0.6.3 allows unauthenticated network attackers to cla
Wallet-draining denial of service in ZenHive mpp (Elixir library) versions 0.2.0 through 0.5.x affects deployments confi
Replay of a captured Tempo subscription credential in ZenHive mpp 0.14.0 through 0.16.1 lets an attacker who already hol
ZenHive mpp versions 0.14.0 through 0.16.1 fail to charge clients that hold an open payment channel, allowing an authent
ZenHive mpp (MPP.Plug payment middleware for Elixir/Phoenix) versions 0.1.0 through 0.16.1 can allow a shared HTTP cache
Payment-replay protection in ZenHive mpp's Tempo hash-credential path is defeated by a TOCTOU race condition, allowing a
EUVD-2026-80256
GHSA-p7v4-jpp9-2m3q
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB