GHSA-vj8p-hp9x-gh47: Input Validation
Vulnerability When the server acts as the fee payer, mpp Elixir 0.4.0 (ZenHive/mpp) does not validate whether the gaslimit set by the client is enough before broadcasting. A malicious client can drain the server's gas without paying.
A transferWithMemo call on Tempo Moderato testnet requires ~51,299 gas to complete successfully. By setting gaslimit = 51,298:
1. The Tx gets cosigned and broadcast by the server. 2. The Tx runs out of gas during EVM execution. All state reverts. 3. The server's fee-payer wallet is charged for gas used. 4. The client pays nothing and receives no resource.
bash Run the PoC unzip mppelixirlowgasPoC.zip cd mppelixirlowgasPoC docker build -t mpp-elixir-low-gas . docker run --rm mpp-elixir-low-gas
Zero-Cost DoS Attack: Unlike gas draining with access list or padding, where the malicious client needs to complete a payment to drain the gas, this vulnerability allows malicious users to continuously drain the server's gas at virtually no financial cost (requiring only computing power). Therefore, an attacker can spawn N malicious clients to completely drain the funds from the server's wallet to perform a Denial of Service (DoS) attack. Once the server's wallet is empty, it has no more funds to pay the gas fees for upcoming requests from legitimate clients.
bash Run the DoS PoC unzip mppelixirlowgasdosPoC.zip cd mppelixirlowgasdosPoC docker build -t mpp-elixir-dos . docker run --rm mpp-elixir-dos
Vulnerable code path: broadcastandverify/7 in mpp/methods/tempo.ex (ZenHive/mpp 0.4.0). When waitforconfirmation = true (the default), it calls rpcbroadcastsync directly without any gas-adequacy check or simulation. The alternative waitforconfirmation = false path does call simulatepaymentcall via ethcall, but that simulation omits the gas parameter and therefore does not catch out-of-gas conditions.
Impact A malicious client can drain the server's wallet without any financial cost.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
erlang/mppto a version that resolves this vulnerability.Fixed in 0.6.0
Event History
Frequently Asked Questions
Who is exposed to this issue?
Servers using mpp Elixir as the fee payer are exposed. A malicious client can submit transactions with an insufficient gas_limit, causing the server's fee-payer wallet to spend gas while the transaction reverts.
What does an attacker need to exploit it?
The attacker needs to act as a client and set gas_limit below the amount needed for execution. For the described transferWithMemo example on Tempo Moderato testnet, a limit of 51,298 gas causes an out-of-gas failure while approximately 51,299 gas is required to succeed.
Does the attacker need to pay for the failed transaction?
No. The described attack causes the server's fee-payer wallet to be charged for gas used, while the client pays nothing and receives no resource because the transaction state reverts.
What is the operational impact?
Attackers can repeatedly submit underfunded transactions, potentially using many clients in parallel, to drain the server wallet and deny service. The advisory describes this as a virtually zero-cost attack for the client apart from computing power.
What should be changed to prevent exploitation?
Validate that the client-provided gas_limit is sufficient before cosigning and broadcasting a transaction when the server pays fees. The provided references include a fix commit and a v0.6.0 release.