Oracle manipulation vulnerabilities in disclosed bug bounty reports
When a protocol trusts a price it cannot defend, an attacker moves the price instead of attacking the protocol.
- Reports indexed
- 92
- Total paid
- $900k
- Critical
- 1
- Largest payout
- $900k
Oracle manipulation is rarely a bug in the oracle. It is a bug in what the consuming protocol is willing to believe. A lending market that reads a spot price from a thin pool, a vault that values its own LP token by calling the pool it is inside of, a liquidation engine that never checks how old a Chainlink round is — all of these are sound contracts fed bad numbers.
The payouts in this class cluster around two mistakes. The first is using an instantaneous value where a time-weighted or multi-source value belongs. The second is failing every safety rail the oracle already provides: unchecked staleness, ignored round completeness, no deviation bound, and no fallback when the primary feed reverts.
Because oracle bugs are about integration rather than implementation, they surface disproportionately in reports against lending protocols and structured-product vaults built on top of otherwise well-audited primitives.
What reviewers look for
- Spot reserves or `getAmountsOut` used as a price source
- Missing staleness, round-completeness or deviation checks on a push feed
- LP token valuation derived from the pool's own current reserves
- A single feed with no fallback and no circuit breaker
- Prices sourced from a pool shallow enough to move within one transaction
Curated highlights
The largest disclosed payouts in this group, with our own summary of each. Every report links back to the original disclosure.
Spot TWAP oracle manipulated via single-block flash loan
A perpetual derivatives protocol relied on a Uniswap V3 TWAP oracle whose pool observation cardinality was capped at 12, severely reducing its intended 30-second time-weighted average window. An attacker executed a single-block flash loan to heavily distort the underlying spot price without triggering any secondary price feed validation. This allowed the attacker to open oversized leveraged positions at an artificial mark price and force liquidations against counterparties in a single atomic transaction.
BendDAO: Major insolvency risk in `LiquidationLogic::executeCrossLiquidateERC721()` due to not setting a maximum liquidation price
The BendDAO lending protocol suffers from an insolvency risk during market downturns due to a flawed liquidation pricing mechanism in its cross-liquidation logic. Because the protocol calculates the required repayment by dividing total debt by the number of collateral tokens without applying a maximum price cap, the cost for liquidators to repay the debt can exceed the market value of the underlying NFTs. This makes liquidations unprofitable during periods of high volatility or asset price drops, effectively blocking the system from shedding bad debt and shifting the burden of loss to the DAO treasury.
BendDAO: No check if Arbitrum/Optimism L2 sequencer is down in Chainlink feeds `PriceOracle.sol`
The BendDAO protocol fails to verify the operational status of the L2 sequencer when fetching price data from Chainlink feeds. In the event of sequencer downtime, oracle data becomes stale, yet the protocol continues to use these outdated prices for core lending operations. This deficiency creates a significant risk where users could borrow against or evade liquidation for collateral that has substantially lost value, as the protocol's accounting remains unaware of the real-time price drops.
BendDAO: Updating asset collateral params can lead to liquidate borrowers arbitrarily
The protocol's health factor calculation is susceptible to immediate, retroactive changes via administrative parameter updates. By updating the liquidationThreshold and collateralFactor for a given asset to zero, an administrator can instantaneously render existing, healthy borrow positions liquidatable. This occurs because the smart contract checks the current configuration values at the time of health factor calculation rather than using parameters fixed at the time the loan was initiated, enabling liquidators to profit from unsuspecting borrowers.
BendDAO: PriceOracle has invalid checks on price staleness
The BendDAO PriceOracle fails to adequately validate the freshness of Chainlink oracle price data, relying on an insufficient non-zero timestamp check and a deprecated round-tracking variable. This allows the protocol to accept stale price updates that may deviate significantly from current market prices. If a price feed stops updating, the protocol will continue to operate on obsolete data, potentially leading to incorrect collateral valuation or allowing for the manipulation of liquidations to an attacker's advantage.
BendDAO: `isolateRedeem()` revert in case Revert-on-zero-value-transfers tokens
BendDAO's `isolateRedeem` functionality can be bricked if the protocol's bid fine parameters are set to zero and the loan asset used is a token that reverts on zero-value transfers. When these conditions are met, any attempt by a borrower to redeem their loan from an active auction will trigger a transaction revert, as the contract attempts to transfer a zero-value fine to the auction bidder. This effectively prevents users from recovering their collateral until the auction concludes or the protocol configuration is updated.
All reports in this group
- Optimism: An attacker can bypass the challenge period during LPP finalizationOracle manipulation$0
- Optimism: LPP metadata can be altered after the challenge period is over, allowing incorrect states to be provenOracle manipulation$0
- Optimism: The LPP challenge period can cause malicious and freeloader claims to be uncounterable and can also cause freeloader claims to be abused to entrap honest challengersOracle manipulation$0
- Optimism: L2 precompile calls can be impossible to reproduce on L1Oracle manipulation$0
- Predy: Incorrect price for negative ticks due to lack of rounding downOracle manipulation$0
- Predy: Liquidity manipulation is possible when tradingOracle manipulation$0
- Predy: Chainlink's `latestRoundData` might return stale or incorrect resultsOracle manipulation$0
- Predy: Liquidators can bypass remaining negative margin check and leave the loss to the protocolOracle manipulation$0
- Predy: PriceFeed does not return to the correct price for quote pairsOracle manipulation$0
- BakerFi: `ETHOracle.getLatestPrice` needs to convert to 18 decimalsOracle manipulation$0
- BakerFi: Multiple swap lack slippage protectionOracle manipulation$0
- BakerFi: Min and maxAnswer never checked for oracle price feedOracle manipulation$0
- Panoptic: `PanopticFactory` uses spot price when deploying new pools, resulting in liquidity manipulation when mintingOracle manipulation$0
- Panoptic: `_validatePositionList()` does not check for duplicate tokenIds, allowing attackers to bypass solvency checksOracle manipulation$0
- DYAD: Liquidation bonus logic is wrongOracle manipulation$0
- DYAD: Unable to withdraw Kerosene from `vaultmanagerv2::withdraw` as it expects a `vault.oracle()` method which is missing in Kerosene vaultsOracle manipulation$0
- DYAD: Attacker can make `0` value `deposit()` calls to deny user from redeeming or withdrawing collateralOracle manipulation$0
- DYAD: Value of kerosene can be manipulated to force liquidate usersOracle manipulation$0
- DYAD: User can get their Kerosene stuck because of an invalid check on withdrawOracle manipulation$0
- DYAD: Design flaw and mismanagement in vault licensing leads to double counting in collateral ratios and positions collateralized entirely with kerosineOracle manipulation$0
- DYAD: Missing enough exogenous collateral check in `VaultManagerV2::liquidate` makes the liquidation revert even if (DYAD Minted `>` Non Kerosene Value)Oracle manipulation$0
- DYAD: Kerosene collateral is not being moved on liquidation, exposing liquidators to lossOracle manipulation$0
- Renzo: Withdrawals of rebasing tokens can lead to insolvency and unfair distribution of protocol reservesOracle manipulation$0
- Renzo: `calculateTVL` may run out of gas for modest number of operators and tokens breaking deposits, withdrawals, and tradesOracle manipulation$0
- Renzo: The amount of `xezETH` in circulation will not represent the amount of `ezETH` tokens 1:1Oracle manipulation$0
- Renzo: Incorrect calculation of queued withdrawals can deflate TVL and increase ezETH mint rateOracle manipulation$0
- Renzo: Fixed hearbeat used for price validation is too stale for some tokensOracle manipulation$0
- Renzo: stETH/ETH feed being used opens up to 2 way `deposit<->withdrawal` arbitrageOracle manipulation$0
- Renzo: Incorrect exchange rate provided to Balancer poolsOracle manipulation$0
- Renzo: Lack of slippage and deadline during withdraw and depositOracle manipulation$0
- Lavarage: A borrower can borrow SOL without backing it by a collateralOracle manipulation$0
- Revert Lend: `_getReferencePoolPriceX96()` will show incorrect price for negative tick deltas in current implementation cause it doesn't round up for themOracle manipulation$0
- Revert Lend: Large decimal of `referenceToken` causes overflow at oracle price calculationOracle manipulation$0
- Revert Lend: Tokens can't be removed as a collateral without breaking liquidations and other core functionsOracle manipulation$0
- Revert Lend: Lack of safety buffer in `_checkLoanIsHealthy` could subject users who take out the max loan into a forced liquidationOracle manipulation$0
- Revert Lend: Users cannot stop loss in AutoRange and AutoExitOracle manipulation$0
- Revert Lend: `V3Oracle` susceptible to price manipulationOracle manipulation$0
- AI Arena: Can mint NFT with the desired attributes by reverting transactionOracle manipulation$0
- Abracadabra Money: Oracle price can be manipulatedOracle manipulation$0
- Abracadabra Money: Pool Creation Failure Due to WETH Transfer Compatibility Issue on Some ChainsOracle manipulation$0
- Abracadabra Money: Anyone making use of the MagicLP's TWAP to determine token prices will be exploitable.Oracle manipulation$0
- Abracadabra Money: Missing Return Statement in `_getReserves` Function in `MagicLpAggregator` ContractOracle manipulation$0
- Abracadabra Money: `MagicLpAggregator` can be incompatible with potential integrators due to incorrect `latestRoundData` functionOracle manipulation$0
- Abracadabra Money: MagicLpAggregator doesn't consider the dcimal of MagicLPOracle manipulation$0
- Abracadabra Money: MagicLpAggregator always returns lower than correct answer, leading to arbitrage lossOracle manipulation$0
- Wise Lending: User can erase their position debt for freeOracle manipulation$0
- Wise Lending: The protocol allows borrowing small positions that can create bad debtOracle manipulation$0
- Wise Lending: Exiting a farm on mainnet assumes a peg of `1:1` when swapping stETH for ETHOracle manipulation$0
- Wise Lending: Liquidators can pay less than required to completely liquidate the private collateral balance of an uncollateralized positionOracle manipulation$0
- Wise Lending: Incorrect bad debt accounting can lead to a state where the `claimFeesBeneficial` function is permanently bricked and no new incentives can be distributed, potentially locking pending and future protocol fees in the `FeeManager` contractOracle manipulation$0
- Wise Lending: Liquidating chaining can be achieved by liquidating token collateral with the highest `collateralFactor`Oracle manipulation$0
- Wise Lending: Current heartbeat implementation may lead to a prolonged DoS for Chainlink OraclesOracle manipulation$0
- Wise Lending: Off-by-one bug prevents the `_compareMinMax()` from detecting Chainlink aggregators' circuit-breaking eventsOracle manipulation$0
- Wise Lending: `PendlePowerManager` is incompatible with `PendleRouterV3`Oracle manipulation$0
- Ondo Finance: `OUSGInstantManager` will allow excessive `OUSG` token minting during `USDC` depeg eventOracle manipulation$0
- Amphora Protocol: When Convex pool is shut down while collateral type is `CurveLPStakedOnConvex`, users unable to deposit that asset and protocol lose the ability to accept the asset as collateral furtherOracle manipulation$0
- Salty.IO: Minimium Collateral Check Can Be BypassedOracle manipulation$0
- Salty.IO: Adversary can prevent updating price feed addresses by creating poisonous proposals ending in `_confirm`Oracle manipulation$0
- Salty.IO: If there is only one USDS borrower, he can never be liquidatedOracle manipulation$0
- Salty.IO: Incorrect calculation to check remaining ratio after reward in StableConfig.solOracle manipulation$0
- Salty.IO: Attacker Can Inflate LP Position Value To Create a Bad Debt LoanOracle manipulation$0
- Salty.IO: formPOL lacks slippage and deadline protectionOracle manipulation$0
- Salty.IO: Attacker can take advantage of Chainlink price not occuring within it's 60 minute heartbeat to make PriceAggregator calls failOracle manipulation$0
- PoolTogether: `yieldFeeBalance` wouldn't be claimed after calling `transferTokensOut()`Oracle manipulation$0
- INIT Capital: API3 oracle timestamp can be set to future timestamp and block API3 Oracle usage to make code revert in underflowOracle manipulation$0
- NextGen: The `RandomizerVRF` and `RandomizerRNG` do not produce hash value.Oracle manipulation$0
- Open Dollar: Decimal Limitation in CamelotRelayer and UniV3Relayer Contract DeploymentOracle manipulation$0
- Open Dollar: Unable to retrieve price information with CamelotRelayer contractOracle manipulation$0
- Kelp DAO: Update in strategy will cause wrong issuance of sharesOracle manipulation$0
- Kelp DAO: The price of rsETH could be manipulated by the first stakerOracle manipulation$0
- Wildcat Protocol: Blocked accounts keep earning interest contrary to the WhitePaperOracle manipulation$0
- Tapioca DAO: User's assets can be stolen when removing them from the Singularity market through the Magnetar contractOracle manipulation$0
- Tapioca DAO: Incorrect liquidation reward computation causes excess liquidator rewards to be givenOracle manipulation$0
- Tapioca DAO: Magnetar contract has no approval checkingOracle manipulation$0
- Tapioca DAO: Liquidation transactions can potentially fail for all marketsOracle manipulation$0
- Tapioca DAO: The amount of debt removed during `liquidation` may be worth more than the account's collateralOracle manipulation$0
- Tapioca DAO: Anybody can buy collateral on behalf of other users without having any allowance using the multiHopBuyCollateral()Oracle manipulation$0
- Tapioca DAO: Attacker can prevent rewards from being issued to gauges for a given epoch in TapiocaOptionBrokerOracle manipulation$0
- Maia DAO Ecosystem: Use of `slot0` to get `sqrtPriceLimitX96` can lead to price manipulation.Oracle manipulation$0
- Maia DAO Ecosystem: Branch Strategies lose yield due to wrong implementation of time limit in `BranchPort.sol`Oracle manipulation$0
- Lybra Finance: Lack of timelock on `rigidRedemption`, enables to steal yield from other usersOracle manipulation$0
- Asymmetry Finance: Staking, unstaking and rebalanceToWeight can be sandwiched (Mainly rETH deposit)Oracle manipulation$0
- Asymmetry Finance: Reth `poolPrice` calculation may overflowOracle manipulation$0
- Asymmetry Finance: Price of sfrxEth derivative is calculated incorrectlyOracle manipulation$0
- Asymmetry Finance: `WstEth` derivative assumes a `~1=1` peg of stETH to ETHOracle manipulation$0
- Asymmetry Finance: Possible DoS on `unstake()`Oracle manipulation$0