The malicious token contract called “FlurryRebaseUpkeep.performUpkeep()” rebases all vaults and updates multipliers for Rho Tokens.
The update is based on all strategies' balances.
The update was triggered in the process of a flashloan and the tokens borrowed from the Bank contract were not returned yet, the low balance led to a low multiplier.
The attacker returned the flashloan and finished the preparation transaction.
In the next transaction, the attacker deposited tokens with the low multiplier, updated the multiplier to a higher (normal) value, and withdrew the tokens with the high multiplier.
For example, in one of the transactions the multiplier was updated to 4.1598e35 (image 1) and in the next transaction, the multiplier was updated to 4.2530e35 (image 2)
Because the multiplier is one of the factors deciding the RhoToken balance, the attacker's RhoToken balance was increased in the transaction so they were able to withdraw more tokens than they deserve from the Vault.
The attacker repeated this process multiple times.
Note: Flurry Finance is a CertiK client but the exploit was caused by external dependencies.
• • •
Missing some Tweet in this thread? You can try to
force a refresh
The attacker called the `Bridge.deposit()` function to deposit 0.008 BNB to the contract `Bridge` connected to multiple chains including #BSC, #Ethereum, #Moonriver (twice).
The hacker called `deposit()` in the QBridge #eth contract w/o really making any deposit and emitted the Deposit event
The exploit was caused by `tokenAddress.safeTransferFrom` in QBridgeHandler.sol which didn't revert the tx when the tokenAddress is the 0x0.
2. The Ethereum QBridge captured the Deposit event and minted $qXETH for the hacker on #BSC.
The QBridge treats the Deposit event as an event of depositing #ETH because the `deposit` and `depositETH` methods in the #QBridge contract emit the same event.