# Citadel Finance: price manipulation in redeemCalculator drains funds

Citadel Finance's redeemCalculator priced CIT from manipulable WETH/USDC pool, letting an attacker flashloan 4500 WETH to inflate CIT redemption and drain ~$93K.

- Payout: Real-world hack
- Severity: high
- Program: CitadelFinance
- Analysis by: DeFiHackLabs
- Disclosed: 2024-01-27
- Write-up quality: 7/10
- Original: https://github.com/SunWeb3Sec/DeFiHackLabs/blob/main/src/test/2024-01/CitadelFinance_exp.sol
- Library page: https://bugbountylibrary.com/r/dhl%3A20240127-citadelfinance
- Tags: area:web3 domain:web3 impact:funds-loss kind:incident platform:defihacklabs sev:high tech:evm tech:solidity technique:chained vuln:flash-loan vuln:oracle-manipulation

**Target:** CitadelStaking/CitadelRedeem contracts on Arbitrum
**Root cause:** redeemCalculator and getCITInUSDAllFixedRates derive CIT/USD value from the spot state of the WETH/USDC Camelot pair, which an attacker can move with a large swap.
**Steps:**
1. Acquire CIT (e.g. `deal(address(CIT), address(this), 2653 * 1e18)`) and `CIT.approve(CitadelStaking, balance)`.
2. `CitadelStaking.deposit(address(CIT), balance, 1)` to stake at fixed rate 1.
3. Flashloan 4500 WETH from Uniswap V3 WETH/USDC pool via `WETH_USDC.flash(...)`.
4. In callback, `WETH.approve(CamelotRouter, borrowedWETHAmount)` and swap WETH->USDC on Camelot to crash WETH price / distort pool.
5. Query `CitadelStaking.redeemCalculator(address(this))` to get available CIT, and `getCITInUSDAllFixedRates` for USD value.
6. Call `CitadelRedeem.redeem(1, 0, redeemAmount, 1)` to redeem CIT at manipulated price.
7. Swap received USDC back to WETH via Camelot, repay flashloan plus fee, keep profit.
**How found:** Likely identified that redeemCalculator and getCITInUSDAllFixedRates read live pool reserves from the WETH/USDC pair, making redemption value spot-price dependent and flashloan-manipulable.
**Exploitation:** Attacker flashloaned 4500 WETH, dumped it into the WETH/USDC Camelot pair to manipulate the price used by Citadel's redeemCalculator, redeemed staked CIT for inflated USDC, swapped back to WETH, repaid the flashloan, and withdrew remaining CIT in a follow-up tx, netting ~$93K.
**Insight:** When a protocol's redemption or reward calculator reads a DEX pair's current reserves, test whether a large swap can skew the derived value; flashloan-funded swaps are the standard probe.
