背景
造成本次攻击的原因是关键函数的鉴权不当,使得任意用户可以设置关键的变量值,从而导致攻击的发生。
被攻击合约:https://www.bscscan.com/address/0xe9bc03ef08e991a99f1bd095a8590499931dcc30
合约目录:
contract
├─autocompound
│ AutocompundStaking.sol
│
├─base
│ BaseStaking.sol // stake 和 withdraw
│ MintableSupplyStaking.sol
│ TaxedStaking.sol
│
├─lib
│ StakingUtils.sol
│
├─presets
│ MintableAutoCompundRelockBonus.sol // 被攻击合约
│
└─timelock
FixedTimeLockStaking.sol
RelockBonusStaking.sol
StaticFixedTimeLockStaking.sol
更多信息: DeFi Hacks Analysis@Sun @XREX security team
漏洞分析
MintableAutoCompundRelockBonus.setToken
函数功能权限设置不当,任意用户可以修改结构体 configuration
中的 stakingToken
与 rewardsToken
参数。
struct StakingConfiguration {
uint256 rewardRate;
uint256 startTime;
uint256 minStake;
uint256 maxStake;
ERC20 stakingToken;
ERC20 rewardsToken;
}
攻击过程
-
创建一个
fakeToken
; -
调用
setToken
函数将stakingToken
与rewardsToken
设为攻击者创建的fakeToken
; -
调用
stake
函数,向MintableAutoCompundRelockBonus
合约转入fakeToken
;。此时_balances[msg.sender]
将会记录攻击者存入的fakeToken
数量; -
调用
setToken
函数将stakingToken
与rewardsToken
设为HPAY
; -
调用
withdraw
函数,从MintableAutoCompundRelockBonus
合约转出HPAY
。此时合约根据先前步骤3
中存入fakeToken
所记录的_balances[msg.sender]
进行提款操作,实际提出的是HPAY
。
后记
好了,漏洞很简单是吧。那不重要,随它吧。最近这段时间没什么干劲,十一月中旬了,还没拿到 offer,还没拿到 offer,还没拿到 offer。什么都没确定,什么都说不准。寒气元年的应届毕业生,躺在砧板上。可以确定的是我已经厌倦了当前的状态了,我的热情也将要燃烧殆尽了。这好像也不重要,随它吧。摆!
标签:分析,uint256,MintableAutoCompundRelockBonus,sol,漏洞,fakeToken,HPAY,rewardsToken From: https://www.cnblogs.com/ACaiGarden/p/16872933.html