VDB
Sign up
MEDIUM

GHSA-727h-3vm5-qwq6

mppx: Gas Draining with padding

Quick fix

GHSA-727h-3vm5-qwq6 — mppx: upgrade to the fixed version with the command below.

npm install mppx@0.8.2

Details

### Details When the server acts as the fee_payer, `mppx` 0.6.27 validates calldata using viem's `decodeFunctionData`, which is lenient about trailing bytes. The `FeePayerPolicy` caps `gas_limit` (≤ 2 M) and `max_fee_per_gas` (≤ 100 Gwei) but does **not** check calldata length.

Tempo uses legacy calldata gas pricing: **16 gas per non-zero byte**. Appending `N` bytes of `0x01` padding inflates actual gas used by `N × 16` while keeping `gas_limit` and `max_fee_per_gas` within policy caps. The server cosigns and broadcasts the padded transaction, draining its fee-payer wallet.

**Vulnerable code path:** `FeePayerPolicy` in `fee-payer.ts` (mppx 0.6.27) enforces `maxGas = 2_000_000` and `maxFeePerGas = 100 Gwei` but has no `calldata.length` bound. The policy check passes because the inflated gas comes from intrinsic calldata cost, not the declared `gas_limit`.

**Note:** In the experiment, a 16 KB `max_header_length` is enforced, which caps the maximum effective padding at roughly 5,500 bytes. The default padding in this PoC (5,500 bytes) is within that limit.

### 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: ```bash unzip mppx_typescript_PoC.zip cd mppx_typescript docker build -t mppx-padding . docker run --rm mppx-padding ``` There are more details in `mppx_typescript/README.md`

### Impact A malicious client can force the server to pay ~**5x** the normal transaction fee. This dramatically increases operational costs and completely destroys the profit margin on low-cost items.

Please provide a way to share the PoC in .zip format to you. Thank you!

Are you affected?

Enter the version of the package you're using.

Affected packages

npm/mppx
Introduced in: 0Fixed in: 0.8.2
Fixnpm install mppx@0.8.2

References