# ParaSwap: stale DAI approval drained via crafted simpleSwap calldata

Stale DAI approval to ParaSwap Augustus let an attacker craft simpleSwap exchangeData calling DAI.move to drain ~2,299 DAI from an approved account.

- Payout: Real-world hack
- Severity: high
- Program: ParaSwapDAIApproval
- Credited: DeFiHackLabs
- Disclosed: 2025-06-25
- Write-up quality: 7/10
- Original: https://github.com/SunWeb3Sec/DeFiHackLabs/blob/main/src/test/2025-06/ParaSwapDAIApproval_exp.sol
- Library page: https://bugbountylibrary.com/r/dhl%3A20250625-paraswapdaiapproval
- Tags: domain:web3 impact:funds-loss kind:incident platform:defihacklabs sev:high tech:evm tech:solidity technique:source-review vuln:access-control vuln:business-logic vuln:flash-loan

**Target:** ParaSwap AugustusSwapper simpleSwap router
**Root cause:** simpleSwap accepts caller-supplied callees and exchangeData executed as ParaSwap; a victim's stale DAI approval to Augustus lets arbitrary DAI.move calls drain their balance.
**Steps:**
1. Flash-borrow 1000 wei WETH from Balancer Vault.
2. Approve ParaSwap TokenTransferProxy for the WETH.
3. Build SimpleData with fromToken=WETH, toToken=DAI, callees=[WETH, DAI, DAI] and exchangeData concatenating `transfer(BalancerVault,1000)`, `move(victim, Augustus, amount-1)`, `move(victim, Augustus, 1)`.
4. Set startIndexes [0,68,168,268], beneficiary=attacker, expectedAmount=DAI_DRAIN_AMOUNT.
5. Call `simpleSwap(data)`; router executes DAI.move as ParaSwap, pulling victim's approved DAI, then forwards to beneficiary.
6. Repay Balancer flash loan with the WETH transfer; keep ~2,299 DAI profit.
**How found:** Likely spotted that simpleSwap's exchangeData is arbitrary calldata executed by Augustus, and that DAI.move runs as the router, so any lingering DAI approval to Augustus is drainable.
**Exploitation:** Attacker needs only a victim with a stale DAI allowance to ParaSwap Augustus. Flash loan supplies the fromToken; crafted exchangeData repays the loan and issues DAI.move calls that execute under ParaSwap's identity, moving victim DAI to Augustus and out to the attacker's beneficiary.
**Insight:** DEX routers that execute caller-supplied callee/exchangeData arrays inherit every token approval ever granted to them; check whether arbitrary selectors (e.g. token move/transferFrom) can be smuggled into exchangeData to spend stale allowances.
