mpp vulnerable to Gas Draining with no limitGHSA-vv77-66rf-pm86
Fix: ZenHive/mpp@5d6338eGHSA-vv77-66rf-pm86 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.
- A successful exploit gives an attacker total control of the affected component, not partial access.
Exploitation and automatability from CISA’s SSVC triage for GHSA-vv77-66rf-pm86.
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, the mpp Elixir 0.4.0 does not validate gas_limit, max_fee_per_gas and max_priority_fee_per_gas before cosigning the client's fee-payer transaction. A malicious client embeds arbitrarily large max_fee_per_gas and max_priority_fee_per_gas values in the signed envelope. The server cosigns and broadcasts — paying those inflated gas costs from its own wallet based on the effective_gas_price calculated from the high max_fee_per_gas and max_priority_fee_per_gas set by the client.
Vulnerable function: cosign_fee_payer/3 in transaction.ex around lines 229–262.
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-gasdrain .
docker run --rm mpp-elixir-gasdrain
There are more details in mpp_elixir/README.md
Impact
By draining the server's wallet, an attacker causes direct financial loss to the organization. Furthermore, if the server's funds are drained completely, legitimate clients will have their requests fail, as the server can no longer fund future transactions, effectively creating a Denial of Service (DoS) attack.
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-vv77-66rf-pm86 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-vv77-66rf-pm86 in your dependencies?
Find it across Hex, including transitive dependencies.