# Convergence: unvalidated claim return mints CVG rewards

Convergence's CvxRewardDistributor trusted a caller-supplied staking contract's claimCvgCvxMultiple return value, letting an attacker mint ~200K USD of CVG.

- Payout: Real-world hack
- Severity: high
- Program: Convergence
- Credited: DeFiHackLabs
- Disclosed: 2024-08-01
- Write-up quality: 6/10
- Original: https://github.com/SunWeb3Sec/DeFiHackLabs/blob/main/src/test/2024-08/Convergence_exp.sol
- Library page: https://bugbountylibrary.com/r/dhl%3A20240801-convergence
- Tags: domain:web3 impact:funds-loss kind:incident platform:defihacklabs sev:high tech:evm tech:solidity technique:source-review vuln:accounting-error vuln:business-logic vuln:reward-distribution

**Target:** CvxRewardDistributor.claimMultipleStaking on Ethereum mainnet
**Root cause:** claimMultipleStaking accepts an arbitrary array of ICvxStakingPositionService contracts and trusts the uint256 amount returned by claimCvgCvxMultiple without verifying the contract is a legitimate staking position or that the amount corresponds to real rewards.
**Steps:**
1. Deploy `Mock` implementing `claimCvgCvxMultiple(address)` returning `type(uint256).max - CVG.totalSupply()` and an empty TokenAmount[].
2. Build `claimContracts = [address(mock)]`.
3. Call `cvxRewardDistributor.claimMultipleStaking(claimContracts, address(this), 1, true, 1)`.
4. Distributor mints/transfers CVG based on the fake returned amount; attacker receives ~200K USD of CVG.
**How found:** Likely source review of claimMultipleStaking noticing the claimContracts array is caller-controlled and the returned amount is used directly for reward calculation without whitelisting or sanity checks.
**Exploitation:** Attacker deployed a malicious contract returning a near-max uint256 from claimCvgCvxMultiple, passed it as the sole claim contract to claimMultipleStaking, and received CVG tokens valued at ~200K USD, then swapped via Curve CVG/ETH and CVG/FRAX pools.
**Insight:** In reward-distributor designs, any function taking a caller-supplied contract array and trusting its return value is a mint primitive; check whether claim contracts are whitelisted or amounts are cross-checked against on-chain stake balances.
