# Dumbo: repeatable distributor calls inflate staking rewards

Dumbo's public distributor could be called repeatedly, compounding reward minting into staked DUM, then unstaked and sold for 628 BUSD profit.

- Payout: Real-world hack
- Severity: high
- Program: Dumbo
- Credited: DeFiHackLabs
- Disclosed: 2025-05-25
- Write-up quality: 6/10
- Original: https://github.com/SunWeb3Sec/DeFiHackLabs/blob/main/src/test/2025-05/Dumbo_exp.sol
- Library page: https://bugbountylibrary.com/r/dhl%3A20250525-dumbo
- Tags: domain:web3 impact:funds-loss kind:incident platform:defihacklabs sev:high tech:evm tech:solidity technique:chained vuln:business-logic vuln:flash-loan vuln:reward-distribution

**Target:** BSC staking/distributor contracts (DUM/sDUM)
**Root cause:** The distributor's distribute() is externally callable without rate limiting, so rewards can be minted repeatedly and compounded into the staking path within one transaction.
**Steps:**
1. Flash-swap 6900 BUSD from Ape WBNB/BUSD pair via `swap(0, 6900e18, this, "Gogogo")`
2. In pancakeCall, swap BUSD to DUM on Pancake router and approve staking
3. Stake DUM via `stake(balance, this)`
4. Call distributor `distribute()` 1950 times to compound rewards
5. Call `rebase()` 3 times, then unstake all sDUM via selector `0x9ebea88c`
6. Repeat stake/distribute/rebase/unstake cycle a second time
7. Sell inflated DUM back to BUSD in 3 chunks
8. Repay 6915 BUSD to flash pair, forward profit
**Exploitation:** Attacker flash-borrows BUSD, buys DUM, stakes it, then loops the permissionless distributor.distribute() 1950x per cycle to mint compounded rewards into the staking path, rebases, unstakes, and dumps inflated DUM for BUSD, repaying the flash loan and keeping ~628 BUSD.
**Insight:** Permissionless reward-distribution functions that mint into a stake the caller controls are compoundable in a single tx; check whether distribute()/rebase() can be looped to inflate a caller-owned position before unstaking.
