【漏洞分析】Vestra DAO 攻擊事件:這個質押項目它取款不核銷呀
背景信息
攻擊交易:https://app.blocksec.com/explorer/tx/eth/0x9a1d02a7cb9fef11fcec2727b1f9e0b01bc6bcf5542f5b656c84d6400a1b4604
漏洞合約:https://etherscan.io/address/0x8a30d684b1d3f8f36b36887a3deca0ef2a36a8e3#code
LockedStaking 合約提供質押功能,用戶調用 stake 函數質押時會根據質押時長立即計算收益 yield,并且記錄在用戶的收益 user.yield 上。等到該筆質押的時間過后,用戶可以調用 unStake 函數取回本金和收益。
Trace 分析
攻擊者不斷用同一筆資金進行 start 和 unStake 操作,攻擊者創建新合約 strat 存入 500000 VSTR,然后通過 0x1f2c 合約 調用 unStake 取回 520000 VSTR。

start 操作就是通過新創建的合約進行 stake

漏洞分析
問題出在 LockedStaking 合約的 unStake 函數,unStake 函數對質押的狀態檢查與更新存在問題,導致在用戶的質押到期后,可以無限次進行取款。
require檢查的user.stakeAmount參數,在unstake操作后不更新- 在
unstake操作后更新的user.isActive參數,卻不檢查。

那么攻擊者可以無限次 unstake 來獲取 VSTR,為什么還需要創建新合約進行 stake 操作呢?
因為在 unstake 的時候會更新 data.totalStaked -= stakeAmount; ,如果不創建新合約進行 stake 操作增加 data.totalStaked 的值,就會發生下溢出。



浙公網安備 33010602011771號