Search
Find a vulnerability
Search criteria
ⓘ
Use this form to refine search results.
Full-text search supports keyword queries with ranking and filtering.
You can combine vendor, product, and sources to narrow results.
Enable “Apply ordering” to sort by date instead of relevance.
22 vulnerabilities by ZenHive
CVE-2026-89186 (GCVE-0-2026-89186)
Vulnerability from nvd – Published: 2026-09-16 08:24 – Updated: 2026-09-16 14:50
VLAI
EPSS
VEX
Title
mpp writes Payment-Receipt and Cache-Control before the wrapped application runs, letting a consumer's own Cache-Control expose paid responses to shared caches
Summary
Use of Cache Containing Sensitive Information in ZenHive mpp allows a shared HTTP cache to store a paid response and serve it to clients that never paid.
MPP.Plug.verify_credential in lib/mpp/plug.ex sets payment-receipt and cache-control: private on the connection before the wrapped application runs, and registers no register_before_send/2 callback. Plug.Conn.put_resp_header/3 replaces an existing header, so a mounting application that sets its own cache-control on the paid resource (for example public, max-age=3600) silently overrides the private the library relies on, and a CDN or reverse proxy can then store the paid 200 together with its Payment-Receipt and serve both to unpaid clients. The library-level guarantee is therefore defeatable by the application it protects. For the same reason a downstream non-2xx response still carried Payment-Receipt, issuing a receipt for a response that delivered no resource.
This issue affects mpp: from 0.1.0 before 0.16.2.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-16 14:50 UTC
CWE
- CWE-524 - Use of Cache Containing Sensitive Information
Assigner
References
5 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | relatedvendor-advisory |
| https://cna.erlef.org/cves/CVE-2026-89186.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-89186 | related |
| https://github.com/ZenHive/mpp/commit/2d4d1d94aae… | related |
| https://github.com/ZenHive/mpp/commit/2fd91a5ecbd… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-89186",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-16T14:50:34.541725Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T14:50:44.399Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Plug\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/plug.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Plug\u0027:call/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.16.2",
"status": "affected",
"version": "0.1.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Plug\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/plug.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Plug\u0027:call/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "2fd91a5ecbd0b0ad2a4ac202b79659e8126dbc0b",
"status": "affected",
"version": "2d4d1d94aae7790ae0623063961adbeef171fa71",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eReachable only where the application mounted behind \u003ccode\u003eMPP.Plug\u003c/code\u003e sets its own \u003ccode\u003eCache-Control\u003c/code\u003e on the paid resource, overriding the \u003ccode\u003eprivate\u003c/code\u003e the library wrote, and a shared HTTP cache (CDN or reverse proxy) sits in front of that route. An application that sets no \u003ccode\u003eCache-Control\u003c/code\u003e of its own keeps the library\u0027s \u003ccode\u003eprivate\u003c/code\u003e and is not affected.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Reachable only where the application mounted behind `MPP.Plug` sets its own `Cache-Control` on the paid resource, overriding the `private` the library wrote, and a shared HTTP cache (CDN or reverse proxy) sits in front of that route. An application that sets no `Cache-Control` of its own keeps the library\u0027s `private` and is not affected."
}
],
"value": "Reachable only where the application mounted behind MPP.Plug sets its own Cache-Control on the paid resource, overriding the private the library wrote, and a shared HTTP cache (CDN or reverse proxy) sits in front of that route. An application that sets no Cache-Control of its own keeps the library\u0027s private and is not affected."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.16.2",
"versionStartIncluding": "0.1.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "coordinator",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"dateAssigned": "2026-09-15T15:22:44.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eUse of Cache Containing Sensitive Information in ZenHive mpp allows a shared HTTP cache to store a paid response and serve it to clients that never paid.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Plug.verify_credential\u003c/code\u003e in \u003ccode\u003elib/mpp/plug.ex\u003c/code\u003e sets \u003ccode\u003epayment-receipt\u003c/code\u003e and \u003ccode\u003ecache-control: private\u003c/code\u003e on the connection before the wrapped application runs, and registers no \u003ccode\u003eregister_before_send/2\u003c/code\u003e callback. \u003ccode\u003ePlug.Conn.put_resp_header/3\u003c/code\u003e replaces an existing header, so a mounting application that sets its own \u003ccode\u003ecache-control\u003c/code\u003e on the paid resource (for example \u003ccode\u003epublic, max-age=3600\u003c/code\u003e) silently overrides the \u003ccode\u003eprivate\u003c/code\u003e the library relies on, and a CDN or reverse proxy can then store the paid 200 together with its \u003ccode\u003ePayment-Receipt\u003c/code\u003e and serve both to unpaid clients. The library-level guarantee is therefore defeatable by the application it protects. For the same reason a downstream non-2xx response still carried \u003ccode\u003ePayment-Receipt\u003c/code\u003e, issuing a receipt for a response that delivered no resource.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.1.0 before 0.16.2.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Use of Cache Containing Sensitive Information in ZenHive mpp allows a shared HTTP cache to store a paid response and serve it to clients that never paid.\n\n`MPP.Plug.verify_credential` in `lib/mpp/plug.ex` sets `payment-receipt` and `cache-control: private` on the connection before the wrapped application runs, and registers no `register_before_send/2` callback. `Plug.Conn.put_resp_header/3` replaces an existing header, so a mounting application that sets its own `cache-control` on the paid resource (for example `public, max-age=3600`) silently overrides the `private` the library relies on, and a CDN or reverse proxy can then store the paid 200 together with its `Payment-Receipt` and serve both to unpaid clients. The library-level guarantee is therefore defeatable by the application it protects. For the same reason a downstream non-2xx response still carried `Payment-Receipt`, issuing a receipt for a response that delivered no resource.\n\nThis issue affects mpp: from 0.1.0 before 0.16.2."
}
],
"value": "Use of Cache Containing Sensitive Information in ZenHive mpp allows a shared HTTP cache to store a paid response and serve it to clients that never paid.\n\nMPP.Plug.verify_credential in lib/mpp/plug.ex sets payment-receipt and cache-control: private on the connection before the wrapped application runs, and registers no register_before_send/2 callback. Plug.Conn.put_resp_header/3 replaces an existing header, so a mounting application that sets its own cache-control on the paid resource (for example public, max-age=3600) silently overrides the private the library relies on, and a CDN or reverse proxy can then store the paid 200 together with its Payment-Receipt and serve both to unpaid clients. The library-level guarantee is therefore defeatable by the application it protects. For the same reason a downstream non-2xx response still carried Payment-Receipt, issuing a receipt for a response that delivered no resource.\n\nThis issue affects mpp: from 0.1.0 before 0.16.2."
}
],
"impacts": [
{
"capecId": "CAPEC-204",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAn unpaid client requesting the same URL through the shared cache receives the cached paid response, including the \u003ccode\u003ePayment-Receipt\u003c/code\u003e header issued to the paying client. Operators lose the revenue for every cache hit, and the receipt identifying a paid transaction is disclosed to third parties.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "An unpaid client requesting the same URL through the shared cache receives the cached paid response, including the `Payment-Receipt` header issued to the paying client. Operators lose the revenue for every cache hit, and the receipt identifying a paid transaction is disclosed to third parties."
}
],
"value": "An unpaid client requesting the same URL through the shared cache receives the cached paid response, including the Payment-Receipt header issued to the paying client. Operators lose the revenue for every cache hit, and the receipt identifying a paid transaction is disclosed to third parties."
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 6.3,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "LOW",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "LOW",
"vulnIntegrityImpact": "NONE",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-524",
"description": "CWE-524 Use of Cache Containing Sensitive Information",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T08:24:15.058Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"name": "GitHub Advisory",
"tags": [
"related",
"vendor-advisory"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-82qh-vrvm-gqvc"
},
{
"name": "EEF CNA record for CVE-2026-89186",
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-89186.html"
},
{
"name": "OSV record EEF-CVE-2026-89186",
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-89186"
},
{
"name": "Introducing commit 2d4d1d9 in ZenHive/mpp",
"tags": [
"related"
],
"url": "https://github.com/ZenHive/mpp/commit/2d4d1d94aae7790ae0623063961adbeef171fa71"
},
{
"name": "Fix commit 2fd91a5 in ZenHive/mpp",
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/2fd91a5ecbd0b0ad2a4ac202b79659e8126dbc0b"
}
],
"source": {
"discovery": "INTERNAL"
},
"title": "mpp writes Payment-Receipt and Cache-Control before the wrapped application runs, letting a consumer\u0027s own Cache-Control expose paid responses to shared caches",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eIn the application mounted behind \u003ccode\u003eMPP.Plug\u003c/code\u003e, stop setting \u003ccode\u003eCache-Control\u003c/code\u003e on paid routes so the library\u0027s \u003ccode\u003eprivate\u003c/code\u003e survives to the response, or set a directive that is itself safe for a shared cache (\u003ccode\u003eprivate\u003c/code\u003e, or \u003ccode\u003eno-store\u003c/code\u003e). Where the application must set its own caching policy, configure the CDN or reverse proxy not to cache responses carrying a \u003ccode\u003ePayment-Receipt\u003c/code\u003e header.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "In the application mounted behind `MPP.Plug`, stop setting `Cache-Control` on paid routes so the library\u0027s `private` survives to the response, or set a directive that is itself safe for a shared cache (`private`, or `no-store`). Where the application must set its own caching policy, configure the CDN or reverse proxy not to cache responses carrying a `Payment-Receipt` header."
}
],
"value": "In the application mounted behind MPP.Plug, stop setting Cache-Control on paid routes so the library\u0027s private survives to the response, or set a directive that is itself safe for a shared cache (private, or no-store). Where the application must set its own caching policy, configure the CDN or reverse proxy not to cache responses carrying a Payment-Receipt header."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-89186",
"datePublished": "2026-09-16T08:24:15.058Z",
"dateReserved": "2026-09-11T19:00:02.549Z",
"dateUpdated": "2026-09-16T14:50:44.399Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-88255 (GCVE-0-2026-88255)
Vulnerability from nvd – Published: 2026-09-16 08:24 – Updated: 2026-09-16 14:49
VLAI
EPSS
VEX
Title
mpp Tempo keys its pre-broadcast dedup reserve on the caller-supplied transaction encoding, so a re-encoded signed transaction reserves a second slot
Summary
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.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-16 14:49 UTC
CWE
- CWE-1289 - Improper Validation of Unsafe Equivalence in Input
Assigner
References
5 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | relatedvendor-advisory |
| https://cna.erlef.org/cves/CVE-2026-88255.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-88255 | related |
| https://github.com/ZenHive/mpp/commit/f8904666061… | related |
| https://github.com/ZenHive/mpp/commit/e12bd4a1cea… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-88255",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-16T14:49:50.266563Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T14:49:57.782Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.16.2",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "e12bd4a1cea2e97c2a01fc059c48e5594a7b4a43",
"status": "affected",
"version": "f8904666061fbab695874856d8fcd02c471dfe1b",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eReachable when \u003ccode\u003eMPP.Methods.Tempo\u003c/code\u003e broadcasts a \u003ccode\u003etype=\"transaction\"\u003c/code\u003e credential with a dedup store in place. From mpp 0.7.0 the dedup store is on by default (the app-started \u003ccode\u003eMPP.Tempo.ConCacheStore\u003c/code\u003e; opt out with \u003ccode\u003estore: false\u003c/code\u003e), so every default Tempo deployment from 0.7.0 before 0.16.2 is affected. Before 0.7.0 the default store was \u003ccode\u003enil\u003c/code\u003e, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue; those versions are affected only where a \u003ccode\u003e\"store\"\u003c/code\u003e was configured explicitly in \u003ccode\u003emethod_config\u003c/code\u003e.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Reachable when `MPP.Methods.Tempo` broadcasts a `type=\"transaction\"` credential with a dedup store in place. From mpp 0.7.0 the dedup store is on by default (the app-started `MPP.Tempo.ConCacheStore`; opt out with `store: false`), so every default Tempo deployment from 0.7.0 before 0.16.2 is affected. Before 0.7.0 the default store was `nil`, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue; those versions are affected only where a `\"store\"` was configured explicitly in `method_config`."
}
],
"value": "Reachable when MPP.Methods.Tempo broadcasts a type=\"transaction\" credential with a dedup store in place. From mpp 0.7.0 the dedup store is on by default (the app-started MPP.Tempo.ConCacheStore; opt out with store: false), so every default Tempo deployment from 0.7.0 before 0.16.2 is affected. Before 0.7.0 the default store was nil, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue; those versions are affected only where a \"store\" was configured explicitly in method_config."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.16.2",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "coordinator",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"dateAssigned": "2026-09-15T15:20:56.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper 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.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Methods.Tempo\u003c/code\u003e reserves the pre-broadcast dedup slot on the caller-supplied hex in \u003ccode\u003ereserve_hash_atomic/2\u003c/code\u003e, keyed through \u003ccode\u003estore_key/1\u003c/code\u003e on \u003ccode\u003etx.raw\u003c/code\u003e rather than on a canonical form of the transaction. The deserializer stores the caller\u0027s hex verbatim and accepts both recovery-id encodings, so one signed transaction submitted once with \u003ccode\u003ev=27\u003c/code\u003e and once with \u003ccode\u003ev=0\u003c/code\u003e 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 \u003ccode\u003etempo\u003c/code\u003e in \u003ccode\u003elib/mpp/replay.ex\u003c/code\u003e, leaving this reserve as the only gate, and the post-broadcast mark writes the canonical hash key that the raw-keyed reserve never reads.\u003c/p\u003e\n\u003cp\u003eWhat 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 \u003ccode\u003ePayment-Receipt\u003c/code\u003e for a single on-chain payment.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.16.2.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "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.\n\n`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\u0027s 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.\n\nWhat 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.\n\nThis issue affects mpp: from 0.2.0 before 0.16.2."
}
],
"value": "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.\n\nMPP.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\u0027s 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.\n\nWhat 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.\n\nThis issue affects mpp: from 0.2.0 before 0.16.2."
}
],
"impacts": [
{
"capecId": "CAPEC-267",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eA client re-encodes the recovery id of a transaction it has already submitted and presents it again. The duplicate passes the only duplicate-submission gate the Tempo method has, and against a node that answers with the canonical hash for an already-known transaction the client is issued a second \u003ccode\u003ePayment-Receipt\u003c/code\u003e for one on-chain payment.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "A client re-encodes the recovery id of a transaction it has already submitted and presents it again. The duplicate passes the only duplicate-submission gate the Tempo method has, and against a node that answers with the canonical hash for an already-known transaction the client is issued a second `Payment-Receipt` for one on-chain payment."
}
],
"value": "A client re-encodes the recovery id of a transaction it has already submitted and presents it again. The duplicate passes the only duplicate-submission gate the Tempo method has, and against a node that answers with the canonical hash for an already-known transaction the client is issued a second Payment-Receipt for one on-chain payment."
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 6.3,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "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",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "LOW",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1289",
"description": "CWE-1289 Improper Validation of Unsafe Equivalence in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T08:24:40.446Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"name": "GitHub Advisory",
"tags": [
"related",
"vendor-advisory"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-8x7x-5j8g-8hcx"
},
{
"name": "EEF CNA record for CVE-2026-88255",
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-88255.html"
},
{
"name": "OSV record EEF-CVE-2026-88255",
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-88255"
},
{
"name": "Introducing commit f890466 in ZenHive/mpp",
"tags": [
"related"
],
"url": "https://github.com/ZenHive/mpp/commit/f8904666061fbab695874856d8fcd02c471dfe1b"
},
{
"name": "Fix commit e12bd4a in ZenHive/mpp",
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/e12bd4a1cea2e97c2a01fc059c48e5594a7b4a43"
}
],
"source": {
"discovery": "INTERNAL"
},
"title": "mpp Tempo keys its pre-broadcast dedup reserve on the caller-supplied transaction encoding, so a re-encoded signed transaction reserves a second slot"
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-88255",
"datePublished": "2026-09-16T08:24:40.446Z",
"dateReserved": "2026-09-11T18:30:01.336Z",
"dateUpdated": "2026-09-16T14:49:57.782Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-82751 (GCVE-0-2026-82751)
Vulnerability from nvd – Published: 2026-09-06 16:07 – Updated: 2026-09-08 18:24
VLAI
EPSS
VEX
Title
Unbounded key authorization in mpp Tempo fee-payer sponsorship inflates gas cost and sponsors access-key provisioning
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer's gas cost per sponsored payment by a large multiplier and to have the sponsor pay for provisioning an access key on the client's own account.
When the server sponsors Tempo payments, MPP.Methods.Tempo.FeePayerPolicy.measure/3 in lib/mpp/methods/tempo/fee_payer_policy.ex bounds the gas fields, the fee budget, the validity window and the access list of the client-signed 0x76 envelope, but does not check whether the envelope carries the optional key_authorization field. A client can attach a fully signed key authorization, provisioning a new access key with token spending limits on its own account, alongside the normal payment call. The key and each limit entry are persistent storage writes billed as intrinsic gas to the sponsor, bounded only by the gas_limit ceiling. At the reporter's default of one key with three token limits the sponsored cost rises from about 46,587 gas to about 1,808,700 gas, and the client keeps a valid access key it paid nothing for.
This issue affects mpp: from 0.2.0 before 0.16.1.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-08 18:24 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-82751.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-82751 | related |
| https://github.com/ZenHive/mpp/commit/0482572b47e… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-82751",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-08T18:24:07.502205Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-08T18:24:19.598Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:measure/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.16.1",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:measure/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0482572b47e1ffe1537ab80ab613d47b92833c2d",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eOnly deployments that enable Tempo server-side fee sponsorship are affected, through \u003ccode\u003e\"fee_payer\" =\u0026gt; true\u003c/code\u003e in \u003ccode\u003emethod_config\u003c/code\u003e with either local co-signing (\u003ccode\u003efee_payer_private_key\u003c/code\u003e) or hosted sponsorship (\u003ccode\u003efee_payer_url\u003c/code\u003e). Sponsorship is disabled by default.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through `\"fee_payer\" =\u003e true` in `method_config` with either local co-signing (`fee_payer_private_key`) or hosted sponsorship (`fee_payer_url`). Sponsorship is disabled by default."
}
],
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through \"fee_payer\" =\u003e true in method_config with either local co-signing (fee_payer_private_key) or hosted sponsorship (fee_payer_url). Sponsorship is disabled by default."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.16.1",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "reporter",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "coordinator",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for provisioning an access key on the client\u0027s own account.\u003c/p\u003e\n\u003cp\u003eWhen the server sponsors Tempo payments, \u003ccode\u003eMPP.Methods.Tempo.FeePayerPolicy.measure/3\u003c/code\u003e in \u003ccode\u003elib/mpp/methods/tempo/fee_payer_policy.ex\u003c/code\u003e bounds the gas fields, the fee budget, the validity window and the access list of the client-signed \u003ccode\u003e0x76\u003c/code\u003e envelope, but does not check whether the envelope carries the optional \u003ccode\u003ekey_authorization\u003c/code\u003e field. A client can attach a fully signed key authorization, provisioning a new access key with token spending limits on its own account, alongside the normal payment call. The key and each limit entry are persistent storage writes billed as intrinsic gas to the sponsor, bounded only by the \u003ccode\u003egas_limit\u003c/code\u003e ceiling. At the reporter\u0027s default of one key with three token limits the sponsored cost rises from about 46,587 gas to about 1,808,700 gas, and the client keeps a valid access key it paid nothing for.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.16.1.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for provisioning an access key on the client\u0027s own account.\n\nWhen the server sponsors Tempo payments, `MPP.Methods.Tempo.FeePayerPolicy.measure/3` in `lib/mpp/methods/tempo/fee_payer_policy.ex` bounds the gas fields, the fee budget, the validity window and the access list of the client-signed `0x76` envelope, but does not check whether the envelope carries the optional `key_authorization` field. A client can attach a fully signed key authorization, provisioning a new access key with token spending limits on its own account, alongside the normal payment call. The key and each limit entry are persistent storage writes billed as intrinsic gas to the sponsor, bounded only by the `gas_limit` ceiling. At the reporter\u0027s default of one key with three token limits the sponsored cost rises from about 46,587 gas to about 1,808,700 gas, and the client keeps a valid access key it paid nothing for.\n\nThis issue affects mpp: from 0.2.0 before 0.16.1."
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for provisioning an access key on the client\u0027s own account.\n\nWhen the server sponsors Tempo payments, MPP.Methods.Tempo.FeePayerPolicy.measure/3 in lib/mpp/methods/tempo/fee_payer_policy.ex bounds the gas fields, the fee budget, the validity window and the access list of the client-signed 0x76 envelope, but does not check whether the envelope carries the optional key_authorization field. A client can attach a fully signed key authorization, provisioning a new access key with token spending limits on its own account, alongside the normal payment call. The key and each limit entry are persistent storage writes billed as intrinsic gas to the sponsor, bounded only by the gas_limit ceiling. At the reporter\u0027s default of one key with three token limits the sponsored cost rises from about 46,587 gas to about 1,808,700 gas, and the client keeps a valid access key it paid nothing for.\n\nThis issue affects mpp: from 0.2.0 before 0.16.1."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "LOW",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-06T16:07:26.407Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-rpwj-vrf7-4x36"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-82751.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-82751"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/0482572b47e1ffe1537ab80ab613d47b92833c2d"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unbounded key authorization in mpp Tempo fee-payer sponsorship inflates gas cost and sponsors access-key provisioning",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eDisable Tempo fee sponsorship by leaving \u003ccode\u003e\"fee_payer\"\u003c/code\u003e at its default of \u003ccode\u003efalse\u003c/code\u003e and setting no \u003ccode\u003efee_payer_url\u003c/code\u003e, so the client pays its own gas. Where sponsorship must stay enabled, lower the \u003ccode\u003emax_gas\u003c/code\u003e override in \u003ccode\u003efee_payer_policy\u003c/code\u003e to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope carrying a key authorization either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Disable Tempo fee sponsorship by leaving `\"fee_payer\"` at its default of `false` and setting no `fee_payer_url`, so the client pays its own gas. Where sponsorship must stay enabled, lower the `max_gas` override in `fee_payer_policy` to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope carrying a key authorization either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it."
}
],
"value": "Disable Tempo fee sponsorship by leaving \"fee_payer\" at its default of false and setting no fee_payer_url, so the client pays its own gas. Where sponsorship must stay enabled, lower the max_gas override in fee_payer_policy to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope carrying a key authorization either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-82751",
"datePublished": "2026-09-06T16:07:26.407Z",
"dateReserved": "2026-08-31T01:00:09.775Z",
"dateUpdated": "2026-09-08T18:24:19.598Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-82750 (GCVE-0-2026-82750)
Vulnerability from nvd – Published: 2026-09-06 16:08 – Updated: 2026-09-08 18:25
VLAI
EPSS
VEX
Title
Unbounded EIP-7702 authorization list in mpp Tempo fee-payer sponsorship inflates gas cost and sponsors account delegation
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer's gas cost per sponsored payment by a large multiplier and to have the sponsor pay for EIP-7702 account delegations of the client's choosing.
When the server sponsors Tempo payments, MPP.Methods.Tempo.FeePayerPolicy.measure/3 in lib/mpp/methods/tempo/fee_payer_policy.ex bounds the gas fields, the fee budget, the validity window and the access list of the client-signed 0x76 envelope, but never reads its aa_authorization_list field. Every signed delegation in that list is charged as intrinsic gas before the payment call runs, so a client attaching delegations from throwaway authority keys makes the sponsor pay for them within the default gas_limit ceiling. At the reporter's default of seven entries the sponsored cost rises from about 46,575 gas to about 1,884,087 gas. Because each entry is applied as a persistent set-code delegation, a client can also upgrade its own accounts to delegated code at the sponsor's expense.
This issue affects mpp: from 0.2.0 before 0.16.1.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-08 18:25 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-82750.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-82750 | related |
| https://github.com/ZenHive/mpp/commit/0482572b47e… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-82750",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-08T18:25:27.116993Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-08T18:25:42.388Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:measure/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.16.1",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:measure/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0482572b47e1ffe1537ab80ab613d47b92833c2d",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eOnly deployments that enable Tempo server-side fee sponsorship are affected, through \u003ccode\u003e\"fee_payer\" =\u0026gt; true\u003c/code\u003e in \u003ccode\u003emethod_config\u003c/code\u003e with either local co-signing (\u003ccode\u003efee_payer_private_key\u003c/code\u003e) or hosted sponsorship (\u003ccode\u003efee_payer_url\u003c/code\u003e). Sponsorship is disabled by default.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through `\"fee_payer\" =\u003e true` in `method_config` with either local co-signing (`fee_payer_private_key`) or hosted sponsorship (`fee_payer_url`). Sponsorship is disabled by default."
}
],
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through \"fee_payer\" =\u003e true in method_config with either local co-signing (fee_payer_private_key) or hosted sponsorship (fee_payer_url). Sponsorship is disabled by default."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.16.1",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "reporter",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "coordinator",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for EIP-7702 account delegations of the client\u0027s choosing.\u003c/p\u003e\n\u003cp\u003eWhen the server sponsors Tempo payments, \u003ccode\u003eMPP.Methods.Tempo.FeePayerPolicy.measure/3\u003c/code\u003e in \u003ccode\u003elib/mpp/methods/tempo/fee_payer_policy.ex\u003c/code\u003e bounds the gas fields, the fee budget, the validity window and the access list of the client-signed \u003ccode\u003e0x76\u003c/code\u003e envelope, but never reads its \u003ccode\u003eaa_authorization_list\u003c/code\u003e field. Every signed delegation in that list is charged as intrinsic gas before the payment call runs, so a client attaching delegations from throwaway authority keys makes the sponsor pay for them within the default \u003ccode\u003egas_limit\u003c/code\u003e ceiling. At the reporter\u0027s default of seven entries the sponsored cost rises from about 46,575 gas to about 1,884,087 gas. Because each entry is applied as a persistent set-code delegation, a client can also upgrade its own accounts to delegated code at the sponsor\u0027s expense.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.16.1.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for EIP-7702 account delegations of the client\u0027s choosing.\n\nWhen the server sponsors Tempo payments, `MPP.Methods.Tempo.FeePayerPolicy.measure/3` in `lib/mpp/methods/tempo/fee_payer_policy.ex` bounds the gas fields, the fee budget, the validity window and the access list of the client-signed `0x76` envelope, but never reads its `aa_authorization_list` field. Every signed delegation in that list is charged as intrinsic gas before the payment call runs, so a client attaching delegations from throwaway authority keys makes the sponsor pay for them within the default `gas_limit` ceiling. At the reporter\u0027s default of seven entries the sponsored cost rises from about 46,575 gas to about 1,884,087 gas. Because each entry is applied as a persistent set-code delegation, a client can also upgrade its own accounts to delegated code at the sponsor\u0027s expense.\n\nThis issue affects mpp: from 0.2.0 before 0.16.1."
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for EIP-7702 account delegations of the client\u0027s choosing.\n\nWhen the server sponsors Tempo payments, MPP.Methods.Tempo.FeePayerPolicy.measure/3 in lib/mpp/methods/tempo/fee_payer_policy.ex bounds the gas fields, the fee budget, the validity window and the access list of the client-signed 0x76 envelope, but never reads its aa_authorization_list field. Every signed delegation in that list is charged as intrinsic gas before the payment call runs, so a client attaching delegations from throwaway authority keys makes the sponsor pay for them within the default gas_limit ceiling. At the reporter\u0027s default of seven entries the sponsored cost rises from about 46,575 gas to about 1,884,087 gas. Because each entry is applied as a persistent set-code delegation, a client can also upgrade its own accounts to delegated code at the sponsor\u0027s expense.\n\nThis issue affects mpp: from 0.2.0 before 0.16.1."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "LOW",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-06T16:08:41.089Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-5qrp-r24c-w6jr"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-82750.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-82750"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/0482572b47e1ffe1537ab80ab613d47b92833c2d"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unbounded EIP-7702 authorization list in mpp Tempo fee-payer sponsorship inflates gas cost and sponsors account delegation",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eDisable Tempo fee sponsorship by leaving \u003ccode\u003e\"fee_payer\"\u003c/code\u003e at its default of \u003ccode\u003efalse\u003c/code\u003e and setting no \u003ccode\u003efee_payer_url\u003c/code\u003e, so the client pays its own gas. Where sponsorship must stay enabled, lower the \u003ccode\u003emax_gas\u003c/code\u003e override in \u003ccode\u003efee_payer_policy\u003c/code\u003e to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope padded with delegations either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Disable Tempo fee sponsorship by leaving `\"fee_payer\"` at its default of `false` and setting no `fee_payer_url`, so the client pays its own gas. Where sponsorship must stay enabled, lower the `max_gas` override in `fee_payer_policy` to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope padded with delegations either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it."
}
],
"value": "Disable Tempo fee sponsorship by leaving \"fee_payer\" at its default of false and setting no fee_payer_url, so the client pays its own gas. Where sponsorship must stay enabled, lower the max_gas override in fee_payer_policy to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope padded with delegations either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-82750",
"datePublished": "2026-09-06T16:08:41.089Z",
"dateReserved": "2026-08-31T01:00:09.774Z",
"dateUpdated": "2026-09-08T18:25:42.388Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-73829 (GCVE-0-2026-73829)
Vulnerability from nvd – Published: 2026-08-19 17:19 – Updated: 2026-08-19 18:58
VLAI
EPSS
VEX
Title
Non-atomic hash-credential dedup in mpp Tempo allows replay of a confirmed payment under a concurrent race
Summary
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.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-08-19 18:55 UTC
CWE
- CWE-367 - Time-of-check Time-of-use (TOCTOU) Race Condition
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-73829.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-73829 | related |
| https://github.com/ZenHive/mpp/commit/46c5b0e1311… | patch |
Impacted products
Date Public
2026-06-29 00:00
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-73829",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-19T18:55:14.304500Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T18:58:33.322Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.1",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "46c5b0e1311da7d92190dc7d9ea89027a1d365e9",
"status": "affected",
"version": "f8904666061fbab695874856d8fcd02c471dfe1b",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe race is only reachable when \u003ccode\u003eMPP.Methods.Tempo\u003c/code\u003e is configured with a dedup store (\u003ccode\u003e\"store\"\u003c/code\u003e in \u003ccode\u003emethod_config\u003c/code\u003e). The default is \u003ccode\u003enil\u003c/code\u003e, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "The race is only reachable when `MPP.Methods.Tempo` is configured with a dedup store (`\"store\"` in `method_config`). The default is `nil`, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue."
}
],
"value": "The race is only reachable when MPP.Methods.Tempo is configured with a dedup store (\"store\" in method_config). The default is nil, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.1",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
},
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
}
],
"datePublic": "2026-06-29T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eTime-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.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003etype=\"hash\"\u003c/code\u003e credential path in \u003ccode\u003eMPP.Methods.Tempo.verify/2\u003c/code\u003e guards against replay with a non-atomic check-then-mark sequence: \u003ccode\u003echeck_hash_unused/2\u003c/code\u003e reads the dedup store, an \u003ccode\u003eeth_getTransactionReceipt\u003c/code\u003e round trip verifies the payment on chain, and only then does \u003ccode\u003emark_hash_used/2\u003c/code\u003e 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\u0027s atomic \u003ccode\u003echeck_and_mark/2\u003c/code\u003e primitive is available and used by the \u003ccode\u003etype=\"transaction\"\u003c/code\u003e path, but the hash path calls plain \u003ccode\u003eget\u003c/code\u003e and \u003ccode\u003eput\u003c/code\u003e even when the configured store implements it. Exploitation requires a dedup store to be configured; the default \u003ccode\u003enil\u003c/code\u003e store is stateless and documented as offering no replay protection at all.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.6.1.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "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.\n\nThe `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\u0027s 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.\n\nThis issue affects mpp: from 0.2.0 before 0.6.1."
}
],
"value": "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.\n\nThe 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\u0027s 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.\n\nThis issue affects mpp: from 0.2.0 before 0.6.1."
}
],
"impacts": [
{
"capecId": "CAPEC-29",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-29 Leveraging Time-of-Check and Time-of-Use (TOCTOU) Race Conditions"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 6.3,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "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",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "LOW",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-367",
"description": "CWE-367 Time-of-check Time-of-use (TOCTOU) Race Condition",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T17:19:43.696Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-w8j7-7qc3-5f24"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-73829.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-73829"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/46c5b0e1311da7d92190dc7d9ea89027a1d365e9"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Non-atomic hash-credential dedup in mpp Tempo allows replay of a confirmed payment under a concurrent race"
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-73829",
"datePublished": "2026-08-19T17:19:43.696Z",
"dateReserved": "2026-08-17T11:15:02.320Z",
"dateUpdated": "2026-08-19T18:58:33.322Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-73541 (GCVE-0-2026-73541)
Vulnerability from nvd – Published: 2026-08-19 17:20 – Updated: 2026-08-19 18:47
VLAI
EPSS
VEX
Title
Tempo fee sponsorship in mpp bounds each transaction but not aggregate exposure, allowing concurrent sponsor-wallet drain
Summary
Allocation of Resources Without Limits or Throttling in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet through concurrent sponsored payments, denying service to legitimate payers once it is empty.
MPP.Methods.Tempo.FeePayerPolicy enforces its ceilings (max_gas, max_fee_per_gas, max_priority_fee_per_gas, the worst-case gas_limit * max_fee_per_gas <= max_total_fee budget cap, and a validity window) against one transaction at a time, and nothing accounts for exposure across concurrent requests. reserve_hash_atomic/2 is keyed on the transaction hash, so it prevents duplicate broadcast of the same signed transaction but not N distinct sponsored transactions carrying distinct expiring nonces. Committed sponsor exposure is therefore N times max_total_fee, bounded by nothing in the library, and the default 900 second validity window lets co-signed transactions stay broadcastable and uncounted for that entire period.
This issue affects mpp: from 0.2.0 before 0.12.0.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: total
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-08-19 18:45 UTC
CWE
- CWE-770 - Allocation of Resources Without Limits or Throttling
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-73541.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-73541 | related |
| https://github.com/ZenHive/mpp/commit/ddc46868fba… | patch |
Impacted products
Date Public
2026-08-02 00:00
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-73541",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "total"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-19T18:45:45.477502Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T18:47:04.542Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.12.0",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "ddc46868fba57ccebb567c04709812b466123076",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eOnly deployments that enable Tempo server-side fee sponsorship are affected, through \u003ccode\u003e\"fee_payer\" =\u0026gt; true\u003c/code\u003e in \u003ccode\u003emethod_config\u003c/code\u003e with either local co-signing (\u003ccode\u003efee_payer_private_key\u003c/code\u003e) or hosted sponsorship (\u003ccode\u003efee_payer_url\u003c/code\u003e). Sponsorship is disabled by default.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through `\"fee_payer\" =\u003e true` in `method_config` with either local co-signing (`fee_payer_private_key`) or hosted sponsorship (`fee_payer_url`). Sponsorship is disabled by default."
}
],
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through \"fee_payer\" =\u003e true in method_config with either local co-signing (fee_payer_private_key) or hosted sponsorship (fee_payer_url). Sponsorship is disabled by default."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.12.0",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"datePublic": "2026-08-02T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAllocation of Resources Without Limits or Throttling in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet through concurrent sponsored payments, denying service to legitimate payers once it is empty.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Methods.Tempo.FeePayerPolicy\u003c/code\u003e enforces its ceilings (\u003ccode\u003emax_gas\u003c/code\u003e, \u003ccode\u003emax_fee_per_gas\u003c/code\u003e, \u003ccode\u003emax_priority_fee_per_gas\u003c/code\u003e, the worst-case \u003ccode\u003egas_limit * max_fee_per_gas \u0026lt;= max_total_fee\u003c/code\u003e budget cap, and a validity window) against one transaction at a time, and nothing accounts for exposure across concurrent requests. \u003ccode\u003ereserve_hash_atomic/2\u003c/code\u003e is keyed on the transaction hash, so it prevents duplicate broadcast of the same signed transaction but not N distinct sponsored transactions carrying distinct expiring nonces. Committed sponsor exposure is therefore N times \u003ccode\u003emax_total_fee\u003c/code\u003e, bounded by nothing in the library, and the default 900 second validity window lets co-signed transactions stay broadcastable and uncounted for that entire period.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.12.0.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Allocation of Resources Without Limits or Throttling in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet through concurrent sponsored payments, denying service to legitimate payers once it is empty.\n\n`MPP.Methods.Tempo.FeePayerPolicy` enforces its ceilings (`max_gas`, `max_fee_per_gas`, `max_priority_fee_per_gas`, the worst-case `gas_limit * max_fee_per_gas \u003c= max_total_fee` budget cap, and a validity window) against one transaction at a time, and nothing accounts for exposure across concurrent requests. `reserve_hash_atomic/2` is keyed on the transaction hash, so it prevents duplicate broadcast of the same signed transaction but not N distinct sponsored transactions carrying distinct expiring nonces. Committed sponsor exposure is therefore N times `max_total_fee`, bounded by nothing in the library, and the default 900 second validity window lets co-signed transactions stay broadcastable and uncounted for that entire period.\n\nThis issue affects mpp: from 0.2.0 before 0.12.0."
}
],
"value": "Allocation of Resources Without Limits or Throttling in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet through concurrent sponsored payments, denying service to legitimate payers once it is empty.\n\nMPP.Methods.Tempo.FeePayerPolicy enforces its ceilings (max_gas, max_fee_per_gas, max_priority_fee_per_gas, the worst-case gas_limit * max_fee_per_gas \u003c= max_total_fee budget cap, and a validity window) against one transaction at a time, and nothing accounts for exposure across concurrent requests. reserve_hash_atomic/2 is keyed on the transaction hash, so it prevents duplicate broadcast of the same signed transaction but not N distinct sponsored transactions carrying distinct expiring nonces. Committed sponsor exposure is therefore N times max_total_fee, bounded by nothing in the library, and the default 900 second validity window lets co-signed transactions stay broadcastable and uncounted for that entire period.\n\nThis issue affects mpp: from 0.2.0 before 0.12.0."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "HIGH",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-770",
"description": "CWE-770 Allocation of Resources Without Limits or Throttling",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T17:20:00.286Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-j4j7-7xpr-c7cr"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-73541.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-73541"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/ddc46868fba57ccebb567c04709812b466123076"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Tempo fee sponsorship in mpp bounds each transaction but not aggregate exposure, allowing concurrent sponsor-wallet drain",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eDisable Tempo fee sponsorship by setting \u003ccode\u003e\"fee_payer\" =\u0026gt; false\u003c/code\u003e (the default), so the client pays its own gas and the sponsor wallet is never committed. Where sponsorship must stay enabled, lowering \u003ccode\u003emax_total_fee\u003c/code\u003e and \u003ccode\u003emax_validity_window_seconds\u003c/code\u003e reduces the exposure each concurrent request can commit and how long it stays outstanding, without bounding the aggregate.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Disable Tempo fee sponsorship by setting `\"fee_payer\" =\u003e false` (the default), so the client pays its own gas and the sponsor wallet is never committed. Where sponsorship must stay enabled, lowering `max_total_fee` and `max_validity_window_seconds` reduces the exposure each concurrent request can commit and how long it stays outstanding, without bounding the aggregate."
}
],
"value": "Disable Tempo fee sponsorship by setting \"fee_payer\" =\u003e false (the default), so the client pays its own gas and the sponsor wallet is never committed. Where sponsorship must stay enabled, lowering max_total_fee and max_validity_window_seconds reduces the exposure each concurrent request can commit and how long it stays outstanding, without bounding the aggregate."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-73541",
"datePublished": "2026-08-19T17:20:00.286Z",
"dateReserved": "2026-08-18T10:00:02.140Z",
"dateUpdated": "2026-08-19T18:47:04.542Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-73136 (GCVE-0-2026-73136)
Vulnerability from nvd – Published: 2026-08-19 17:19 – Updated: 2026-08-19 18:54
VLAI
EPSS
VEX
Title
Static memo configuration in mpp Tempo disables per-challenge attribution binding, enabling third-party replay
Summary
Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated third party to obtain paid resources by replaying a transfer settled by an unrelated payer.
MPP.Methods.Tempo normally binds a settled TIP-20 TransferWithMemo to the specific challenge under verification through an attribution nonce carried in the memo. When a static "memo" is configured in method_config, check_matched_memo_binding/3 returns the match unconditionally and that binding is skipped, leaving only token, recipient, amount and the static memo value to match on. The static memo is echoed in every unauthenticated 402 response and Tempo transfers are public, so an attacker can take any matching transfer paid by a legitimate customer, request a fresh challenge for the same route, and present that transaction hash as a type="hash" credential. The hash path performs no sender or signature check tying the presenter to the wallet that broadcast the transfer.
This issue affects mpp: from 0.6.1 before 0.6.4.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-08-19 18:49 UTC
CWE
- CWE-294 - Authentication Bypass by Capture-replay
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-73136.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-73136 | related |
| https://github.com/ZenHive/mpp/commit/2207d7f456a… | patch |
Impacted products
Date Public
2026-07-06 00:00
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-73136",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-19T18:49:35.273666Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T18:54:00.153Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:validate_config!/1"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.4",
"status": "affected",
"version": "0.6.1",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:validate_config!/1"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "2207d7f456ae14c1d3fcacc6f635bf4f8cee1a34",
"status": "affected",
"version": "542a525563c2fcedd670b593437deca81c6797a4",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eOnly deployments that configure a static \u003ccode\u003e\"memo\"\u003c/code\u003e in the Tempo \u003ccode\u003emethod_config\u003c/code\u003e are affected. Deployments using the default per-challenge attribution memo are not: that path binds each settled transfer to the challenge under verification and is single-use by construction.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Only deployments that configure a static `\"memo\"` in the Tempo `method_config` are affected. Deployments using the default per-challenge attribution memo are not: that path binds each settled transfer to the challenge under verification and is single-use by construction."
}
],
"value": "Only deployments that configure a static \"memo\" in the Tempo method_config are affected. Deployments using the default per-challenge attribution memo are not: that path binds each settled transfer to the challenge under verification and is single-use by construction."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.4",
"versionStartIncluding": "0.6.1",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"datePublic": "2026-07-06T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAuthentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated third party to obtain paid resources by replaying a transfer settled by an unrelated payer.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Methods.Tempo\u003c/code\u003e normally binds a settled TIP-20 \u003ccode\u003eTransferWithMemo\u003c/code\u003e to the specific challenge under verification through an attribution nonce carried in the memo. When a static \u003ccode\u003e\"memo\"\u003c/code\u003e is configured in \u003ccode\u003emethod_config\u003c/code\u003e, \u003ccode\u003echeck_matched_memo_binding/3\u003c/code\u003e returns the match unconditionally and that binding is skipped, leaving only \u003ccode\u003etoken\u003c/code\u003e, \u003ccode\u003erecipient\u003c/code\u003e, \u003ccode\u003eamount\u003c/code\u003e and the static memo value to match on. The static memo is echoed in every unauthenticated 402 response and Tempo transfers are public, so an attacker can take any matching transfer paid by a legitimate customer, request a fresh challenge for the same route, and present that transaction hash as a \u003ccode\u003etype=\"hash\"\u003c/code\u003e credential. The hash path performs no sender or signature check tying the presenter to the wallet that broadcast the transfer.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.6.1 before 0.6.4.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated third party to obtain paid resources by replaying a transfer settled by an unrelated payer.\n\n`MPP.Methods.Tempo` normally binds a settled TIP-20 `TransferWithMemo` to the specific challenge under verification through an attribution nonce carried in the memo. When a static `\"memo\"` is configured in `method_config`, `check_matched_memo_binding/3` returns the match unconditionally and that binding is skipped, leaving only `token`, `recipient`, `amount` and the static memo value to match on. The static memo is echoed in every unauthenticated 402 response and Tempo transfers are public, so an attacker can take any matching transfer paid by a legitimate customer, request a fresh challenge for the same route, and present that transaction hash as a `type=\"hash\"` credential. The hash path performs no sender or signature check tying the presenter to the wallet that broadcast the transfer.\n\nThis issue affects mpp: from 0.6.1 before 0.6.4."
}
],
"value": "Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated third party to obtain paid resources by replaying a transfer settled by an unrelated payer.\n\nMPP.Methods.Tempo normally binds a settled TIP-20 TransferWithMemo to the specific challenge under verification through an attribution nonce carried in the memo. When a static \"memo\" is configured in method_config, check_matched_memo_binding/3 returns the match unconditionally and that binding is skipped, leaving only token, recipient, amount and the static memo value to match on. The static memo is echoed in every unauthenticated 402 response and Tempo transfers are public, so an attacker can take any matching transfer paid by a legitimate customer, request a fresh challenge for the same route, and present that transaction hash as a type=\"hash\" credential. The hash path performs no sender or signature check tying the presenter to the wallet that broadcast the transfer.\n\nThis issue affects mpp: from 0.6.1 before 0.6.4."
}
],
"impacts": [
{
"capecId": "CAPEC-60",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-60 Reusing Session IDs (aka Session Replay)"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.2,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-294",
"description": "CWE-294 Authentication Bypass by Capture-replay",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T17:19:52.413Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-34g7-vx6g-82mq"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-73136.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-73136"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/2207d7f456ae14c1d3fcacc6f635bf4f8cee1a34"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Static memo configuration in mpp Tempo disables per-challenge attribution binding, enabling third-party replay",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eRemove the static \u003ccode\u003e\"memo\"\u003c/code\u003e from the Tempo \u003ccode\u003emethod_config\u003c/code\u003e so verification falls back to the default per-challenge attribution binding, which ties each settled transfer to the challenge being verified. Where a static memo must be kept, configure a dedup store (for example \u003ccode\u003eMPP.Tempo.ConCacheStore\u003c/code\u003e) with a TTL at least as long as the challenge expiry, which reduces unlimited replay to a race on the transaction hash rather than closing it.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Remove the static `\"memo\"` from the Tempo `method_config` so verification falls back to the default per-challenge attribution binding, which ties each settled transfer to the challenge being verified. Where a static memo must be kept, configure a dedup store (for example `MPP.Tempo.ConCacheStore`) with a TTL at least as long as the challenge expiry, which reduces unlimited replay to a race on the transaction hash rather than closing it."
}
],
"value": "Remove the static \"memo\" from the Tempo method_config so verification falls back to the default per-challenge attribution binding, which ties each settled transfer to the challenge being verified. Where a static memo must be kept, configure a dedup store (for example MPP.Tempo.ConCacheStore) with a TTL at least as long as the challenge expiry, which reduces unlimited replay to a race on the transaction hash rather than closing it."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-73136",
"datePublished": "2026-08-19T17:19:52.413Z",
"dateReserved": "2026-08-18T10:00:02.159Z",
"dateUpdated": "2026-08-19T18:54:00.153Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-67581 (GCVE-0-2026-67581)
Vulnerability from nvd – Published: 2026-08-19 17:20 – Updated: 2026-08-19 18:44
VLAI
EPSS
VEX
Title
On-chain transfer proof is not single-use in mpp EVM payment method, enabling cross-challenge replay
Summary
Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated remote client to obtain paid resources by resubmitting one settled on-chain transfer.
MPP.Methods.EVM.verify/2 accepts a transaction-hash credential and matches a transfer purely on token, to and amount (ERC-20) or to and value (native). It binds the proof neither to the challenge being verified nor to any record of prior use, and the generic MPP.Plug dedup store keys on challenge.id, which is regenerated for every 402 response. On a static-price route, a single historical transfer matching the charge therefore satisfies an unbounded number of later charges, including transfers an attacker can read off a public block explorer.
This issue affects mpp: from 0.3.0 before 0.6.3.
Severity
SSVC
Exploitation: none
Automatable: yes
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-08-19 18:43 UTC
CWE
- CWE-294 - Authentication Bypass by Capture-replay
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-67581.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-67581 | related |
| https://github.com/ZenHive/mpp/commit/ecc038088b1… | patch |
Impacted products
Date Public
2026-07-06 00:00
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-67581",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "yes"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-19T18:43:43.808136Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T18:44:31.945Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.EVM\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/evm.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.EVM\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.3",
"status": "affected",
"version": "0.3.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.EVM\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/evm.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.EVM\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "ecc038088b1cda09ad8a84acc6cc112addb4a68f",
"status": "affected",
"version": "65b9e425ce27631c786a5b380b5e4c5ae607ec6d",
"versionType": "git"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.3",
"versionStartIncluding": "0.3.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"datePublic": "2026-07-06T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAuthentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated remote client to obtain paid resources by resubmitting one settled on-chain transfer.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Methods.EVM.verify/2\u003c/code\u003e accepts a transaction-hash credential and matches a transfer purely on \u003ccode\u003etoken\u003c/code\u003e, \u003ccode\u003eto\u003c/code\u003e and \u003ccode\u003eamount\u003c/code\u003e (ERC-20) or \u003ccode\u003eto\u003c/code\u003e and \u003ccode\u003evalue\u003c/code\u003e (native). It binds the proof neither to the challenge being verified nor to any record of prior use, and the generic \u003ccode\u003eMPP.Plug\u003c/code\u003e dedup store keys on \u003ccode\u003echallenge.id\u003c/code\u003e, which is regenerated for every 402 response. On a static-price route, a single historical transfer matching the charge therefore satisfies an unbounded number of later charges, including transfers an attacker can read off a public block explorer.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.3.0 before 0.6.3.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated remote client to obtain paid resources by resubmitting one settled on-chain transfer.\n\n`MPP.Methods.EVM.verify/2` accepts a transaction-hash credential and matches a transfer purely on `token`, `to` and `amount` (ERC-20) or `to` and `value` (native). It binds the proof neither to the challenge being verified nor to any record of prior use, and the generic `MPP.Plug` dedup store keys on `challenge.id`, which is regenerated for every 402 response. On a static-price route, a single historical transfer matching the charge therefore satisfies an unbounded number of later charges, including transfers an attacker can read off a public block explorer.\n\nThis issue affects mpp: from 0.3.0 before 0.6.3."
}
],
"value": "Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated remote client to obtain paid resources by resubmitting one settled on-chain transfer.\n\nMPP.Methods.EVM.verify/2 accepts a transaction-hash credential and matches a transfer purely on token, to and amount (ERC-20) or to and value (native). It binds the proof neither to the challenge being verified nor to any record of prior use, and the generic MPP.Plug dedup store keys on challenge.id, which is regenerated for every 402 response. On a static-price route, a single historical transfer matching the charge therefore satisfies an unbounded number of later charges, including transfers an attacker can read off a public block explorer.\n\nThis issue affects mpp: from 0.3.0 before 0.6.3."
}
],
"impacts": [
{
"capecId": "CAPEC-60",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-60 Reusing Session IDs (aka Session Replay)"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 8.7,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "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",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-294",
"description": "CWE-294 Authentication Bypass by Capture-replay",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T17:20:09.606Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vp5h-xh25-44wf"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-67581.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-67581"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/ecc038088b1cda09ad8a84acc6cc112addb4a68f"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "On-chain transfer proof is not single-use in mpp EVM payment method, enabling cross-challenge replay",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003ePrice each challenge uniquely (per-challenge or single-use amounts) so that a historical transfer cannot match a later charge, and keep challenge expiry short to narrow the window in which any given transfer stays useful. Deployments that can use the Tempo method for on-chain payments get per-challenge attribution binding instead.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Price each challenge uniquely (per-challenge or single-use amounts) so that a historical transfer cannot match a later charge, and keep challenge expiry short to narrow the window in which any given transfer stays useful. Deployments that can use the Tempo method for on-chain payments get per-challenge attribution binding instead."
}
],
"value": "Price each challenge uniquely (per-challenge or single-use amounts) so that a historical transfer cannot match a later charge, and keep challenge expiry short to narrow the window in which any given transfer stays useful. Deployments that can use the Tempo method for on-chain payments get per-challenge attribution binding instead."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-67581",
"datePublished": "2026-08-19T17:20:09.606Z",
"dateReserved": "2026-08-18T10:30:01.759Z",
"dateUpdated": "2026-08-19T18:44:31.945Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-59695 (GCVE-0-2026-59695)
Vulnerability from nvd – Published: 2026-07-17 10:11 – Updated: 2026-07-18 04:12
VLAI
EPSS
VEX
Title
Unbounded max_fee_per_gas in mpp Tempo fee-payer enables single-request wallet drain
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet in a single request by naming an arbitrarily high gas price.
When the mpp Elixir library is configured as fee payer (fee_payer: true), MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs the client-supplied base fields of the 0x76 AASigned envelope verbatim, including max_fee_per_gas and max_priority_fee_per_gas, without validating that they are within reasonable bounds. A malicious client embeds arbitrarily large values for these fields in the signed envelope. The server co-signs and broadcasts the transaction. The effective_gas_price billed against the fee-payer wallet is derived from the attacker-supplied ceilings, so the server pays those inflated per-gas rates out of its own wallet. A single crafted request can drain the wallet entirely, after which the server can no longer sponsor gas for legitimate payment requests.
This issue affects mpp: from 0.2.0 before 0.6.0.
Severity
SSVC
Exploitation: poc
Automatable: no
Technical Impact: total
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-07-17 12:53 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-59695.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-59695 | related |
| https://github.com/ZenHive/mpp/commit/5d6338e2334… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-59695",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "total"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-17T12:53:10.647332Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-07-17T12:53:17.645Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vv77-66rf-pm86"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Tempo.Transaction\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/tempo/transaction.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Tempo.Transaction\u0027:cosign_fee_payer/3"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.0",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Tempo.Transaction\u0027"
],
"packageName": "ZenHive/mpp",
"packageURL": "pkg:github/ZenHive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/tempo/transaction.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Tempo.Transaction\u0027:cosign_fee_payer/3"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "5d6338e2334084c5f2a78cfcca474830733ed7e8",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe vulnerable code path is only reachable when the \u003ctt\u003eMPP.Methods.Tempo\u003c/tt\u003e method is configured with \u003ctt\u003efee_payer: true\u003c/tt\u003e (server-side gas sponsorship). Default deployments with \u003ctt\u003efee_payer: false\u003c/tt\u003e are not affected, since the client pays for gas out of its own wallet.\u003c/p\u003e"
}
],
"value": "The vulnerable code path is only reachable when the MPP.Methods.Tempo method is configured with fee_payer: true (server-side gas sponsorship). Default deployments with fee_payer: false are not affected, since the client pays for gas out of its own wallet."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.0",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "AND"
}
],
"operator": "OR"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet in a single request by naming an arbitrarily high gas price.\u003c/p\u003e\u003cp\u003eWhen the \u003ctt\u003empp\u003c/tt\u003e Elixir library is configured as fee payer (\u003ctt\u003efee_payer: true\u003c/tt\u003e), \u003ctt\u003eMPP.Tempo.Transaction.cosign_fee_payer/3\u003c/tt\u003e re-signs the client-supplied base fields of the \u003ctt\u003e0x76\u003c/tt\u003e AASigned envelope verbatim, including \u003ctt\u003emax_fee_per_gas\u003c/tt\u003e and \u003ctt\u003emax_priority_fee_per_gas\u003c/tt\u003e, without validating that they are within reasonable bounds. A malicious client embeds arbitrarily large values for these fields in the signed envelope. The server co-signs and broadcasts the transaction. The \u003ctt\u003eeffective_gas_price\u003c/tt\u003e billed against the fee-payer wallet is derived from the attacker-supplied ceilings, so the server pays those inflated per-gas rates out of its own wallet. A single crafted request can drain the wallet entirely, after which the server can no longer sponsor gas for legitimate payment requests.\u003c/p\u003e\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.6.0.\u003c/p\u003e"
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet in a single request by naming an arbitrarily high gas price.\n\nWhen the mpp Elixir library is configured as fee payer (fee_payer: true), MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs the client-supplied base fields of the 0x76 AASigned envelope verbatim, including max_fee_per_gas and max_priority_fee_per_gas, without validating that they are within reasonable bounds. A malicious client embeds arbitrarily large values for these fields in the signed envelope. The server co-signs and broadcasts the transaction. The effective_gas_price billed against the fee-payer wallet is derived from the attacker-supplied ceilings, so the server pays those inflated per-gas rates out of its own wallet. A single crafted request can drain the wallet entirely, after which the server can no longer sponsor gas for legitimate payment requests.\n\nThis issue affects mpp: from 0.2.0 before 0.6.0."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "HIGH",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-07-18T04:12:26.916Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vv77-66rf-pm86"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-59695.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-59695"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/5d6338e2334084c5f2a78cfcca474830733ed7e8"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unbounded max_fee_per_gas in mpp Tempo fee-payer enables single-request wallet drain",
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-59695",
"datePublished": "2026-07-17T10:11:43.674Z",
"dateReserved": "2026-07-06T14:05:47.003Z",
"dateUpdated": "2026-07-18T04:12:26.916Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-59694 (GCVE-0-2026-59694)
Vulnerability from nvd – Published: 2026-07-17 10:11 – Updated: 2026-07-18 04:12
VLAI
EPSS
VEX
Title
Unbounded access list in mpp Tempo fee-payer inflates gas cost per payment
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer's gas cost per payment by a large multiplier, degrading the sponsor's operating margin.
When the mpp Elixir library is configured as fee payer (fee_payer: true), MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs the client-supplied base fields of the 0x76 AASigned envelope verbatim, including the EIP-2930 access list, without validating its length or contents. EIP-2930 access list entries incur intrinsic gas (~2,400 gas per address, plus 1,900 gas per storage key) charged before any opcode executes, regardless of whether the listed addresses are ever touched. A malicious client submits a valid transferWithMemo call alongside a large number of fabricated access-list entries. The server co-signs and broadcasts the transaction. The intended transfer executes normally, but the fee-payer wallet pays a large multiple of the expected gas cost with no corresponding on-chain work.
At the maintainer's default of 137 access-list entries (fitting within Bandit's 10,000-byte per-header-field limit) and 100 Gwei max_fee_per_gas, per-payment gas cost rises from ~51,287 to ~380,087 gas, a 7.4x multiplier. Sustained abuse destroys the sponsor's operating margin on low-cost payments and, over time, drains the fee-payer wallet.
This issue affects mpp: from 0.2.0 before 0.6.0.
Severity
SSVC
Exploitation: poc
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-07-17 12:22 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-59694.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-59694 | related |
| https://github.com/ZenHive/mpp/commit/5d6338e2334… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-59694",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-17T12:22:40.105353Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-07-17T12:22:45.224Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-qpxh-ff8m-c62v"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Tempo.Transaction\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/tempo/transaction.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Tempo.Transaction\u0027:cosign_fee_payer/3"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.0",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Tempo.Transaction\u0027"
],
"packageName": "ZenHive/mpp",
"packageURL": "pkg:github/ZenHive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/tempo/transaction.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Tempo.Transaction\u0027:cosign_fee_payer/3"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "5d6338e2334084c5f2a78cfcca474830733ed7e8",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe vulnerable code path is only reachable when the \u003ctt\u003eMPP.Methods.Tempo\u003c/tt\u003e method is configured with \u003ctt\u003efee_payer: true\u003c/tt\u003e (server-side gas sponsorship). Default deployments with \u003ctt\u003efee_payer: false\u003c/tt\u003e are not affected, since the client pays for gas out of its own wallet.\u003c/p\u003e"
}
],
"value": "The vulnerable code path is only reachable when the MPP.Methods.Tempo method is configured with fee_payer: true (server-side gas sponsorship). Default deployments with fee_payer: false are not affected, since the client pays for gas out of its own wallet."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.0",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "AND"
}
],
"operator": "OR"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per payment by a large multiplier, degrading the sponsor\u0027s operating margin.\u003c/p\u003e\u003cp\u003eWhen the \u003ctt\u003empp\u003c/tt\u003e Elixir library is configured as fee payer (\u003ctt\u003efee_payer: true\u003c/tt\u003e), \u003ctt\u003eMPP.Tempo.Transaction.cosign_fee_payer/3\u003c/tt\u003e re-signs the client-supplied base fields of the \u003ctt\u003e0x76\u003c/tt\u003e AASigned envelope verbatim, including the EIP-2930 access list, without validating its length or contents. EIP-2930 access list entries incur intrinsic gas (~2,400 gas per address, plus 1,900 gas per storage key) charged before any opcode executes, regardless of whether the listed addresses are ever touched. A malicious client submits a valid \u003ctt\u003etransferWithMemo\u003c/tt\u003e call alongside a large number of fabricated access-list entries. The server co-signs and broadcasts the transaction. The intended transfer executes normally, but the fee-payer wallet pays a large multiple of the expected gas cost with no corresponding on-chain work.\u003c/p\u003e\u003cp\u003eAt the maintainer\u0027s default of 137 access-list entries (fitting within Bandit\u0027s 10,000-byte per-header-field limit) and 100 Gwei \u003ctt\u003emax_fee_per_gas\u003c/tt\u003e, per-payment gas cost rises from ~51,287 to ~380,087 gas, a 7.4x multiplier. Sustained abuse destroys the sponsor\u0027s operating margin on low-cost payments and, over time, drains the fee-payer wallet.\u003c/p\u003e\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.6.0.\u003c/p\u003e"
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per payment by a large multiplier, degrading the sponsor\u0027s operating margin.\n\nWhen the mpp Elixir library is configured as fee payer (fee_payer: true), MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs the client-supplied base fields of the 0x76 AASigned envelope verbatim, including the EIP-2930 access list, without validating its length or contents. EIP-2930 access list entries incur intrinsic gas (~2,400 gas per address, plus 1,900 gas per storage key) charged before any opcode executes, regardless of whether the listed addresses are ever touched. A malicious client submits a valid transferWithMemo call alongside a large number of fabricated access-list entries. The server co-signs and broadcasts the transaction. The intended transfer executes normally, but the fee-payer wallet pays a large multiple of the expected gas cost with no corresponding on-chain work.\n\nAt the maintainer\u0027s default of 137 access-list entries (fitting within Bandit\u0027s 10,000-byte per-header-field limit) and 100 Gwei max_fee_per_gas, per-payment gas cost rises from ~51,287 to ~380,087 gas, a 7.4x multiplier. Sustained abuse destroys the sponsor\u0027s operating margin on low-cost payments and, over time, drains the fee-payer wallet.\n\nThis issue affects mpp: from 0.2.0 before 0.6.0."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "LOW",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-07-18T04:12:36.335Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-qpxh-ff8m-c62v"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-59694.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-59694"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/5d6338e2334084c5f2a78cfcca474830733ed7e8"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unbounded access list in mpp Tempo fee-payer inflates gas cost per payment",
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-59694",
"datePublished": "2026-07-17T10:11:49.192Z",
"dateReserved": "2026-07-06T14:05:47.003Z",
"dateUpdated": "2026-07-18T04:12:36.335Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-59252 (GCVE-0-2026-59252)
Vulnerability from nvd – Published: 2026-07-17 10:11 – Updated: 2026-07-18 04:12
VLAI
EPSS
VEX
Title
Missing gas_limit validation in mpp Tempo fee-payer enables wallet drain
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet, resulting in denial of service for legitimate clients.
When the mpp Elixir library is configured as fee payer (fee_payer: true), the MPP.Methods.Tempo payment method co-signs and broadcasts a client-supplied EVM transaction without first validating that the client-supplied gas_limit is sufficient to complete the intended call. A malicious client can submit a signed transferWithMemo transaction with gas_limit deliberately set just below the amount required for successful execution. The server co-signs the transaction and broadcasts it via rpc_broadcast_sync. The transaction runs out of gas during EVM execution and reverts, but the fee-payer wallet is still charged for the burned gas while the client pays nothing and receives no resource. Repeated requests from one or more malicious clients drain the fee-payer wallet at near-zero cost to the attacker, ultimately preventing the server from sponsoring gas for legitimate payment requests.
The wait_for_confirmation = false (optimistic) path is also affected: it invokes simulate_payment_call via eth_call, but that simulation omits the gas parameter and therefore does not catch out-of-gas conditions.
This issue affects mpp: from 0.2.0 before 0.6.0.
Severity
SSVC
Exploitation: poc
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-07-17 12:21 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-59252.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-59252 | related |
| https://github.com/ZenHive/mpp/commit/d84e3e528db… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-59252",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-17T12:21:12.801804Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-07-17T12:21:18.794Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vj8p-hp9x-gh47"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:broadcast_and_verify/7"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.0",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "ZenHive/mpp",
"packageURL": "pkg:github/ZenHive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:broadcast_and_verify/7"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "d84e3e528db39654540c2035ea0fbdf7b950d3d1",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe vulnerable code path is only reachable when the \u003ctt\u003eMPP.Methods.Tempo\u003c/tt\u003e method is configured with \u003ctt\u003efee_payer: true\u003c/tt\u003e (server-side gas sponsorship). Default deployments with \u003ctt\u003efee_payer: false\u003c/tt\u003e are not affected, since the client pays for gas out of its own wallet.\u003c/p\u003e"
}
],
"value": "The vulnerable code path is only reachable when the MPP.Methods.Tempo method is configured with fee_payer: true (server-side gas sponsorship). Default deployments with fee_payer: false are not affected, since the client pays for gas out of its own wallet."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.0",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "AND"
}
],
"operator": "OR"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet, resulting in denial of service for legitimate clients.\u003c/p\u003e\u003cp\u003eWhen the \u003ctt\u003empp\u003c/tt\u003e Elixir library is configured as fee payer (\u003ctt\u003efee_payer: true\u003c/tt\u003e), the \u003ctt\u003eMPP.Methods.Tempo\u003c/tt\u003e payment method co-signs and broadcasts a client-supplied EVM transaction without first validating that the client-supplied \u003ctt\u003egas_limit\u003c/tt\u003e is sufficient to complete the intended call. A malicious client can submit a signed \u003ctt\u003etransferWithMemo\u003c/tt\u003e transaction with \u003ctt\u003egas_limit\u003c/tt\u003e deliberately set just below the amount required for successful execution. The server co-signs the transaction and broadcasts it via \u003ctt\u003erpc_broadcast_sync\u003c/tt\u003e. The transaction runs out of gas during EVM execution and reverts, but the fee-payer wallet is still charged for the burned gas while the client pays nothing and receives no resource. Repeated requests from one or more malicious clients drain the fee-payer wallet at near-zero cost to the attacker, ultimately preventing the server from sponsoring gas for legitimate payment requests.\u003c/p\u003e\u003cp\u003eThe \u003ctt\u003ewait_for_confirmation = false\u003c/tt\u003e (optimistic) path is also affected: it invokes \u003ctt\u003esimulate_payment_call\u003c/tt\u003e via \u003ctt\u003eeth_call\u003c/tt\u003e, but that simulation omits the \u003ctt\u003egas\u003c/tt\u003e parameter and therefore does not catch out-of-gas conditions.\u003c/p\u003e\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.6.0.\u003c/p\u003e"
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet, resulting in denial of service for legitimate clients.\n\nWhen the mpp Elixir library is configured as fee payer (fee_payer: true), the MPP.Methods.Tempo payment method co-signs and broadcasts a client-supplied EVM transaction without first validating that the client-supplied gas_limit is sufficient to complete the intended call. A malicious client can submit a signed transferWithMemo transaction with gas_limit deliberately set just below the amount required for successful execution. The server co-signs the transaction and broadcasts it via rpc_broadcast_sync. The transaction runs out of gas during EVM execution and reverts, but the fee-payer wallet is still charged for the burned gas while the client pays nothing and receives no resource. Repeated requests from one or more malicious clients drain the fee-payer wallet at near-zero cost to the attacker, ultimately preventing the server from sponsoring gas for legitimate payment requests.\n\nThe wait_for_confirmation = false (optimistic) path is also affected: it invokes simulate_payment_call via eth_call, but that simulation omits the gas parameter and therefore does not catch out-of-gas conditions.\n\nThis issue affects mpp: from 0.2.0 before 0.6.0."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.2,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "HIGH",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "NONE"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-07-18T04:12:42.459Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vj8p-hp9x-gh47"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-59252.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-59252"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/d84e3e528db39654540c2035ea0fbdf7b950d3d1"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Missing gas_limit validation in mpp Tempo fee-payer enables wallet drain",
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-59252",
"datePublished": "2026-07-17T10:11:54.436Z",
"dateReserved": "2026-07-04T04:24:03.653Z",
"dateUpdated": "2026-07-18T04:12:42.459Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-88255 (GCVE-0-2026-88255)
Vulnerability from cvelistv5 – Published: 2026-09-16 08:24 – Updated: 2026-09-16 14:49
VLAI
EPSS
VEX
Title
mpp Tempo keys its pre-broadcast dedup reserve on the caller-supplied transaction encoding, so a re-encoded signed transaction reserves a second slot
Summary
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.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-16 14:49 UTC
CWE
- CWE-1289 - Improper Validation of Unsafe Equivalence in Input
Assigner
References
5 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | relatedvendor-advisory |
| https://cna.erlef.org/cves/CVE-2026-88255.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-88255 | related |
| https://github.com/ZenHive/mpp/commit/f8904666061… | related |
| https://github.com/ZenHive/mpp/commit/e12bd4a1cea… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-88255",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-16T14:49:50.266563Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T14:49:57.782Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.16.2",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "e12bd4a1cea2e97c2a01fc059c48e5594a7b4a43",
"status": "affected",
"version": "f8904666061fbab695874856d8fcd02c471dfe1b",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eReachable when \u003ccode\u003eMPP.Methods.Tempo\u003c/code\u003e broadcasts a \u003ccode\u003etype=\"transaction\"\u003c/code\u003e credential with a dedup store in place. From mpp 0.7.0 the dedup store is on by default (the app-started \u003ccode\u003eMPP.Tempo.ConCacheStore\u003c/code\u003e; opt out with \u003ccode\u003estore: false\u003c/code\u003e), so every default Tempo deployment from 0.7.0 before 0.16.2 is affected. Before 0.7.0 the default store was \u003ccode\u003enil\u003c/code\u003e, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue; those versions are affected only where a \u003ccode\u003e\"store\"\u003c/code\u003e was configured explicitly in \u003ccode\u003emethod_config\u003c/code\u003e.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Reachable when `MPP.Methods.Tempo` broadcasts a `type=\"transaction\"` credential with a dedup store in place. From mpp 0.7.0 the dedup store is on by default (the app-started `MPP.Tempo.ConCacheStore`; opt out with `store: false`), so every default Tempo deployment from 0.7.0 before 0.16.2 is affected. Before 0.7.0 the default store was `nil`, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue; those versions are affected only where a `\"store\"` was configured explicitly in `method_config`."
}
],
"value": "Reachable when MPP.Methods.Tempo broadcasts a type=\"transaction\" credential with a dedup store in place. From mpp 0.7.0 the dedup store is on by default (the app-started MPP.Tempo.ConCacheStore; opt out with store: false), so every default Tempo deployment from 0.7.0 before 0.16.2 is affected. Before 0.7.0 the default store was nil, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue; those versions are affected only where a \"store\" was configured explicitly in method_config."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.16.2",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "coordinator",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"dateAssigned": "2026-09-15T15:20:56.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper 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.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Methods.Tempo\u003c/code\u003e reserves the pre-broadcast dedup slot on the caller-supplied hex in \u003ccode\u003ereserve_hash_atomic/2\u003c/code\u003e, keyed through \u003ccode\u003estore_key/1\u003c/code\u003e on \u003ccode\u003etx.raw\u003c/code\u003e rather than on a canonical form of the transaction. The deserializer stores the caller\u0027s hex verbatim and accepts both recovery-id encodings, so one signed transaction submitted once with \u003ccode\u003ev=27\u003c/code\u003e and once with \u003ccode\u003ev=0\u003c/code\u003e 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 \u003ccode\u003etempo\u003c/code\u003e in \u003ccode\u003elib/mpp/replay.ex\u003c/code\u003e, leaving this reserve as the only gate, and the post-broadcast mark writes the canonical hash key that the raw-keyed reserve never reads.\u003c/p\u003e\n\u003cp\u003eWhat 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 \u003ccode\u003ePayment-Receipt\u003c/code\u003e for a single on-chain payment.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.16.2.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "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.\n\n`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\u0027s 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.\n\nWhat 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.\n\nThis issue affects mpp: from 0.2.0 before 0.16.2."
}
],
"value": "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.\n\nMPP.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\u0027s 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.\n\nWhat 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.\n\nThis issue affects mpp: from 0.2.0 before 0.16.2."
}
],
"impacts": [
{
"capecId": "CAPEC-267",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eA client re-encodes the recovery id of a transaction it has already submitted and presents it again. The duplicate passes the only duplicate-submission gate the Tempo method has, and against a node that answers with the canonical hash for an already-known transaction the client is issued a second \u003ccode\u003ePayment-Receipt\u003c/code\u003e for one on-chain payment.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "A client re-encodes the recovery id of a transaction it has already submitted and presents it again. The duplicate passes the only duplicate-submission gate the Tempo method has, and against a node that answers with the canonical hash for an already-known transaction the client is issued a second `Payment-Receipt` for one on-chain payment."
}
],
"value": "A client re-encodes the recovery id of a transaction it has already submitted and presents it again. The duplicate passes the only duplicate-submission gate the Tempo method has, and against a node that answers with the canonical hash for an already-known transaction the client is issued a second Payment-Receipt for one on-chain payment."
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 6.3,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "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",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "LOW",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1289",
"description": "CWE-1289 Improper Validation of Unsafe Equivalence in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T08:24:40.446Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"name": "GitHub Advisory",
"tags": [
"related",
"vendor-advisory"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-8x7x-5j8g-8hcx"
},
{
"name": "EEF CNA record for CVE-2026-88255",
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-88255.html"
},
{
"name": "OSV record EEF-CVE-2026-88255",
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-88255"
},
{
"name": "Introducing commit f890466 in ZenHive/mpp",
"tags": [
"related"
],
"url": "https://github.com/ZenHive/mpp/commit/f8904666061fbab695874856d8fcd02c471dfe1b"
},
{
"name": "Fix commit e12bd4a in ZenHive/mpp",
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/e12bd4a1cea2e97c2a01fc059c48e5594a7b4a43"
}
],
"source": {
"discovery": "INTERNAL"
},
"title": "mpp Tempo keys its pre-broadcast dedup reserve on the caller-supplied transaction encoding, so a re-encoded signed transaction reserves a second slot"
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-88255",
"datePublished": "2026-09-16T08:24:40.446Z",
"dateReserved": "2026-09-11T18:30:01.336Z",
"dateUpdated": "2026-09-16T14:49:57.782Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-89186 (GCVE-0-2026-89186)
Vulnerability from cvelistv5 – Published: 2026-09-16 08:24 – Updated: 2026-09-16 14:50
VLAI
EPSS
VEX
Title
mpp writes Payment-Receipt and Cache-Control before the wrapped application runs, letting a consumer's own Cache-Control expose paid responses to shared caches
Summary
Use of Cache Containing Sensitive Information in ZenHive mpp allows a shared HTTP cache to store a paid response and serve it to clients that never paid.
MPP.Plug.verify_credential in lib/mpp/plug.ex sets payment-receipt and cache-control: private on the connection before the wrapped application runs, and registers no register_before_send/2 callback. Plug.Conn.put_resp_header/3 replaces an existing header, so a mounting application that sets its own cache-control on the paid resource (for example public, max-age=3600) silently overrides the private the library relies on, and a CDN or reverse proxy can then store the paid 200 together with its Payment-Receipt and serve both to unpaid clients. The library-level guarantee is therefore defeatable by the application it protects. For the same reason a downstream non-2xx response still carried Payment-Receipt, issuing a receipt for a response that delivered no resource.
This issue affects mpp: from 0.1.0 before 0.16.2.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-16 14:50 UTC
CWE
- CWE-524 - Use of Cache Containing Sensitive Information
Assigner
References
5 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | relatedvendor-advisory |
| https://cna.erlef.org/cves/CVE-2026-89186.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-89186 | related |
| https://github.com/ZenHive/mpp/commit/2d4d1d94aae… | related |
| https://github.com/ZenHive/mpp/commit/2fd91a5ecbd… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-89186",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-16T14:50:34.541725Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T14:50:44.399Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Plug\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/plug.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Plug\u0027:call/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.16.2",
"status": "affected",
"version": "0.1.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Plug\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/plug.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Plug\u0027:call/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "2fd91a5ecbd0b0ad2a4ac202b79659e8126dbc0b",
"status": "affected",
"version": "2d4d1d94aae7790ae0623063961adbeef171fa71",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eReachable only where the application mounted behind \u003ccode\u003eMPP.Plug\u003c/code\u003e sets its own \u003ccode\u003eCache-Control\u003c/code\u003e on the paid resource, overriding the \u003ccode\u003eprivate\u003c/code\u003e the library wrote, and a shared HTTP cache (CDN or reverse proxy) sits in front of that route. An application that sets no \u003ccode\u003eCache-Control\u003c/code\u003e of its own keeps the library\u0027s \u003ccode\u003eprivate\u003c/code\u003e and is not affected.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Reachable only where the application mounted behind `MPP.Plug` sets its own `Cache-Control` on the paid resource, overriding the `private` the library wrote, and a shared HTTP cache (CDN or reverse proxy) sits in front of that route. An application that sets no `Cache-Control` of its own keeps the library\u0027s `private` and is not affected."
}
],
"value": "Reachable only where the application mounted behind MPP.Plug sets its own Cache-Control on the paid resource, overriding the private the library wrote, and a shared HTTP cache (CDN or reverse proxy) sits in front of that route. An application that sets no Cache-Control of its own keeps the library\u0027s private and is not affected."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.16.2",
"versionStartIncluding": "0.1.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "coordinator",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"dateAssigned": "2026-09-15T15:22:44.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eUse of Cache Containing Sensitive Information in ZenHive mpp allows a shared HTTP cache to store a paid response and serve it to clients that never paid.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Plug.verify_credential\u003c/code\u003e in \u003ccode\u003elib/mpp/plug.ex\u003c/code\u003e sets \u003ccode\u003epayment-receipt\u003c/code\u003e and \u003ccode\u003ecache-control: private\u003c/code\u003e on the connection before the wrapped application runs, and registers no \u003ccode\u003eregister_before_send/2\u003c/code\u003e callback. \u003ccode\u003ePlug.Conn.put_resp_header/3\u003c/code\u003e replaces an existing header, so a mounting application that sets its own \u003ccode\u003ecache-control\u003c/code\u003e on the paid resource (for example \u003ccode\u003epublic, max-age=3600\u003c/code\u003e) silently overrides the \u003ccode\u003eprivate\u003c/code\u003e the library relies on, and a CDN or reverse proxy can then store the paid 200 together with its \u003ccode\u003ePayment-Receipt\u003c/code\u003e and serve both to unpaid clients. The library-level guarantee is therefore defeatable by the application it protects. For the same reason a downstream non-2xx response still carried \u003ccode\u003ePayment-Receipt\u003c/code\u003e, issuing a receipt for a response that delivered no resource.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.1.0 before 0.16.2.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Use of Cache Containing Sensitive Information in ZenHive mpp allows a shared HTTP cache to store a paid response and serve it to clients that never paid.\n\n`MPP.Plug.verify_credential` in `lib/mpp/plug.ex` sets `payment-receipt` and `cache-control: private` on the connection before the wrapped application runs, and registers no `register_before_send/2` callback. `Plug.Conn.put_resp_header/3` replaces an existing header, so a mounting application that sets its own `cache-control` on the paid resource (for example `public, max-age=3600`) silently overrides the `private` the library relies on, and a CDN or reverse proxy can then store the paid 200 together with its `Payment-Receipt` and serve both to unpaid clients. The library-level guarantee is therefore defeatable by the application it protects. For the same reason a downstream non-2xx response still carried `Payment-Receipt`, issuing a receipt for a response that delivered no resource.\n\nThis issue affects mpp: from 0.1.0 before 0.16.2."
}
],
"value": "Use of Cache Containing Sensitive Information in ZenHive mpp allows a shared HTTP cache to store a paid response and serve it to clients that never paid.\n\nMPP.Plug.verify_credential in lib/mpp/plug.ex sets payment-receipt and cache-control: private on the connection before the wrapped application runs, and registers no register_before_send/2 callback. Plug.Conn.put_resp_header/3 replaces an existing header, so a mounting application that sets its own cache-control on the paid resource (for example public, max-age=3600) silently overrides the private the library relies on, and a CDN or reverse proxy can then store the paid 200 together with its Payment-Receipt and serve both to unpaid clients. The library-level guarantee is therefore defeatable by the application it protects. For the same reason a downstream non-2xx response still carried Payment-Receipt, issuing a receipt for a response that delivered no resource.\n\nThis issue affects mpp: from 0.1.0 before 0.16.2."
}
],
"impacts": [
{
"capecId": "CAPEC-204",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAn unpaid client requesting the same URL through the shared cache receives the cached paid response, including the \u003ccode\u003ePayment-Receipt\u003c/code\u003e header issued to the paying client. Operators lose the revenue for every cache hit, and the receipt identifying a paid transaction is disclosed to third parties.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "An unpaid client requesting the same URL through the shared cache receives the cached paid response, including the `Payment-Receipt` header issued to the paying client. Operators lose the revenue for every cache hit, and the receipt identifying a paid transaction is disclosed to third parties."
}
],
"value": "An unpaid client requesting the same URL through the shared cache receives the cached paid response, including the Payment-Receipt header issued to the paying client. Operators lose the revenue for every cache hit, and the receipt identifying a paid transaction is disclosed to third parties."
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 6.3,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "LOW",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:L/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "LOW",
"vulnIntegrityImpact": "NONE",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-524",
"description": "CWE-524 Use of Cache Containing Sensitive Information",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-16T08:24:15.058Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"name": "GitHub Advisory",
"tags": [
"related",
"vendor-advisory"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-82qh-vrvm-gqvc"
},
{
"name": "EEF CNA record for CVE-2026-89186",
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-89186.html"
},
{
"name": "OSV record EEF-CVE-2026-89186",
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-89186"
},
{
"name": "Introducing commit 2d4d1d9 in ZenHive/mpp",
"tags": [
"related"
],
"url": "https://github.com/ZenHive/mpp/commit/2d4d1d94aae7790ae0623063961adbeef171fa71"
},
{
"name": "Fix commit 2fd91a5 in ZenHive/mpp",
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/2fd91a5ecbd0b0ad2a4ac202b79659e8126dbc0b"
}
],
"source": {
"discovery": "INTERNAL"
},
"title": "mpp writes Payment-Receipt and Cache-Control before the wrapped application runs, letting a consumer\u0027s own Cache-Control expose paid responses to shared caches",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eIn the application mounted behind \u003ccode\u003eMPP.Plug\u003c/code\u003e, stop setting \u003ccode\u003eCache-Control\u003c/code\u003e on paid routes so the library\u0027s \u003ccode\u003eprivate\u003c/code\u003e survives to the response, or set a directive that is itself safe for a shared cache (\u003ccode\u003eprivate\u003c/code\u003e, or \u003ccode\u003eno-store\u003c/code\u003e). Where the application must set its own caching policy, configure the CDN or reverse proxy not to cache responses carrying a \u003ccode\u003ePayment-Receipt\u003c/code\u003e header.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "In the application mounted behind `MPP.Plug`, stop setting `Cache-Control` on paid routes so the library\u0027s `private` survives to the response, or set a directive that is itself safe for a shared cache (`private`, or `no-store`). Where the application must set its own caching policy, configure the CDN or reverse proxy not to cache responses carrying a `Payment-Receipt` header."
}
],
"value": "In the application mounted behind MPP.Plug, stop setting Cache-Control on paid routes so the library\u0027s private survives to the response, or set a directive that is itself safe for a shared cache (private, or no-store). Where the application must set its own caching policy, configure the CDN or reverse proxy not to cache responses carrying a Payment-Receipt header."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-89186",
"datePublished": "2026-09-16T08:24:15.058Z",
"dateReserved": "2026-09-11T19:00:02.549Z",
"dateUpdated": "2026-09-16T14:50:44.399Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-82750 (GCVE-0-2026-82750)
Vulnerability from cvelistv5 – Published: 2026-09-06 16:08 – Updated: 2026-09-08 18:25
VLAI
EPSS
VEX
Title
Unbounded EIP-7702 authorization list in mpp Tempo fee-payer sponsorship inflates gas cost and sponsors account delegation
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer's gas cost per sponsored payment by a large multiplier and to have the sponsor pay for EIP-7702 account delegations of the client's choosing.
When the server sponsors Tempo payments, MPP.Methods.Tempo.FeePayerPolicy.measure/3 in lib/mpp/methods/tempo/fee_payer_policy.ex bounds the gas fields, the fee budget, the validity window and the access list of the client-signed 0x76 envelope, but never reads its aa_authorization_list field. Every signed delegation in that list is charged as intrinsic gas before the payment call runs, so a client attaching delegations from throwaway authority keys makes the sponsor pay for them within the default gas_limit ceiling. At the reporter's default of seven entries the sponsored cost rises from about 46,575 gas to about 1,884,087 gas. Because each entry is applied as a persistent set-code delegation, a client can also upgrade its own accounts to delegated code at the sponsor's expense.
This issue affects mpp: from 0.2.0 before 0.16.1.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-08 18:25 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-82750.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-82750 | related |
| https://github.com/ZenHive/mpp/commit/0482572b47e… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-82750",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-08T18:25:27.116993Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-08T18:25:42.388Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:measure/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.16.1",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:measure/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0482572b47e1ffe1537ab80ab613d47b92833c2d",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eOnly deployments that enable Tempo server-side fee sponsorship are affected, through \u003ccode\u003e\"fee_payer\" =\u0026gt; true\u003c/code\u003e in \u003ccode\u003emethod_config\u003c/code\u003e with either local co-signing (\u003ccode\u003efee_payer_private_key\u003c/code\u003e) or hosted sponsorship (\u003ccode\u003efee_payer_url\u003c/code\u003e). Sponsorship is disabled by default.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through `\"fee_payer\" =\u003e true` in `method_config` with either local co-signing (`fee_payer_private_key`) or hosted sponsorship (`fee_payer_url`). Sponsorship is disabled by default."
}
],
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through \"fee_payer\" =\u003e true in method_config with either local co-signing (fee_payer_private_key) or hosted sponsorship (fee_payer_url). Sponsorship is disabled by default."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.16.1",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "reporter",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "coordinator",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for EIP-7702 account delegations of the client\u0027s choosing.\u003c/p\u003e\n\u003cp\u003eWhen the server sponsors Tempo payments, \u003ccode\u003eMPP.Methods.Tempo.FeePayerPolicy.measure/3\u003c/code\u003e in \u003ccode\u003elib/mpp/methods/tempo/fee_payer_policy.ex\u003c/code\u003e bounds the gas fields, the fee budget, the validity window and the access list of the client-signed \u003ccode\u003e0x76\u003c/code\u003e envelope, but never reads its \u003ccode\u003eaa_authorization_list\u003c/code\u003e field. Every signed delegation in that list is charged as intrinsic gas before the payment call runs, so a client attaching delegations from throwaway authority keys makes the sponsor pay for them within the default \u003ccode\u003egas_limit\u003c/code\u003e ceiling. At the reporter\u0027s default of seven entries the sponsored cost rises from about 46,575 gas to about 1,884,087 gas. Because each entry is applied as a persistent set-code delegation, a client can also upgrade its own accounts to delegated code at the sponsor\u0027s expense.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.16.1.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for EIP-7702 account delegations of the client\u0027s choosing.\n\nWhen the server sponsors Tempo payments, `MPP.Methods.Tempo.FeePayerPolicy.measure/3` in `lib/mpp/methods/tempo/fee_payer_policy.ex` bounds the gas fields, the fee budget, the validity window and the access list of the client-signed `0x76` envelope, but never reads its `aa_authorization_list` field. Every signed delegation in that list is charged as intrinsic gas before the payment call runs, so a client attaching delegations from throwaway authority keys makes the sponsor pay for them within the default `gas_limit` ceiling. At the reporter\u0027s default of seven entries the sponsored cost rises from about 46,575 gas to about 1,884,087 gas. Because each entry is applied as a persistent set-code delegation, a client can also upgrade its own accounts to delegated code at the sponsor\u0027s expense.\n\nThis issue affects mpp: from 0.2.0 before 0.16.1."
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for EIP-7702 account delegations of the client\u0027s choosing.\n\nWhen the server sponsors Tempo payments, MPP.Methods.Tempo.FeePayerPolicy.measure/3 in lib/mpp/methods/tempo/fee_payer_policy.ex bounds the gas fields, the fee budget, the validity window and the access list of the client-signed 0x76 envelope, but never reads its aa_authorization_list field. Every signed delegation in that list is charged as intrinsic gas before the payment call runs, so a client attaching delegations from throwaway authority keys makes the sponsor pay for them within the default gas_limit ceiling. At the reporter\u0027s default of seven entries the sponsored cost rises from about 46,575 gas to about 1,884,087 gas. Because each entry is applied as a persistent set-code delegation, a client can also upgrade its own accounts to delegated code at the sponsor\u0027s expense.\n\nThis issue affects mpp: from 0.2.0 before 0.16.1."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "LOW",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-06T16:08:41.089Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-5qrp-r24c-w6jr"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-82750.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-82750"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/0482572b47e1ffe1537ab80ab613d47b92833c2d"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unbounded EIP-7702 authorization list in mpp Tempo fee-payer sponsorship inflates gas cost and sponsors account delegation",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eDisable Tempo fee sponsorship by leaving \u003ccode\u003e\"fee_payer\"\u003c/code\u003e at its default of \u003ccode\u003efalse\u003c/code\u003e and setting no \u003ccode\u003efee_payer_url\u003c/code\u003e, so the client pays its own gas. Where sponsorship must stay enabled, lower the \u003ccode\u003emax_gas\u003c/code\u003e override in \u003ccode\u003efee_payer_policy\u003c/code\u003e to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope padded with delegations either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Disable Tempo fee sponsorship by leaving `\"fee_payer\"` at its default of `false` and setting no `fee_payer_url`, so the client pays its own gas. Where sponsorship must stay enabled, lower the `max_gas` override in `fee_payer_policy` to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope padded with delegations either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it."
}
],
"value": "Disable Tempo fee sponsorship by leaving \"fee_payer\" at its default of false and setting no fee_payer_url, so the client pays its own gas. Where sponsorship must stay enabled, lower the max_gas override in fee_payer_policy to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope padded with delegations either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-82750",
"datePublished": "2026-09-06T16:08:41.089Z",
"dateReserved": "2026-08-31T01:00:09.774Z",
"dateUpdated": "2026-09-08T18:25:42.388Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-82751 (GCVE-0-2026-82751)
Vulnerability from cvelistv5 – Published: 2026-09-06 16:07 – Updated: 2026-09-08 18:24
VLAI
EPSS
VEX
Title
Unbounded key authorization in mpp Tempo fee-payer sponsorship inflates gas cost and sponsors access-key provisioning
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer's gas cost per sponsored payment by a large multiplier and to have the sponsor pay for provisioning an access key on the client's own account.
When the server sponsors Tempo payments, MPP.Methods.Tempo.FeePayerPolicy.measure/3 in lib/mpp/methods/tempo/fee_payer_policy.ex bounds the gas fields, the fee budget, the validity window and the access list of the client-signed 0x76 envelope, but does not check whether the envelope carries the optional key_authorization field. A client can attach a fully signed key authorization, provisioning a new access key with token spending limits on its own account, alongside the normal payment call. The key and each limit entry are persistent storage writes billed as intrinsic gas to the sponsor, bounded only by the gas_limit ceiling. At the reporter's default of one key with three token limits the sponsored cost rises from about 46,587 gas to about 1,808,700 gas, and the client keeps a valid access key it paid nothing for.
This issue affects mpp: from 0.2.0 before 0.16.1.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-09-08 18:24 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-82751.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-82751 | related |
| https://github.com/ZenHive/mpp/commit/0482572b47e… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-82751",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-09-08T18:24:07.502205Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-09-08T18:24:19.598Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:measure/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.16.1",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:measure/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0482572b47e1ffe1537ab80ab613d47b92833c2d",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eOnly deployments that enable Tempo server-side fee sponsorship are affected, through \u003ccode\u003e\"fee_payer\" =\u0026gt; true\u003c/code\u003e in \u003ccode\u003emethod_config\u003c/code\u003e with either local co-signing (\u003ccode\u003efee_payer_private_key\u003c/code\u003e) or hosted sponsorship (\u003ccode\u003efee_payer_url\u003c/code\u003e). Sponsorship is disabled by default.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through `\"fee_payer\" =\u003e true` in `method_config` with either local co-signing (`fee_payer_private_key`) or hosted sponsorship (`fee_payer_url`). Sponsorship is disabled by default."
}
],
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through \"fee_payer\" =\u003e true in method_config with either local co-signing (fee_payer_private_key) or hosted sponsorship (fee_payer_url). Sponsorship is disabled by default."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.16.1",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "reporter",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "coordinator",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for provisioning an access key on the client\u0027s own account.\u003c/p\u003e\n\u003cp\u003eWhen the server sponsors Tempo payments, \u003ccode\u003eMPP.Methods.Tempo.FeePayerPolicy.measure/3\u003c/code\u003e in \u003ccode\u003elib/mpp/methods/tempo/fee_payer_policy.ex\u003c/code\u003e bounds the gas fields, the fee budget, the validity window and the access list of the client-signed \u003ccode\u003e0x76\u003c/code\u003e envelope, but does not check whether the envelope carries the optional \u003ccode\u003ekey_authorization\u003c/code\u003e field. A client can attach a fully signed key authorization, provisioning a new access key with token spending limits on its own account, alongside the normal payment call. The key and each limit entry are persistent storage writes billed as intrinsic gas to the sponsor, bounded only by the \u003ccode\u003egas_limit\u003c/code\u003e ceiling. At the reporter\u0027s default of one key with three token limits the sponsored cost rises from about 46,587 gas to about 1,808,700 gas, and the client keeps a valid access key it paid nothing for.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.16.1.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for provisioning an access key on the client\u0027s own account.\n\nWhen the server sponsors Tempo payments, `MPP.Methods.Tempo.FeePayerPolicy.measure/3` in `lib/mpp/methods/tempo/fee_payer_policy.ex` bounds the gas fields, the fee budget, the validity window and the access list of the client-signed `0x76` envelope, but does not check whether the envelope carries the optional `key_authorization` field. A client can attach a fully signed key authorization, provisioning a new access key with token spending limits on its own account, alongside the normal payment call. The key and each limit entry are persistent storage writes billed as intrinsic gas to the sponsor, bounded only by the `gas_limit` ceiling. At the reporter\u0027s default of one key with three token limits the sponsored cost rises from about 46,587 gas to about 1,808,700 gas, and the client keeps a valid access key it paid nothing for.\n\nThis issue affects mpp: from 0.2.0 before 0.16.1."
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per sponsored payment by a large multiplier and to have the sponsor pay for provisioning an access key on the client\u0027s own account.\n\nWhen the server sponsors Tempo payments, MPP.Methods.Tempo.FeePayerPolicy.measure/3 in lib/mpp/methods/tempo/fee_payer_policy.ex bounds the gas fields, the fee budget, the validity window and the access list of the client-signed 0x76 envelope, but does not check whether the envelope carries the optional key_authorization field. A client can attach a fully signed key authorization, provisioning a new access key with token spending limits on its own account, alongside the normal payment call. The key and each limit entry are persistent storage writes billed as intrinsic gas to the sponsor, bounded only by the gas_limit ceiling. At the reporter\u0027s default of one key with three token limits the sponsored cost rises from about 46,587 gas to about 1,808,700 gas, and the client keeps a valid access key it paid nothing for.\n\nThis issue affects mpp: from 0.2.0 before 0.16.1."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "LOW",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-09-06T16:07:26.407Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-rpwj-vrf7-4x36"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-82751.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-82751"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/0482572b47e1ffe1537ab80ab613d47b92833c2d"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unbounded key authorization in mpp Tempo fee-payer sponsorship inflates gas cost and sponsors access-key provisioning",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eDisable Tempo fee sponsorship by leaving \u003ccode\u003e\"fee_payer\"\u003c/code\u003e at its default of \u003ccode\u003efalse\u003c/code\u003e and setting no \u003ccode\u003efee_payer_url\u003c/code\u003e, so the client pays its own gas. Where sponsorship must stay enabled, lower the \u003ccode\u003emax_gas\u003c/code\u003e override in \u003ccode\u003efee_payer_policy\u003c/code\u003e to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope carrying a key authorization either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Disable Tempo fee sponsorship by leaving `\"fee_payer\"` at its default of `false` and setting no `fee_payer_url`, so the client pays its own gas. Where sponsorship must stay enabled, lower the `max_gas` override in `fee_payer_policy` to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope carrying a key authorization either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it."
}
],
"value": "Disable Tempo fee sponsorship by leaving \"fee_payer\" at its default of false and setting no fee_payer_url, so the client pays its own gas. Where sponsorship must stay enabled, lower the max_gas override in fee_payer_policy to just above what a legitimate sponsored payment needs (a TIP-20 transfer is roughly 50,000 gas), so an envelope carrying a key authorization either fails the policy or runs out of gas at a bounded cost. This bounds the inflation without closing it."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-82751",
"datePublished": "2026-09-06T16:07:26.407Z",
"dateReserved": "2026-08-31T01:00:09.775Z",
"dateUpdated": "2026-09-08T18:24:19.598Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-67581 (GCVE-0-2026-67581)
Vulnerability from cvelistv5 – Published: 2026-08-19 17:20 – Updated: 2026-08-19 18:44
VLAI
EPSS
VEX
Title
On-chain transfer proof is not single-use in mpp EVM payment method, enabling cross-challenge replay
Summary
Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated remote client to obtain paid resources by resubmitting one settled on-chain transfer.
MPP.Methods.EVM.verify/2 accepts a transaction-hash credential and matches a transfer purely on token, to and amount (ERC-20) or to and value (native). It binds the proof neither to the challenge being verified nor to any record of prior use, and the generic MPP.Plug dedup store keys on challenge.id, which is regenerated for every 402 response. On a static-price route, a single historical transfer matching the charge therefore satisfies an unbounded number of later charges, including transfers an attacker can read off a public block explorer.
This issue affects mpp: from 0.3.0 before 0.6.3.
Severity
SSVC
Exploitation: none
Automatable: yes
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-08-19 18:43 UTC
CWE
- CWE-294 - Authentication Bypass by Capture-replay
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-67581.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-67581 | related |
| https://github.com/ZenHive/mpp/commit/ecc038088b1… | patch |
Impacted products
Date Public
2026-07-06 00:00
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-67581",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "yes"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-19T18:43:43.808136Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T18:44:31.945Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.EVM\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/evm.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.EVM\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.3",
"status": "affected",
"version": "0.3.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.EVM\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/evm.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.EVM\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "ecc038088b1cda09ad8a84acc6cc112addb4a68f",
"status": "affected",
"version": "65b9e425ce27631c786a5b380b5e4c5ae607ec6d",
"versionType": "git"
}
]
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.3",
"versionStartIncluding": "0.3.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"datePublic": "2026-07-06T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAuthentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated remote client to obtain paid resources by resubmitting one settled on-chain transfer.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Methods.EVM.verify/2\u003c/code\u003e accepts a transaction-hash credential and matches a transfer purely on \u003ccode\u003etoken\u003c/code\u003e, \u003ccode\u003eto\u003c/code\u003e and \u003ccode\u003eamount\u003c/code\u003e (ERC-20) or \u003ccode\u003eto\u003c/code\u003e and \u003ccode\u003evalue\u003c/code\u003e (native). It binds the proof neither to the challenge being verified nor to any record of prior use, and the generic \u003ccode\u003eMPP.Plug\u003c/code\u003e dedup store keys on \u003ccode\u003echallenge.id\u003c/code\u003e, which is regenerated for every 402 response. On a static-price route, a single historical transfer matching the charge therefore satisfies an unbounded number of later charges, including transfers an attacker can read off a public block explorer.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.3.0 before 0.6.3.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated remote client to obtain paid resources by resubmitting one settled on-chain transfer.\n\n`MPP.Methods.EVM.verify/2` accepts a transaction-hash credential and matches a transfer purely on `token`, `to` and `amount` (ERC-20) or `to` and `value` (native). It binds the proof neither to the challenge being verified nor to any record of prior use, and the generic `MPP.Plug` dedup store keys on `challenge.id`, which is regenerated for every 402 response. On a static-price route, a single historical transfer matching the charge therefore satisfies an unbounded number of later charges, including transfers an attacker can read off a public block explorer.\n\nThis issue affects mpp: from 0.3.0 before 0.6.3."
}
],
"value": "Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated remote client to obtain paid resources by resubmitting one settled on-chain transfer.\n\nMPP.Methods.EVM.verify/2 accepts a transaction-hash credential and matches a transfer purely on token, to and amount (ERC-20) or to and value (native). It binds the proof neither to the challenge being verified nor to any record of prior use, and the generic MPP.Plug dedup store keys on challenge.id, which is regenerated for every 402 response. On a static-price route, a single historical transfer matching the charge therefore satisfies an unbounded number of later charges, including transfers an attacker can read off a public block explorer.\n\nThis issue affects mpp: from 0.3.0 before 0.6.3."
}
],
"impacts": [
{
"capecId": "CAPEC-60",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-60 Reusing Session IDs (aka Session Replay)"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "NONE",
"attackVector": "NETWORK",
"baseScore": 8.7,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "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",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-294",
"description": "CWE-294 Authentication Bypass by Capture-replay",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T17:20:09.606Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vp5h-xh25-44wf"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-67581.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-67581"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/ecc038088b1cda09ad8a84acc6cc112addb4a68f"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "On-chain transfer proof is not single-use in mpp EVM payment method, enabling cross-challenge replay",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003ePrice each challenge uniquely (per-challenge or single-use amounts) so that a historical transfer cannot match a later charge, and keep challenge expiry short to narrow the window in which any given transfer stays useful. Deployments that can use the Tempo method for on-chain payments get per-challenge attribution binding instead.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Price each challenge uniquely (per-challenge or single-use amounts) so that a historical transfer cannot match a later charge, and keep challenge expiry short to narrow the window in which any given transfer stays useful. Deployments that can use the Tempo method for on-chain payments get per-challenge attribution binding instead."
}
],
"value": "Price each challenge uniquely (per-challenge or single-use amounts) so that a historical transfer cannot match a later charge, and keep challenge expiry short to narrow the window in which any given transfer stays useful. Deployments that can use the Tempo method for on-chain payments get per-challenge attribution binding instead."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-67581",
"datePublished": "2026-08-19T17:20:09.606Z",
"dateReserved": "2026-08-18T10:30:01.759Z",
"dateUpdated": "2026-08-19T18:44:31.945Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-73541 (GCVE-0-2026-73541)
Vulnerability from cvelistv5 – Published: 2026-08-19 17:20 – Updated: 2026-08-19 18:47
VLAI
EPSS
VEX
Title
Tempo fee sponsorship in mpp bounds each transaction but not aggregate exposure, allowing concurrent sponsor-wallet drain
Summary
Allocation of Resources Without Limits or Throttling in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet through concurrent sponsored payments, denying service to legitimate payers once it is empty.
MPP.Methods.Tempo.FeePayerPolicy enforces its ceilings (max_gas, max_fee_per_gas, max_priority_fee_per_gas, the worst-case gas_limit * max_fee_per_gas <= max_total_fee budget cap, and a validity window) against one transaction at a time, and nothing accounts for exposure across concurrent requests. reserve_hash_atomic/2 is keyed on the transaction hash, so it prevents duplicate broadcast of the same signed transaction but not N distinct sponsored transactions carrying distinct expiring nonces. Committed sponsor exposure is therefore N times max_total_fee, bounded by nothing in the library, and the default 900 second validity window lets co-signed transactions stay broadcastable and uncounted for that entire period.
This issue affects mpp: from 0.2.0 before 0.12.0.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: total
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-08-19 18:45 UTC
CWE
- CWE-770 - Allocation of Resources Without Limits or Throttling
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-73541.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-73541 | related |
| https://github.com/ZenHive/mpp/commit/ddc46868fba… | patch |
Impacted products
Date Public
2026-08-02 00:00
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-73541",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "total"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-19T18:45:45.477502Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T18:47:04.542Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.12.0",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027",
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo/fee_payer_policy.ex",
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo.FeePayerPolicy\u0027:validate/3"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "ddc46868fba57ccebb567c04709812b466123076",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eOnly deployments that enable Tempo server-side fee sponsorship are affected, through \u003ccode\u003e\"fee_payer\" =\u0026gt; true\u003c/code\u003e in \u003ccode\u003emethod_config\u003c/code\u003e with either local co-signing (\u003ccode\u003efee_payer_private_key\u003c/code\u003e) or hosted sponsorship (\u003ccode\u003efee_payer_url\u003c/code\u003e). Sponsorship is disabled by default.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through `\"fee_payer\" =\u003e true` in `method_config` with either local co-signing (`fee_payer_private_key`) or hosted sponsorship (`fee_payer_url`). Sponsorship is disabled by default."
}
],
"value": "Only deployments that enable Tempo server-side fee sponsorship are affected, through \"fee_payer\" =\u003e true in method_config with either local co-signing (fee_payer_private_key) or hosted sponsorship (fee_payer_url). Sponsorship is disabled by default."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.12.0",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"datePublic": "2026-08-02T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAllocation of Resources Without Limits or Throttling in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet through concurrent sponsored payments, denying service to legitimate payers once it is empty.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Methods.Tempo.FeePayerPolicy\u003c/code\u003e enforces its ceilings (\u003ccode\u003emax_gas\u003c/code\u003e, \u003ccode\u003emax_fee_per_gas\u003c/code\u003e, \u003ccode\u003emax_priority_fee_per_gas\u003c/code\u003e, the worst-case \u003ccode\u003egas_limit * max_fee_per_gas \u0026lt;= max_total_fee\u003c/code\u003e budget cap, and a validity window) against one transaction at a time, and nothing accounts for exposure across concurrent requests. \u003ccode\u003ereserve_hash_atomic/2\u003c/code\u003e is keyed on the transaction hash, so it prevents duplicate broadcast of the same signed transaction but not N distinct sponsored transactions carrying distinct expiring nonces. Committed sponsor exposure is therefore N times \u003ccode\u003emax_total_fee\u003c/code\u003e, bounded by nothing in the library, and the default 900 second validity window lets co-signed transactions stay broadcastable and uncounted for that entire period.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.12.0.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Allocation of Resources Without Limits or Throttling in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet through concurrent sponsored payments, denying service to legitimate payers once it is empty.\n\n`MPP.Methods.Tempo.FeePayerPolicy` enforces its ceilings (`max_gas`, `max_fee_per_gas`, `max_priority_fee_per_gas`, the worst-case `gas_limit * max_fee_per_gas \u003c= max_total_fee` budget cap, and a validity window) against one transaction at a time, and nothing accounts for exposure across concurrent requests. `reserve_hash_atomic/2` is keyed on the transaction hash, so it prevents duplicate broadcast of the same signed transaction but not N distinct sponsored transactions carrying distinct expiring nonces. Committed sponsor exposure is therefore N times `max_total_fee`, bounded by nothing in the library, and the default 900 second validity window lets co-signed transactions stay broadcastable and uncounted for that entire period.\n\nThis issue affects mpp: from 0.2.0 before 0.12.0."
}
],
"value": "Allocation of Resources Without Limits or Throttling in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet through concurrent sponsored payments, denying service to legitimate payers once it is empty.\n\nMPP.Methods.Tempo.FeePayerPolicy enforces its ceilings (max_gas, max_fee_per_gas, max_priority_fee_per_gas, the worst-case gas_limit * max_fee_per_gas \u003c= max_total_fee budget cap, and a validity window) against one transaction at a time, and nothing accounts for exposure across concurrent requests. reserve_hash_atomic/2 is keyed on the transaction hash, so it prevents duplicate broadcast of the same signed transaction but not N distinct sponsored transactions carrying distinct expiring nonces. Committed sponsor exposure is therefore N times max_total_fee, bounded by nothing in the library, and the default 900 second validity window lets co-signed transactions stay broadcastable and uncounted for that entire period.\n\nThis issue affects mpp: from 0.2.0 before 0.12.0."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "HIGH",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-770",
"description": "CWE-770 Allocation of Resources Without Limits or Throttling",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T17:20:00.286Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-j4j7-7xpr-c7cr"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-73541.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-73541"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/ddc46868fba57ccebb567c04709812b466123076"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Tempo fee sponsorship in mpp bounds each transaction but not aggregate exposure, allowing concurrent sponsor-wallet drain",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eDisable Tempo fee sponsorship by setting \u003ccode\u003e\"fee_payer\" =\u0026gt; false\u003c/code\u003e (the default), so the client pays its own gas and the sponsor wallet is never committed. Where sponsorship must stay enabled, lowering \u003ccode\u003emax_total_fee\u003c/code\u003e and \u003ccode\u003emax_validity_window_seconds\u003c/code\u003e reduces the exposure each concurrent request can commit and how long it stays outstanding, without bounding the aggregate.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Disable Tempo fee sponsorship by setting `\"fee_payer\" =\u003e false` (the default), so the client pays its own gas and the sponsor wallet is never committed. Where sponsorship must stay enabled, lowering `max_total_fee` and `max_validity_window_seconds` reduces the exposure each concurrent request can commit and how long it stays outstanding, without bounding the aggregate."
}
],
"value": "Disable Tempo fee sponsorship by setting \"fee_payer\" =\u003e false (the default), so the client pays its own gas and the sponsor wallet is never committed. Where sponsorship must stay enabled, lowering max_total_fee and max_validity_window_seconds reduces the exposure each concurrent request can commit and how long it stays outstanding, without bounding the aggregate."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-73541",
"datePublished": "2026-08-19T17:20:00.286Z",
"dateReserved": "2026-08-18T10:00:02.140Z",
"dateUpdated": "2026-08-19T18:47:04.542Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-73136 (GCVE-0-2026-73136)
Vulnerability from cvelistv5 – Published: 2026-08-19 17:19 – Updated: 2026-08-19 18:54
VLAI
EPSS
VEX
Title
Static memo configuration in mpp Tempo disables per-challenge attribution binding, enabling third-party replay
Summary
Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated third party to obtain paid resources by replaying a transfer settled by an unrelated payer.
MPP.Methods.Tempo normally binds a settled TIP-20 TransferWithMemo to the specific challenge under verification through an attribution nonce carried in the memo. When a static "memo" is configured in method_config, check_matched_memo_binding/3 returns the match unconditionally and that binding is skipped, leaving only token, recipient, amount and the static memo value to match on. The static memo is echoed in every unauthenticated 402 response and Tempo transfers are public, so an attacker can take any matching transfer paid by a legitimate customer, request a fresh challenge for the same route, and present that transaction hash as a type="hash" credential. The hash path performs no sender or signature check tying the presenter to the wallet that broadcast the transfer.
This issue affects mpp: from 0.6.1 before 0.6.4.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-08-19 18:49 UTC
CWE
- CWE-294 - Authentication Bypass by Capture-replay
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-73136.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-73136 | related |
| https://github.com/ZenHive/mpp/commit/2207d7f456a… | patch |
Impacted products
Date Public
2026-07-06 00:00
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-73136",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-19T18:49:35.273666Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T18:54:00.153Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:validate_config!/1"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.4",
"status": "affected",
"version": "0.6.1",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
},
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:validate_config!/1"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "2207d7f456ae14c1d3fcacc6f635bf4f8cee1a34",
"status": "affected",
"version": "542a525563c2fcedd670b593437deca81c6797a4",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eOnly deployments that configure a static \u003ccode\u003e\"memo\"\u003c/code\u003e in the Tempo \u003ccode\u003emethod_config\u003c/code\u003e are affected. Deployments using the default per-challenge attribution memo are not: that path binds each settled transfer to the challenge under verification and is single-use by construction.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Only deployments that configure a static `\"memo\"` in the Tempo `method_config` are affected. Deployments using the default per-challenge attribution memo are not: that path binds each settled transfer to the challenge under verification and is single-use by construction."
}
],
"value": "Only deployments that configure a static \"memo\" in the Tempo method_config are affected. Deployments using the default per-challenge attribution memo are not: that path binds each settled transfer to the challenge under verification and is single-use by construction."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.4",
"versionStartIncluding": "0.6.1",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"datePublic": "2026-07-06T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eAuthentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated third party to obtain paid resources by replaying a transfer settled by an unrelated payer.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMPP.Methods.Tempo\u003c/code\u003e normally binds a settled TIP-20 \u003ccode\u003eTransferWithMemo\u003c/code\u003e to the specific challenge under verification through an attribution nonce carried in the memo. When a static \u003ccode\u003e\"memo\"\u003c/code\u003e is configured in \u003ccode\u003emethod_config\u003c/code\u003e, \u003ccode\u003echeck_matched_memo_binding/3\u003c/code\u003e returns the match unconditionally and that binding is skipped, leaving only \u003ccode\u003etoken\u003c/code\u003e, \u003ccode\u003erecipient\u003c/code\u003e, \u003ccode\u003eamount\u003c/code\u003e and the static memo value to match on. The static memo is echoed in every unauthenticated 402 response and Tempo transfers are public, so an attacker can take any matching transfer paid by a legitimate customer, request a fresh challenge for the same route, and present that transaction hash as a \u003ccode\u003etype=\"hash\"\u003c/code\u003e credential. The hash path performs no sender or signature check tying the presenter to the wallet that broadcast the transfer.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.6.1 before 0.6.4.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated third party to obtain paid resources by replaying a transfer settled by an unrelated payer.\n\n`MPP.Methods.Tempo` normally binds a settled TIP-20 `TransferWithMemo` to the specific challenge under verification through an attribution nonce carried in the memo. When a static `\"memo\"` is configured in `method_config`, `check_matched_memo_binding/3` returns the match unconditionally and that binding is skipped, leaving only `token`, `recipient`, `amount` and the static memo value to match on. The static memo is echoed in every unauthenticated 402 response and Tempo transfers are public, so an attacker can take any matching transfer paid by a legitimate customer, request a fresh challenge for the same route, and present that transaction hash as a `type=\"hash\"` credential. The hash path performs no sender or signature check tying the presenter to the wallet that broadcast the transfer.\n\nThis issue affects mpp: from 0.6.1 before 0.6.4."
}
],
"value": "Authentication Bypass by Capture-replay in ZenHive mpp allows an unauthenticated third party to obtain paid resources by replaying a transfer settled by an unrelated payer.\n\nMPP.Methods.Tempo normally binds a settled TIP-20 TransferWithMemo to the specific challenge under verification through an attribution nonce carried in the memo. When a static \"memo\" is configured in method_config, check_matched_memo_binding/3 returns the match unconditionally and that binding is skipped, leaving only token, recipient, amount and the static memo value to match on. The static memo is echoed in every unauthenticated 402 response and Tempo transfers are public, so an attacker can take any matching transfer paid by a legitimate customer, request a fresh challenge for the same route, and present that transaction hash as a type=\"hash\" credential. The hash path performs no sender or signature check tying the presenter to the wallet that broadcast the transfer.\n\nThis issue affects mpp: from 0.6.1 before 0.6.4."
}
],
"impacts": [
{
"capecId": "CAPEC-60",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-60 Reusing Session IDs (aka Session Replay)"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.2,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-294",
"description": "CWE-294 Authentication Bypass by Capture-replay",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T17:19:52.413Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-34g7-vx6g-82mq"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-73136.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-73136"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/2207d7f456ae14c1d3fcacc6f635bf4f8cee1a34"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Static memo configuration in mpp Tempo disables per-challenge attribution binding, enabling third-party replay",
"workarounds": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eRemove the static \u003ccode\u003e\"memo\"\u003c/code\u003e from the Tempo \u003ccode\u003emethod_config\u003c/code\u003e so verification falls back to the default per-challenge attribution binding, which ties each settled transfer to the challenge being verified. Where a static memo must be kept, configure a dedup store (for example \u003ccode\u003eMPP.Tempo.ConCacheStore\u003c/code\u003e) with a TTL at least as long as the challenge expiry, which reduces unlimited replay to a race on the transaction hash rather than closing it.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "Remove the static `\"memo\"` from the Tempo `method_config` so verification falls back to the default per-challenge attribution binding, which ties each settled transfer to the challenge being verified. Where a static memo must be kept, configure a dedup store (for example `MPP.Tempo.ConCacheStore`) with a TTL at least as long as the challenge expiry, which reduces unlimited replay to a race on the transaction hash rather than closing it."
}
],
"value": "Remove the static \"memo\" from the Tempo method_config so verification falls back to the default per-challenge attribution binding, which ties each settled transfer to the challenge being verified. Where a static memo must be kept, configure a dedup store (for example MPP.Tempo.ConCacheStore) with a TTL at least as long as the challenge expiry, which reduces unlimited replay to a race on the transaction hash rather than closing it."
}
]
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-73136",
"datePublished": "2026-08-19T17:19:52.413Z",
"dateReserved": "2026-08-18T10:00:02.159Z",
"dateUpdated": "2026-08-19T18:54:00.153Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-73829 (GCVE-0-2026-73829)
Vulnerability from cvelistv5 – Published: 2026-08-19 17:19 – Updated: 2026-08-19 18:58
VLAI
EPSS
VEX
Title
Non-atomic hash-credential dedup in mpp Tempo allows replay of a confirmed payment under a concurrent race
Summary
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.
Severity
SSVC
Exploitation: none
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-08-19 18:55 UTC
CWE
- CWE-367 - Time-of-check Time-of-use (TOCTOU) Race Condition
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-73829.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-73829 | related |
| https://github.com/ZenHive/mpp/commit/46c5b0e1311… | patch |
Impacted products
Date Public
2026-06-29 00:00
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-73829",
"options": [
{
"Exploitation": "none"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-08-19T18:55:14.304500Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T18:58:33.322Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.1",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "zenhive/mpp",
"packageURL": "pkg:github/zenhive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:verify/2"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "46c5b0e1311da7d92190dc7d9ea89027a1d365e9",
"status": "affected",
"version": "f8904666061fbab695874856d8fcd02c471dfe1b",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe race is only reachable when \u003ccode\u003eMPP.Methods.Tempo\u003c/code\u003e is configured with a dedup store (\u003ccode\u003e\"store\"\u003c/code\u003e in \u003ccode\u003emethod_config\u003c/code\u003e). The default is \u003ccode\u003enil\u003c/code\u003e, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "The race is only reachable when `MPP.Methods.Tempo` is configured with a dedup store (`\"store\"` in `method_config`). The default is `nil`, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue."
}
],
"value": "The race is only reachable when MPP.Methods.Tempo is configured with a dedup store (\"store\" in method_config). The default is nil, which runs the library statelessly and provides no application-level replay protection at all, a documented property rather than part of this issue."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.1",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "OR"
}
],
"operator": "AND"
}
],
"credits": [
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
},
{
"lang": "en",
"type": "finder",
"value": "E.FU"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
}
],
"datePublic": "2026-06-29T00:00:00.000Z",
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eTime-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.\u003c/p\u003e\n\u003cp\u003eThe \u003ccode\u003etype=\"hash\"\u003c/code\u003e credential path in \u003ccode\u003eMPP.Methods.Tempo.verify/2\u003c/code\u003e guards against replay with a non-atomic check-then-mark sequence: \u003ccode\u003echeck_hash_unused/2\u003c/code\u003e reads the dedup store, an \u003ccode\u003eeth_getTransactionReceipt\u003c/code\u003e round trip verifies the payment on chain, and only then does \u003ccode\u003emark_hash_used/2\u003c/code\u003e 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\u0027s atomic \u003ccode\u003echeck_and_mark/2\u003c/code\u003e primitive is available and used by the \u003ccode\u003etype=\"transaction\"\u003c/code\u003e path, but the hash path calls plain \u003ccode\u003eget\u003c/code\u003e and \u003ccode\u003eput\u003c/code\u003e even when the configured store implements it. Exploitation requires a dedup store to be configured; the default \u003ccode\u003enil\u003c/code\u003e store is stateless and documented as offering no replay protection at all.\u003c/p\u003e\n\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.6.1.\u003c/p\u003e"
},
{
"base64": false,
"type": "text/markdown",
"value": "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.\n\nThe `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\u0027s 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.\n\nThis issue affects mpp: from 0.2.0 before 0.6.1."
}
],
"value": "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.\n\nThe 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\u0027s 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.\n\nThis issue affects mpp: from 0.2.0 before 0.6.1."
}
],
"impacts": [
{
"capecId": "CAPEC-29",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-29 Leveraging Time-of-Check and Time-of-Use (TOCTOU) Race Conditions"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"Automatable": "NOT_DEFINED",
"Recovery": "NOT_DEFINED",
"Safety": "NOT_DEFINED",
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 6.3,
"baseSeverity": "MEDIUM",
"privilegesRequired": "NONE",
"providerUrgency": "NOT_DEFINED",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"valueDensity": "NOT_DEFINED",
"vectorString": "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",
"version": "4.0",
"vulnAvailabilityImpact": "NONE",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "LOW",
"vulnerabilityResponseEffort": "NOT_DEFINED"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-367",
"description": "CWE-367 Time-of-check Time-of-use (TOCTOU) Race Condition",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-08-19T17:19:43.696Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-w8j7-7qc3-5f24"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-73829.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-73829"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/46c5b0e1311da7d92190dc7d9ea89027a1d365e9"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Non-atomic hash-credential dedup in mpp Tempo allows replay of a confirmed payment under a concurrent race"
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-73829",
"datePublished": "2026-08-19T17:19:43.696Z",
"dateReserved": "2026-08-17T11:15:02.320Z",
"dateUpdated": "2026-08-19T18:58:33.322Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-59252 (GCVE-0-2026-59252)
Vulnerability from cvelistv5 – Published: 2026-07-17 10:11 – Updated: 2026-07-18 04:12
VLAI
EPSS
VEX
Title
Missing gas_limit validation in mpp Tempo fee-payer enables wallet drain
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet, resulting in denial of service for legitimate clients.
When the mpp Elixir library is configured as fee payer (fee_payer: true), the MPP.Methods.Tempo payment method co-signs and broadcasts a client-supplied EVM transaction without first validating that the client-supplied gas_limit is sufficient to complete the intended call. A malicious client can submit a signed transferWithMemo transaction with gas_limit deliberately set just below the amount required for successful execution. The server co-signs the transaction and broadcasts it via rpc_broadcast_sync. The transaction runs out of gas during EVM execution and reverts, but the fee-payer wallet is still charged for the burned gas while the client pays nothing and receives no resource. Repeated requests from one or more malicious clients drain the fee-payer wallet at near-zero cost to the attacker, ultimately preventing the server from sponsoring gas for legitimate payment requests.
The wait_for_confirmation = false (optimistic) path is also affected: it invokes simulate_payment_call via eth_call, but that simulation omits the gas parameter and therefore does not catch out-of-gas conditions.
This issue affects mpp: from 0.2.0 before 0.6.0.
Severity
SSVC
Exploitation: poc
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-07-17 12:21 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-59252.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-59252 | related |
| https://github.com/ZenHive/mpp/commit/d84e3e528db… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-59252",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-17T12:21:12.801804Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-07-17T12:21:18.794Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vj8p-hp9x-gh47"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:broadcast_and_verify/7"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.0",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Methods.Tempo\u0027"
],
"packageName": "ZenHive/mpp",
"packageURL": "pkg:github/ZenHive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/methods/tempo.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Methods.Tempo\u0027:broadcast_and_verify/7"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "d84e3e528db39654540c2035ea0fbdf7b950d3d1",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe vulnerable code path is only reachable when the \u003ctt\u003eMPP.Methods.Tempo\u003c/tt\u003e method is configured with \u003ctt\u003efee_payer: true\u003c/tt\u003e (server-side gas sponsorship). Default deployments with \u003ctt\u003efee_payer: false\u003c/tt\u003e are not affected, since the client pays for gas out of its own wallet.\u003c/p\u003e"
}
],
"value": "The vulnerable code path is only reachable when the MPP.Methods.Tempo method is configured with fee_payer: true (server-side gas sponsorship). Default deployments with fee_payer: false are not affected, since the client pays for gas out of its own wallet."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.0",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "AND"
}
],
"operator": "OR"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet, resulting in denial of service for legitimate clients.\u003c/p\u003e\u003cp\u003eWhen the \u003ctt\u003empp\u003c/tt\u003e Elixir library is configured as fee payer (\u003ctt\u003efee_payer: true\u003c/tt\u003e), the \u003ctt\u003eMPP.Methods.Tempo\u003c/tt\u003e payment method co-signs and broadcasts a client-supplied EVM transaction without first validating that the client-supplied \u003ctt\u003egas_limit\u003c/tt\u003e is sufficient to complete the intended call. A malicious client can submit a signed \u003ctt\u003etransferWithMemo\u003c/tt\u003e transaction with \u003ctt\u003egas_limit\u003c/tt\u003e deliberately set just below the amount required for successful execution. The server co-signs the transaction and broadcasts it via \u003ctt\u003erpc_broadcast_sync\u003c/tt\u003e. The transaction runs out of gas during EVM execution and reverts, but the fee-payer wallet is still charged for the burned gas while the client pays nothing and receives no resource. Repeated requests from one or more malicious clients drain the fee-payer wallet at near-zero cost to the attacker, ultimately preventing the server from sponsoring gas for legitimate payment requests.\u003c/p\u003e\u003cp\u003eThe \u003ctt\u003ewait_for_confirmation = false\u003c/tt\u003e (optimistic) path is also affected: it invokes \u003ctt\u003esimulate_payment_call\u003c/tt\u003e via \u003ctt\u003eeth_call\u003c/tt\u003e, but that simulation omits the \u003ctt\u003egas\u003c/tt\u003e parameter and therefore does not catch out-of-gas conditions.\u003c/p\u003e\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.6.0.\u003c/p\u003e"
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet, resulting in denial of service for legitimate clients.\n\nWhen the mpp Elixir library is configured as fee payer (fee_payer: true), the MPP.Methods.Tempo payment method co-signs and broadcasts a client-supplied EVM transaction without first validating that the client-supplied gas_limit is sufficient to complete the intended call. A malicious client can submit a signed transferWithMemo transaction with gas_limit deliberately set just below the amount required for successful execution. The server co-signs the transaction and broadcasts it via rpc_broadcast_sync. The transaction runs out of gas during EVM execution and reverts, but the fee-payer wallet is still charged for the burned gas while the client pays nothing and receives no resource. Repeated requests from one or more malicious clients drain the fee-payer wallet at near-zero cost to the attacker, ultimately preventing the server from sponsoring gas for legitimate payment requests.\n\nThe wait_for_confirmation = false (optimistic) path is also affected: it invokes simulate_payment_call via eth_call, but that simulation omits the gas parameter and therefore does not catch out-of-gas conditions.\n\nThis issue affects mpp: from 0.2.0 before 0.6.0."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.2,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "HIGH",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "NONE"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-07-18T04:12:42.459Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vj8p-hp9x-gh47"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-59252.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-59252"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/d84e3e528db39654540c2035ea0fbdf7b950d3d1"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Missing gas_limit validation in mpp Tempo fee-payer enables wallet drain",
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-59252",
"datePublished": "2026-07-17T10:11:54.436Z",
"dateReserved": "2026-07-04T04:24:03.653Z",
"dateUpdated": "2026-07-18T04:12:42.459Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-59694 (GCVE-0-2026-59694)
Vulnerability from cvelistv5 – Published: 2026-07-17 10:11 – Updated: 2026-07-18 04:12
VLAI
EPSS
VEX
Title
Unbounded access list in mpp Tempo fee-payer inflates gas cost per payment
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer's gas cost per payment by a large multiplier, degrading the sponsor's operating margin.
When the mpp Elixir library is configured as fee payer (fee_payer: true), MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs the client-supplied base fields of the 0x76 AASigned envelope verbatim, including the EIP-2930 access list, without validating its length or contents. EIP-2930 access list entries incur intrinsic gas (~2,400 gas per address, plus 1,900 gas per storage key) charged before any opcode executes, regardless of whether the listed addresses are ever touched. A malicious client submits a valid transferWithMemo call alongside a large number of fabricated access-list entries. The server co-signs and broadcasts the transaction. The intended transfer executes normally, but the fee-payer wallet pays a large multiple of the expected gas cost with no corresponding on-chain work.
At the maintainer's default of 137 access-list entries (fitting within Bandit's 10,000-byte per-header-field limit) and 100 Gwei max_fee_per_gas, per-payment gas cost rises from ~51,287 to ~380,087 gas, a 7.4x multiplier. Sustained abuse destroys the sponsor's operating margin on low-cost payments and, over time, drains the fee-payer wallet.
This issue affects mpp: from 0.2.0 before 0.6.0.
Severity
SSVC
Exploitation: poc
Automatable: no
Technical Impact: partial
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-07-17 12:22 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-59694.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-59694 | related |
| https://github.com/ZenHive/mpp/commit/5d6338e2334… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-59694",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "partial"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-17T12:22:40.105353Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-07-17T12:22:45.224Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-qpxh-ff8m-c62v"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Tempo.Transaction\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/tempo/transaction.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Tempo.Transaction\u0027:cosign_fee_payer/3"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.0",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Tempo.Transaction\u0027"
],
"packageName": "ZenHive/mpp",
"packageURL": "pkg:github/ZenHive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/tempo/transaction.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Tempo.Transaction\u0027:cosign_fee_payer/3"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "5d6338e2334084c5f2a78cfcca474830733ed7e8",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe vulnerable code path is only reachable when the \u003ctt\u003eMPP.Methods.Tempo\u003c/tt\u003e method is configured with \u003ctt\u003efee_payer: true\u003c/tt\u003e (server-side gas sponsorship). Default deployments with \u003ctt\u003efee_payer: false\u003c/tt\u003e are not affected, since the client pays for gas out of its own wallet.\u003c/p\u003e"
}
],
"value": "The vulnerable code path is only reachable when the MPP.Methods.Tempo method is configured with fee_payer: true (server-side gas sponsorship). Default deployments with fee_payer: false are not affected, since the client pays for gas out of its own wallet."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.0",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "AND"
}
],
"operator": "OR"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per payment by a large multiplier, degrading the sponsor\u0027s operating margin.\u003c/p\u003e\u003cp\u003eWhen the \u003ctt\u003empp\u003c/tt\u003e Elixir library is configured as fee payer (\u003ctt\u003efee_payer: true\u003c/tt\u003e), \u003ctt\u003eMPP.Tempo.Transaction.cosign_fee_payer/3\u003c/tt\u003e re-signs the client-supplied base fields of the \u003ctt\u003e0x76\u003c/tt\u003e AASigned envelope verbatim, including the EIP-2930 access list, without validating its length or contents. EIP-2930 access list entries incur intrinsic gas (~2,400 gas per address, plus 1,900 gas per storage key) charged before any opcode executes, regardless of whether the listed addresses are ever touched. A malicious client submits a valid \u003ctt\u003etransferWithMemo\u003c/tt\u003e call alongside a large number of fabricated access-list entries. The server co-signs and broadcasts the transaction. The intended transfer executes normally, but the fee-payer wallet pays a large multiple of the expected gas cost with no corresponding on-chain work.\u003c/p\u003e\u003cp\u003eAt the maintainer\u0027s default of 137 access-list entries (fitting within Bandit\u0027s 10,000-byte per-header-field limit) and 100 Gwei \u003ctt\u003emax_fee_per_gas\u003c/tt\u003e, per-payment gas cost rises from ~51,287 to ~380,087 gas, a 7.4x multiplier. Sustained abuse destroys the sponsor\u0027s operating margin on low-cost payments and, over time, drains the fee-payer wallet.\u003c/p\u003e\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.6.0.\u003c/p\u003e"
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to inflate the fee-payer\u0027s gas cost per payment by a large multiplier, degrading the sponsor\u0027s operating margin.\n\nWhen the mpp Elixir library is configured as fee payer (fee_payer: true), MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs the client-supplied base fields of the 0x76 AASigned envelope verbatim, including the EIP-2930 access list, without validating its length or contents. EIP-2930 access list entries incur intrinsic gas (~2,400 gas per address, plus 1,900 gas per storage key) charged before any opcode executes, regardless of whether the listed addresses are ever touched. A malicious client submits a valid transferWithMemo call alongside a large number of fabricated access-list entries. The server co-signs and broadcasts the transaction. The intended transfer executes normally, but the fee-payer wallet pays a large multiple of the expected gas cost with no corresponding on-chain work.\n\nAt the maintainer\u0027s default of 137 access-list entries (fitting within Bandit\u0027s 10,000-byte per-header-field limit) and 100 Gwei max_fee_per_gas, per-payment gas cost rises from ~51,287 to ~380,087 gas, a 7.4x multiplier. Sustained abuse destroys the sponsor\u0027s operating margin on low-cost payments and, over time, drains the fee-payer wallet.\n\nThis issue affects mpp: from 0.2.0 before 0.6.0."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:L/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "LOW",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-07-18T04:12:36.335Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-qpxh-ff8m-c62v"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-59694.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-59694"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/5d6338e2334084c5f2a78cfcca474830733ed7e8"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unbounded access list in mpp Tempo fee-payer inflates gas cost per payment",
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-59694",
"datePublished": "2026-07-17T10:11:49.192Z",
"dateReserved": "2026-07-06T14:05:47.003Z",
"dateUpdated": "2026-07-18T04:12:36.335Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}
CVE-2026-59695 (GCVE-0-2026-59695)
Vulnerability from cvelistv5 – Published: 2026-07-17 10:11 – Updated: 2026-07-18 04:12
VLAI
EPSS
VEX
Title
Unbounded max_fee_per_gas in mpp Tempo fee-payer enables single-request wallet drain
Summary
Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet in a single request by naming an arbitrarily high gas price.
When the mpp Elixir library is configured as fee payer (fee_payer: true), MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs the client-supplied base fields of the 0x76 AASigned envelope verbatim, including max_fee_per_gas and max_priority_fee_per_gas, without validating that they are within reasonable bounds. A malicious client embeds arbitrarily large values for these fields in the signed envelope. The server co-signs and broadcasts the transaction. The effective_gas_price billed against the fee-payer wallet is derived from the attacker-supplied ceilings, so the server pays those inflated per-gas rates out of its own wallet. A single crafted request can drain the wallet entirely, after which the server can no longer sponsor gas for legitimate payment requests.
This issue affects mpp: from 0.2.0 before 0.6.0.
Severity
SSVC
Exploitation: poc
Automatable: no
Technical Impact: total
CISA Coordinator · CISA-ADP (v2.0.3)
Decision recorded 2026-07-17 12:53 UTC
CWE
- CWE-1284 - Improper Validation of Specified Quantity in Input
Assigner
References
4 references
| URL | Tags |
|---|---|
| https://github.com/ZenHive/mpp/security/advisorie… | vendor-advisoryrelated |
| https://cna.erlef.org/cves/CVE-2026-59695.html | related |
| https://osv.dev/vulnerability/EEF-CVE-2026-59695 | related |
| https://github.com/ZenHive/mpp/commit/5d6338e2334… | patch |
Impacted products
{
"containers": {
"adp": [
{
"metrics": [
{
"other": {
"content": {
"id": "CVE-2026-59695",
"options": [
{
"Exploitation": "poc"
},
{
"Automatable": "no"
},
{
"Technical Impact": "total"
}
],
"role": "CISA Coordinator",
"timestamp": "2026-07-17T12:53:10.647332Z",
"version": "2.0.3"
},
"type": "ssvc"
}
}
],
"providerMetadata": {
"dateUpdated": "2026-07-17T12:53:17.645Z",
"orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
"shortName": "CISA-ADP"
},
"references": [
{
"tags": [
"exploit"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vv77-66rf-pm86"
}
],
"title": "CISA ADP Vulnrichment"
}
],
"cna": {
"affected": [
{
"collectionURL": "https://repo.hex.pm",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Tempo.Transaction\u0027"
],
"packageName": "mpp",
"packageURL": "pkg:hex/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/tempo/transaction.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Tempo.Transaction\u0027:cosign_fee_payer/3"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "0.6.0",
"status": "affected",
"version": "0.2.0",
"versionType": "semver"
}
]
},
{
"collectionURL": "https://github.com",
"cpes": [
"cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*"
],
"defaultStatus": "unaffected",
"modules": [
"\u0027Elixir.MPP.Tempo.Transaction\u0027"
],
"packageName": "ZenHive/mpp",
"packageURL": "pkg:github/ZenHive/mpp",
"product": "mpp",
"programFiles": [
"lib/mpp/tempo/transaction.ex"
],
"programRoutines": [
{
"name": "\u0027Elixir.MPP.Tempo.Transaction\u0027:cosign_fee_payer/3"
}
],
"repo": "https://github.com/ZenHive/mpp",
"vendor": "ZenHive",
"versions": [
{
"lessThan": "5d6338e2334084c5f2a78cfcca474830733ed7e8",
"status": "affected",
"version": "d29d54e507918db00a5b65d90136b73166c017d7",
"versionType": "git"
}
]
}
],
"configurations": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eThe vulnerable code path is only reachable when the \u003ctt\u003eMPP.Methods.Tempo\u003c/tt\u003e method is configured with \u003ctt\u003efee_payer: true\u003c/tt\u003e (server-side gas sponsorship). Default deployments with \u003ctt\u003efee_payer: false\u003c/tt\u003e are not affected, since the client pays for gas out of its own wallet.\u003c/p\u003e"
}
],
"value": "The vulnerable code path is only reachable when the MPP.Methods.Tempo method is configured with fee_payer: true (server-side gas sponsorship). Default deployments with fee_payer: false are not affected, since the client pays for gas out of its own wallet."
}
],
"cpeApplicability": [
{
"nodes": [
{
"cpeMatch": [
{
"criteria": "cpe:2.3:a:ZenHive:mpp:*:*:*:*:*:*:*:*",
"versionEndExcluding": "0.6.0",
"versionStartIncluding": "0.2.0",
"vulnerable": true
}
],
"negate": false,
"operator": "AND"
}
],
"operator": "OR"
}
],
"credits": [
{
"lang": "en",
"type": "finder",
"value": "Kian Kai Ang"
},
{
"lang": "en",
"type": "remediation developer",
"value": "E.FU"
},
{
"lang": "en",
"type": "analyst",
"value": "Jonatan M\u00e4nnchen / EEF"
}
],
"descriptions": [
{
"lang": "en",
"supportingMedia": [
{
"base64": false,
"type": "text/html",
"value": "\u003cp\u003eImproper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet in a single request by naming an arbitrarily high gas price.\u003c/p\u003e\u003cp\u003eWhen the \u003ctt\u003empp\u003c/tt\u003e Elixir library is configured as fee payer (\u003ctt\u003efee_payer: true\u003c/tt\u003e), \u003ctt\u003eMPP.Tempo.Transaction.cosign_fee_payer/3\u003c/tt\u003e re-signs the client-supplied base fields of the \u003ctt\u003e0x76\u003c/tt\u003e AASigned envelope verbatim, including \u003ctt\u003emax_fee_per_gas\u003c/tt\u003e and \u003ctt\u003emax_priority_fee_per_gas\u003c/tt\u003e, without validating that they are within reasonable bounds. A malicious client embeds arbitrarily large values for these fields in the signed envelope. The server co-signs and broadcasts the transaction. The \u003ctt\u003eeffective_gas_price\u003c/tt\u003e billed against the fee-payer wallet is derived from the attacker-supplied ceilings, so the server pays those inflated per-gas rates out of its own wallet. A single crafted request can drain the wallet entirely, after which the server can no longer sponsor gas for legitimate payment requests.\u003c/p\u003e\u003cp\u003eThis issue affects mpp: from 0.2.0 before 0.6.0.\u003c/p\u003e"
}
],
"value": "Improper Validation of Specified Quantity in Input in ZenHive mpp allows an unauthenticated remote client to drain the fee-payer wallet in a single request by naming an arbitrarily high gas price.\n\nWhen the mpp Elixir library is configured as fee payer (fee_payer: true), MPP.Tempo.Transaction.cosign_fee_payer/3 re-signs the client-supplied base fields of the 0x76 AASigned envelope verbatim, including max_fee_per_gas and max_priority_fee_per_gas, without validating that they are within reasonable bounds. A malicious client embeds arbitrarily large values for these fields in the signed envelope. The server co-signs and broadcasts the transaction. The effective_gas_price billed against the fee-payer wallet is derived from the attacker-supplied ceilings, so the server pays those inflated per-gas rates out of its own wallet. A single crafted request can drain the wallet entirely, after which the server can no longer sponsor gas for legitimate payment requests.\n\nThis issue affects mpp: from 0.2.0 before 0.6.0."
}
],
"impacts": [
{
"capecId": "CAPEC-130",
"descriptions": [
{
"lang": "en",
"value": "CAPEC-130 Excessive Allocation"
}
]
}
],
"metrics": [
{
"cvssV4_0": {
"attackComplexity": "LOW",
"attackRequirements": "PRESENT",
"attackVector": "NETWORK",
"baseScore": 8.3,
"baseSeverity": "HIGH",
"privilegesRequired": "NONE",
"subAvailabilityImpact": "NONE",
"subConfidentialityImpact": "NONE",
"subIntegrityImpact": "NONE",
"userInteraction": "NONE",
"vectorString": "CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N",
"version": "4.0",
"vulnAvailabilityImpact": "HIGH",
"vulnConfidentialityImpact": "NONE",
"vulnIntegrityImpact": "HIGH"
},
"format": "CVSS",
"scenarios": [
{
"lang": "en",
"value": "GENERAL"
}
]
}
],
"problemTypes": [
{
"descriptions": [
{
"cweId": "CWE-1284",
"description": "CWE-1284 Improper Validation of Specified Quantity in Input",
"lang": "en",
"type": "CWE"
}
]
}
],
"providerMetadata": {
"dateUpdated": "2026-07-18T04:12:26.916Z",
"orgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"shortName": "EEF"
},
"references": [
{
"tags": [
"vendor-advisory",
"related"
],
"url": "https://github.com/ZenHive/mpp/security/advisories/GHSA-vv77-66rf-pm86"
},
{
"tags": [
"related"
],
"url": "https://cna.erlef.org/cves/CVE-2026-59695.html"
},
{
"tags": [
"related"
],
"url": "https://osv.dev/vulnerability/EEF-CVE-2026-59695"
},
{
"tags": [
"patch"
],
"url": "https://github.com/ZenHive/mpp/commit/5d6338e2334084c5f2a78cfcca474830733ed7e8"
}
],
"source": {
"discovery": "EXTERNAL"
},
"title": "Unbounded max_fee_per_gas in mpp Tempo fee-payer enables single-request wallet drain",
"x_generator": {
"engine": "cvelib 1.8.0"
}
}
},
"cveMetadata": {
"assignerOrgId": "6b3ad84c-e1a6-4bf7-a703-f496b71e49db",
"assignerShortName": "EEF",
"cveId": "CVE-2026-59695",
"datePublished": "2026-07-17T10:11:43.674Z",
"dateReserved": "2026-07-06T14:05:47.003Z",
"dateUpdated": "2026-07-18T04:12:26.916Z",
"state": "PUBLISHED"
},
"dataType": "CVE_RECORD",
"dataVersion": "5.2"
}