Astrid Finance Hack

Reported loss $228K
Ethereum
Withdraw Function Argument Manipulation

What happened

On October 28, 2023, an attacker drained about 64.2 stETH, 39.2 rETH and 20 cbETH from Astrid Finance, a liquid restaking pool on Ethereum, in a single transaction. The loss was about 127.8 ETH, roughly $228,000. The pool's withdraw() function accepted any caller-supplied address as the restaked token and trusted that contract to say which real asset to release and how much.

The attacker deployed three fake tokens that pointed at the pool's real LST reserves, withdrew with them, claimed the real tokens, and swapped everything to ETH. Astrid paused the contracts, snapshotted holders and promised full refunds. After an on-chain bounty offer and a legal deadline, the attacker returned about 80% (roughly $182,000) and kept 20% as a bounty.

How it happened

  1. For each of stETH, rETH and cbETH, the attacker deployed a fake ERC-20. Its stakedTokenAddress() returned the real LST, and its scaledBalanceToBalance() returned the pool's entire balance of that LST.
  2. The attacker called withdraw(_restakedTokenAddress, amount) on the Astrid pool, passing the fake token's address. The pool did not check the address against its own restaked tokens. It took the fake token's answers and queued a withdrawal of the real LST.
  3. The attacker called claim() for each queued withdrawal and received the pool's stETH, rETH and cbETH.
  4. In the same transaction, they swapped stETH to ETH through the Curve stETH pool and rETH and cbETH through Uniswap V3, ending with about 127.8 ETH.

Protocol details

Classification Protocol Logic / Input Validation
Protocol Type DeFi Protocol

Build your security review skills

Work through hands-on labs covering real exploit mechanics, review techniques, and defensive patterns.