Summary
CVE-2026-67581 is a high-severity authentication bypass / payment-verification flaw in ZenHive’s mpp Elixir package (an implementation of the Machine Payments Protocol used as HTTP 402 payment middleware for AI agents and machine-to-machine commerce). The MPP.Methods.EVM.verify/2 function fails to enforce single-use semantics on on-chain transfer proofs, allowing a single settled blockchain transaction to be replayed to satisfy an unlimited number of subsequent payment challenges. The issue affects versions 0.3.0 through 0.6.2 and is fixed in 0.6.3.
Technical details
- Root cause: The EVM payment verification logic validates a submitted transfer proof solely by matching
token,to(recipient), andamountfields against historical on-chain transfers. It does not bind the proof to a specific payment challenge, nor does it track/consume the underlying transaction hash once used. - Trigger conditions: Because challenge IDs regenerate on every payment request/response cycle, an attacker who has completed (or observed) one valid on-chain transfer matching a given token/recipient/amount combination can resubmit that same transaction as proof against any new challenge with matching parameters — most easily exploited on static-price routes.
- Attack vector: Network-based, no authentication or user interaction required (
AV:N,AC:L,AT:N,PR:N,UI:N), since the affected code path is the public payment-verification endpoint of the middleware. - Impact: Attackers can bypass payment enforcement entirely, obtaining unlimited access to paid resources/services gated behind the mpp payment middleware after paying for access only once, resulting in loss of integrity/availability of the payment-gating mechanism (billing bypass / free access to metered resources).
Affected software
- ZenHive
mpp(Erlang/Elixir Hex package), versions 0.3.0 through 0.6.2 (inclusive) - Git revisions up to and including commit
65b9e425ce27631c786a5b380b5e4c5ae607ec6d - Fixed in version 0.6.3
Severity
- CVSS v4.0 Base Score: 8.7 (High)
- Vector:
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N
Mitigation and recommended actions
- Immediate: Upgrade
mppto version 0.6.3 or later. The patched version adds support for anMPP.Tempo.Storededup store that checks a submitted transaction hash for prior use and atomically marks it consumed after verification, rejecting misconfigured stores at initialization. - If unable to patch immediately:
- Configure per-challenge pricing (e.g., vary the required amount slightly per challenge) so that a previously used transaction cannot satisfy a new charge’s exact token/recipient/amount match.
- Enforce short challenge expiry windows to reduce the replay window.
- Consider migrating on-chain payment flows to the Tempo payment method, which is not affected by this weakness.
- After upgrading to 0.6.3, configure a dedup store with a TTL matching the challenge expiry duration to fully enforce single-use transaction semantics.

