mpp vulnerable to Gas Draining with access listGHSA-qpxh-ff8m-c62v
Fix: ZenHive/mpp@5d6338eGHSA-qpxh-ff8m-c62v is a CWE-1284 vulnerability in mpp. A fix is available for mpp — see the affected versions and patch details below.
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
Exploitation and automatability from CISA’s SSVC triage for GHSA-qpxh-ff8m-c62v.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
Real-World Exposure
mppReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects Hex packages — download data is not available via public APIs for these ecosystems.
Description
Details
When the server acts as the fee_payer, mpp Elixir 0.4.0 copies the client-supplied EIP-2930 access list verbatim into the cosigned fee-payer transaction. In cosign_fee_payer, the server re-signs the raw base_fields (index 5 of the 0x76 AASigned envelope) without inspecting the access list field, which is part of the signed payload.
Access list gas is charged intrinsically — before any opcode executes — regardless of whether the listed addresses are ever touched.
An attacker submits a valid transferWithMemo alongside fabricated address-only access list entries. The server validates calldata and amount but never inspects access_list length. It cosigns and broadcasts a transaction that costs the fee-payer wallet N × 2,400 extra gas per request with no corresponding work performed on-chain.
At the default of 137 entries and 100 Gwei max_fee_per_gas, this inflates the fee-payer cost from the normal ~51,287 gas to ~380,087 gas — a 7.4× multiplier — while staying within Bandit's default 10,000-byte per-header-field limit (verified empirically).
PoC
The PoC is provided below. It is configured to reproduce the attack on Tempo Moderate testnet within a Docker environment. Download the PoC and run:
unzip mpp_elixir_PoC.zip
cd mpp_elixir
docker build -t mpp-elixir-access-list .
docker run --rm mpp-elixir-access-list
There are more details in mpp_elixir/README.md
Impact
A malicious client can force the server to pay ~7.4x the normal transaction fee. This dramatically increases operational costs and completely destroys the profit margin on low-cost items.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 💧Hex | mpp | ≥ 0.2.0&&< 0.6.0 | 0.6.0mix deps.update mpp |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for mpp, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Fix
Update mpp to 0.6.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms GHSA-qpxh-ff8m-c62v is resolved across your whole dependency graph.
Workarounds
Cap what an attacker can consume: apply request size, rate and timeout limits in front of the affected component, and run it with memory and CPU limits so exhaustion degrades one worker rather than the whole service.
Frequently Asked Questions
Is GHSA-qpxh-ff8m-c62v in your dependencies?
Find it across Hex, including transitive dependencies.