Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain valid settled on-chain payment hash
-
DeliverySubmit concurrent identical hash-credential requests to Tempo endpoint
-
ExploitAll requests pass non-atomic check_hash_unused read
-
Executioneth_getTransactionReceipt verifies payment per request before any write lands
-
PersistEach request receives valid resource-access receipt
-
ImpactSingle payment redeemed multiple times
Vulnerability Assessment
| Weakness |
CWE
ASVS 5.0
V15 - Secure Coding and Architecture TOCTOU prevention
|
| Exploitation Conditions | Exploitation requires that a non-nil dedup store be explicitly configured in the mpp deployment - the default nil store is stateless and documented as offering no replay protection, so deployments using the default are unaffected by this specific race (though they already lack any replay defense). The vulnerability is confined to the type='hash' credential path; the type='transaction' path uses the atomic check_and_mark/2 primitive and is not vulnerable. The exploitable race window is as wide as the eth_getTransactionReceipt RPC latency - longer blockchain RPC latency makes exploitation easier. No authentication is required (PR:N per CVSS 4.0 vector). The attacker must possess or be able to observe a valid settled payment hash, which implies either a prior legitimate payment or a hash obtained from transaction monitoring. Exploitation is constrained to mpp versions 0.2.0 through 0.6.0. |
| Impact | The CVSS 4.0 score of 6.3 is reasonable for the raw mechanics, but the financial impact on services using mpp for payment gating likely exceeds what the VI:L rating conveys - a single payment can unlock arbitrarily many resource grants depending on how quickly an attacker can saturate the race window. AT:P in the CVSS 4.0 vector correctly captures that a dedup store must be configured; the default nil store is stateless and provides no replay protection of any kind (documented), so nil-store deployments are unaffected by this specific race though they are already unprotected. AC:L in CVSS 4.0 reflects that once the configuration condition is met, the timing window is passively wide (bounded by RPC latency) rather than requiring precise millisecond manipulation. No CISA KEV listing exists and no public POC has been identified, so exploitation probability is inferred from description mechanics rather than observed attacks. EPSS data was not supplied in the input. The attack is mechanically straightforward - no authentication, no special tooling, no non-default OS configuration beyond the configured store - making the real-world risk higher than a 6.3 score may suggest for services whose revenue model depends on payment integrity. |
| Exploit ScenarioDerived | An attacker identifies a service running mpp 0.2.0-0.6.0 with a configured dedup store and obtains or observes a valid confirmed on-chain payment hash (e.g., by making a legitimate small payment). The attacker then fans out two or more concurrent HTTP requests to the Tempo verification endpoint carrying the same hash; all requests pass check_hash_unused/2 before the on-chain RPC completes for any of them, each independently verifies the payment on-chain, and each receives a valid resource-access receipt - granting multiple accesses for the cost of one payment. No authentication, elevated privileges, or specialized tooling beyond a concurrent HTTP client are required. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 19, 2026
Payment-replay protection in ZenHive mpp's Tempo hash-credential path is defeated by a TOCTOU race condition, allowing a single confirmed on-chain payment hash to be redeemed for multiple paid-resource grants. The race window spans an eth_getTransactionReceipt RPC round trip - potentially hundreds of milliseconds - during which concurrent unauthenticated requests all pass the non-atomic read guard before any write completes. Affected deployments run mpp 0.2.0 through 0.6.0 with a dedup store configured; no public exploit has been identified at time of analysis, but the attack requires only a standard concurrent HTTP client and knowledge of a valid settled payment hash.
RemediationAI
Upgrade to mpp 0.6.1 or later, which replaces mark_hash_used/2 with commit_hash_used/2 that routes through the store's atomic check_and_mark/2 primitive when supported, closing the race at commit time rather than at the initial read (patch commit 46c5b0e1311da7d92190dc7d9ea89027a1d365e9; advisory at https://github.com/ZenHive/mpp/security/advisories/GHSA-w8j7-7qc3-5f24). For stores that do not implement check_and_mark/2, the patched code falls back to a best-effort plain put - the early read remains the only non-atomic guard for those stores, so operators should migrate to an atomic-capable store backend to fully close the vulnerability. If an immediate upgrade is not possible, serializing Tempo hash-path requests at the application or reverse-proxy layer using a per-hash mutex or request queue eliminates the race at the cost of increased latency under concurrent load. Disabling the type='hash' credential path entirely and requiring type='transaction' (which already uses atomic semantics) is a more aggressive but effective interim workaround where operationally feasible.
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/BEAM library implementing the Micropayment Protocol (MPP) for Lightning Network and on-chain cryptocurrency payment gating. The vulnerability is in MPP.Methods.Tempo.verify/2 on the type='hash' credential path (lib/mpp/methods/tempo.ex). The three-step sequence - check_hash_unused/2 (plain read) → eth_getTransactionReceipt (async on-chain RPC) → mark_hash_used/2 (plain write) - is non-atomic, exactly matching CWE-367 (Time-of-Check Time-of-Use Race Condition). The store module already exposes a check_and_mark/2 atomic primitive, and the sibling type='transaction' path already uses it correctly; the hash path did not. The on-chain RPC round trip between check and mark creates a timing window wide enough for concurrent requests to each observe the hash as unused, each verify payment on-chain, and each be issued a receipt before any write lands. Reference implementations in other languages (mpp-rs Store::put_if_absent, mppx Charge.ts markHashUsed) both apply equivalent atomic semantics, confirming the intended design was atomic commit. CPE: cpe:2.3:a:zenhive:mpp:*:*:*:*:*:*:*:*.
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
AV:N as the endpoint is network-reachable; AC:H because a specific non-default dedup store configuration must be present and concurrent timing must align; PR:N confirmed by CVSS 4.0 vector; integrity-only impact.
Primary rating from Vendor (EEF).
CVSS VectorVendor: EEF
DescriptionCVE.org
Time-of-check Time-of-use (TOCTOU) Race Condition in ZenHive mpp allows an unauthenticated remote client to redeem one confirmed on-chain payment for multiple paid-resource accesses.
The type="hash" credential path in MPP.Methods.Tempo.verify/2 guards against replay with a non-atomic check-then-mark sequence: check_hash_unused/2 reads the dedup store, an eth_getTransactionReceipt round trip verifies the payment on chain, and only then does mark_hash_used/2 write the mark. Concurrent requests carrying the same settled payment hash all pass the read before any of them writes, so each is issued a receipt. The store's atomic check_and_mark/2 primitive is available and used by the type="transaction" path, but the hash path calls plain get and put even when the configured store implements it. Exploitation requires a dedup store to be configured; the default nil store is stateless and documented as offering no replay protection at all.
This issue affects mpp: from 0.2.0 before 0.6.1.
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
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
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
Duplicate-submission gate bypass in the Tempo payment method of ZenHive mpp (versions 0.2.0 through 0.16.1) lets an unau
ZenHive mpp (MPP.Plug payment middleware for Elixir/Phoenix) versions 0.1.0 through 0.16.1 can allow a shared HTTP cache
EUVD-2026-62591
GHSA-vjfr-ffhr-5g8p
NVD
CVE.org
EPSS
Vulnrichment
VulDB
Exploit-DB