Rubicon — disclosed vulnerability reports and payouts

Every publicly disclosed and closed bug bounty report we hold for Rubicon, with our own summary of each finding and a link to the original disclosure.

Reports indexed
42
Total paid
$0
Critical
0
Largest payout
$0

This page collects the 42 closed, publicly disclosed Rubicon reports indexed on CoinBuggie. Nothing here is active or unpatched — every entry was published by the programme or the researcher after remediation.

The findings concentrate in Logic error, Front-running / MEV, Integer overflow / underflow, Reentrancy, Oracle manipulation, across EVM-Solidity. Reading a single protocol end to end is the fastest way to see which assumptions its codebase repeatedly gets wrong, which is usually a better predictor of where the next finding lives than the category alone.

Use the vulnerability class links below to compare these findings against the same bug class in other protocols.

What reviewers look for

  • Logic error findings disclosed against Rubicon
  • Front-running / MEV findings disclosed against Rubicon
  • Integer overflow / underflow findings disclosed against Rubicon
  • Reentrancy findings disclosed against Rubicon
  • Oracle manipulation findings disclosed against Rubicon

Curated highlights

The largest disclosed payouts in this group, with our own summary of each. Every report links back to the original disclosure.

mediumLogic errorEVM-Solidity$0

Rubicon: Rewards for initial period may be lost in `BathBuddy` contract

Rubicon's BathBuddy rewards contract starts accruing rewards the moment the owner calls notifyRewardAmount, which computes a per-second reward rate and sets the cycle's lastUpdateTime and periodFinish regardless of whether any BathTokens are circulating. Because the reward clock runs before any holder exists, the rewards emitted during that zero-supply prefix can never be attributed to anyone and remain permanently stranded in the contract. A verbatim Foundry PoC shows a participant joining at the midpoint of a 10,000-second cycle receiving only half the rewarded tokens while the other half stays locked in the BathBuddy contract. The economic impact is most significant when bootstrapping a newly created Bath pair, where the cycle starts before any holders exist.

Rubiconcode4renaFeb 17, 2025Open
highLogic errorEVM-Solidity$0

Rubicon: Wrong calculation of repayment amount in Position contract

Rubicon's Position wrapper computes a user's repayment obligation in borrowBalanceOfPos by taking the current borrowRatePerBlock and multiplying it by the number of blocks since the position was opened. Because borrowRatePerBlock is a function of the pool's live borrows and supply, the rate almost never stays constant over the lifetime of the loan, so this single-rate approximation over- or under-states the true accrued interest. In practice, when other users open leveraged positions after a borrower, the borrower is charged interest at the inflated current rate on close, causing more asset than necessary to be swapped to quote in the repayment path.

Rubiconcode4renaFeb 17, 2025Open
highLogic errorEVM-Solidity$0

Rubicon: When opening a position, the collateral of the previous position is used for borrowing, which makes the user more easily liquidated

Rubicon's Position.buyAllAmountWithLeverage lets the borrow loop for a new position include the leftover borrowable capacity (via _maxBorrow) of collateral already locked in a user's prior levered positions. Because that previously minted debt is counted again, a user who opens successive leveraged longs gets debt against collateral that never received fresh backing, silently pushing them toward the liquidation threshold. The reporter demonstrates that opening a 1.6x then a 1.8x WBTC long back-to-back drives the account's comptroller liquidity from [0, 9e16, 0] to [0, 0, 0], so any small price drop triggers liquidation. The maintainer acknowledged the over-borrowing as intended behavior, but the judge upheld the finding as High given the very high liquidation probability it creates.

Rubiconcode4renaFeb 17, 2025Open
mediumLogic errorEVM-Solidity$0

Rubicon: `Position` contract allows to interact with positions that are liquidated

Rubicon's Position helper lets a borrower add collateral to a lending position even after that position's collateral has already been liquidated. Because the position records its collateral quantity at creation and closePosition must redeem exactly that amount from the Position contract's own bathToken balance, a margin increase requested just after liquidation mints new bathTokens that can never be withdrawn — the redeem amount permanently exceeds what the contract holds. The confirmed result is that the additional collateral is locked forever, usable only as borrowing collateral, representing a direct loss for the user.

Rubiconcode4renaFeb 17, 2025Open
highLogic errorEVM-Solidity$0

Rubicon: DOS of market operations with malicious offers

Rubicon's orderbook fills trades by repeatedly pulling the best-priced offer from a price-sorted linked list inside buyAllAmount/sellAllAmount, but the offer() entry point never validates the owner or recipient addresses. A malicious maker can post a small, aggressively-priced order whose payout lands at the zero address; because standard OpenZeppelin ERC20s revert on zero-address transfers, that head offer becomes permanently unfillable and reverts the entire fill loop, DoSing every trade on the pair. The same poison blocks Position.sol, which can only fill via those two functions and cannot pick offers by id, so users are left unable to unwind before liquidation, and new matched-order creation in _matcho is also blocked. The protocol confirmed the issue, and after the warden supplied Arbitrum token data showing the dominant tokens all revert on zero-address transfers, the judge upgraded the severity from Medium to High.

Rubiconcode4renaFeb 17, 2025Open
mediumLogic errorEVM-Solidity$0

Rubicon: The return value of `buyAllAmount` is incorrect

Rubicon's `buyAllAmount` on the order-book `RubiconMarket` contract incorrectly deducts the trading fee twice when reporting the amount of pay tokens the caller spent. The loop computes `fill_amt` from the actual offer prices, but the final `calcAmountAfterFee(fill_amt)` pass subtracts the fee from the already-accumulated total, so the function returns a lower value than the real cost (e.g. 9,000 USDC reported instead of 10,000 spent at a 10% fee). Any integrator or downstream logic relying on this return value — such as checks against `max_fill_amount` — will base decisions on a fee-discounted figure that understates true spend. The judge upheld the finding as distinct from fee-calculation issues and confirmed the fix: stop applying the fee to the returned value.

Rubiconcode4renaFeb 17, 2025Open

All reports in this group

Vulnerability classes disclosed here

Related protocol pages